diff --git a/db/packet_db.txt b/db/packet_db.txt index 045cc83d6ea..da198a4cf53 100644 --- a/db/packet_db.txt +++ b/db/packet_db.txt @@ -1785,7 +1785,7 @@ packet_ver: 31 //2012-06-18 packet_ver: 32 -0x0983,29 +0x0983,29 // ZC_MSG_STATE_CHANGE3 0x0861,41,bookingregreq,2:4:6 //actually 12-05-03 //2012-07-02aRagexeRE (unstable) @@ -1815,7 +1815,7 @@ packet_ver: 34 0x0363,6,ticksend,2 0x0365,12,searchstoreinfolistitemclick,2:6:10 0x0438,6,dropitem,2:4 -0x0447,2,booking_playcancel,0 +0x0447,2,booking_playcancel,0 // CZ_BLOCKING_PLAY_CANCEL 0x044A,6,clientversion,2 0x0844,2,cashshopopen,0 0x0849,16 //clif_cashshop_result @@ -1867,11 +1867,16 @@ packet_ver: 34 0x0995,-1 //store itemlist normal 0x0996,-1 //store itemlist equip 0x0997,-1 //ZC_EQUIPWIN_MICROSCOPE_V5 -0x0998,8,equipitem,2:4 +0x0998,8,equipitem,2:4 // CZ_REQ_WEAR_EQUIP_V5 0x0999,11 // cz_wear_equipv5 0x099a,9 // take_off_equipv5 0x099b,8 //maptypeproperty2 +// New Packets +0x08ff,24 // ZC_EFST_SET_ENTER +0x0984,28 // ZC_EFST_SET_ENTER2 +0x099f,22 // ZC_SKILL_ENTRY4 + //2013-05-15aRagexe (Yommy) packet_ver: 35 0x0369,7,actionrequest,2:6 @@ -2205,6 +2210,9 @@ packet_ver: 44 0x09B8,6,bankclose,2 0x09B9,4,ZC_ACK_CLOSE_BANKING,2 +//2013-07-31cRagexe +0x09ca,23 //ZC_SKILL_ENTRY5 + //2013-08-07Ragexe packet_ver: 45 0x0369,7,actionrequest,2:6 diff --git a/db/pre-re/skill_unit_db.txt b/db/pre-re/skill_unit_db.txt index 9031c3f2ed7..0632bcfb41e 100644 --- a/db/pre-re/skill_unit_db.txt +++ b/db/pre-re/skill_unit_db.txt @@ -156,7 +156,7 @@ 2490,0xea, , 0, 1,1000,enemy, 0x002 //GN_HELLS_PLANT 2555,0x104, , 0, 1:2:2:3:3,500,enemy,0x6 //RL_B_TRAP -2567,0xe7, , -1, 0,1000,enemy, 0x98 //RL_FIRE_RAIN +2567,0x105, , -1, 0,1000,enemy, 0x98 //RL_FIRE_RAIN 3006,0x86, , 0, 1,1000,enemy, 0x018 //KO_BAKURETSU 3008,0x86, , 0, 1:1:1:1:1:1:1:1:1:2,1000,enemy, 0x018 //KO_MUCHANAGE diff --git a/db/re/skill_unit_db.txt b/db/re/skill_unit_db.txt index 7605544ac68..fe9825ad831 100644 --- a/db/re/skill_unit_db.txt +++ b/db/re/skill_unit_db.txt @@ -158,7 +158,7 @@ 2490,0xea, , 0, 1,1000,enemy, 0x002 //GN_HELLS_PLANT 2555,0x104, , 0, 1:2:2:3:3,500,enemy,0x6 //RL_B_TRAP -2567,0xe7, , -1, 0,1000,enemy, 0x98 //RL_FIRE_RAIN +2567,0x105, , -1, 0,1000,enemy, 0x98 //RL_FIRE_RAIN 3006,0x86, , 0, 1,1000,enemy, 0x018 //KO_BAKURETSU 3008,0x86, , 0, 1:1:1:1:1:1:1:1:1:2,1000,enemy, 0x018 //KO_MUCHANAGE diff --git a/src/map/clif.c b/src/map/clif.c index 99315b2be05..6f1279b4f31 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -4303,6 +4303,7 @@ static int clif_calc_walkdelay(struct block_list *bl,int delay, char type, int64 /// Sends a 'damage' packet (src performs action on dst) /// 008a .L .L .L .L .L .W
.W .B .W (ZC_NOTIFY_ACT) /// 02e1 .L .L .L .L .L .L
.W .B .L (ZC_NOTIFY_ACT2) +/// 08c8 .L .L .L .L .L .L .B
.W .B .L (ZC_NOTIFY_ACT3) //! TODO /// type: /// 0 = damage [ damage: total damage, div: amount of hits, damage2: assassin dual-wield damage ] /// 1 = pick up item @@ -4507,72 +4508,108 @@ void clif_getareachar_item(struct map_session_data* sd,struct flooritem_data* fi WFIFOSET(fd,packet_len(0x9d)); } +/// Notifes client about Graffiti +/// 01c9 .L .L .W .W .B .B .B .80B (ZC_SKILL_ENTRY2) +static void clif_graffiti(struct block_list *bl, struct skill_unit *unit, enum send_target target) { + unsigned char buf[128]; + + nullpo_retv(bl); + nullpo_retv(unit); + WBUFW(buf, 0) = 0x1c9; + WBUFL(buf, 2) = unit->bl.id; + WBUFL(buf, 6) = unit->group->src_id; + WBUFW(buf,10) = unit->bl.x; + WBUFW(buf,12) = unit->bl.y; + WBUFB(buf,14) = unit->group->unit_id; + WBUFB(buf,15) = 1; + WBUFB(buf,16) = 1; + safestrncpy((char*)WBUFP(buf,17),unit->group->valstr,MESSAGE_SIZE); + clif_send(buf,packet_len(0x1c9),bl,target); +} /// Notifies the client of a skill unit. /// 011f .L .L .W .W .B .B (ZC_SKILL_ENTRY) -/// 01c9 .L .L .W .W .B .B .B .80B (ZC_SKILL_ENTRY2) /// 08c7 .W L .L .W .W .B .W .B (ZC_SKILL_ENTRY3) /// 099f .W L .L .W .W .L .W .B (ZC_SKILL_ENTRY4) -static void clif_getareachar_skillunit(int type,struct map_session_data *sd, struct skill_unit *unit) -{ - int fd = sd->fd; - int header=0, unit_id=0, pos=0; +/// 09ca .W L .L .W .W .L .B .B .B (ZC_SKILL_ENTRY5) +void clif_getareachar_skillunit(struct block_list *bl, struct skill_unit *unit, enum send_target target) { + int header = 0, unit_id = 0, pos = 0, fd = 0, len = -1; + unsigned char buf[128]; + + nullpo_retv(bl); + nullpo_retv(unit); + + if (bl->type == BL_PC) + fd = ((TBL_PC*)bl)->fd; - if( unit->group->state.guildaura ) + if (unit->group->state.guildaura) return; + if (battle_config.traps_setting&1 && skill_get_inf2(unit->group->skill_id)&INF2_TRAP) - unit_id=UNT_DUMMYSKILL; //Use invisible unit id for traps. + unit_id = UNT_DUMMYSKILL; //Use invisible unit id for traps. + else if (unit->group->state.song_dance&0x1 && unit->val2&UF_ENSEMBLE) + unit_id = unit->val2&UF_SONG ? UNT_DISSONANCE : UNT_UGLYDANCE; else if (skill_get_unit_flag(unit->group->skill_id) & UF_RANGEDSINGLEUNIT && !(unit->val2 & UF_RANGEDSINGLEUNIT)) - unit_id=UNT_DUMMYSKILL; //Use invisible unit id for other case of rangedsingle unit + unit_id = UNT_DUMMYSKILL; //Use invisible unit id for other case of rangedsingle unit else - unit_id=unit->group->unit_id; + unit_id = unit->group->unit_id; #if PACKETVER >= 3 - if(unit->group->unit_id==UNT_GRAFFITI) // Graffiti [Valaris] - type = 2; + if (unit_id == UNT_GRAFFITI) { // Graffiti [Valaris] + clif_graffiti(bl, unit, target); + return; + } #endif - switch(type){ - case 2: header=0x1c9; break; - case 3: header=0x8c7; break; - case 4: header=0x99f; break; - default: - case 1: header=0x11f; break; - } +#if PACKETVER <= 20120702 + header = 0x011f; +//#if PACKETVER < 20110718 +// header = 0x011f; +//#elif PACKETVER < 20121212 +// header = 0x08c7; +#elif PACKETVER < 20130731 + header = 0x099f; +#else + header = 0x09ca; +#endif - WFIFOHEAD(fd,packet_len(header)); - WFIFOW(fd,pos)=header; - if(type==3 || type==4){ - WFIFOW(fd, pos+2)=packet_len(header); - pos +=2; - } - WFIFOL(fd,pos+2)=unit->bl.id; - WFIFOL(fd,pos+6)=unit->group->src_id; - WFIFOW(fd,pos+10)=unit->bl.x; - WFIFOW(fd,pos+12)=unit->bl.y; - switch(type){ - case 1: WFIFOB(fd,pos+14)=unit_id; - WFIFOB(fd,pos+15)=1; + len = packet_len(header); + WBUFW(buf,pos) = header; + if (header != 0x011f) { + WBUFW(buf, pos+2) = len; + pos += 2; + } + WBUFL(buf,pos+2) = unit->bl.id; + WBUFL(buf,pos+6) = unit->group->src_id; + WBUFW(buf,pos+10) = unit->bl.x; + WBUFW(buf,pos+12) = unit->bl.y; + switch (header) { + case 0x011f: + WBUFB(buf,pos+14) = unit_id; + WBUFB(buf,pos+15) = 1; break; - case 2: WFIFOB(fd,pos+14)=unit_id; - WFIFOB(fd,pos+15)=1; - WFIFOB(fd,pos+16)=1; - safestrncpy((char*)WFIFOP(fd,pos+17),unit->group->valstr,MESSAGE_SIZE); + case 0x08c7: + WBUFB(buf,pos+14) = unit_id; + WBUFW(buf,pos+15) = unit->range; + WBUFB(buf,pos+17) = 1; break; - case 3: WFIFOB(fd,pos+14)=unit_id; - WFIFOW(fd,pos+15)=unit->range; - WFIFOB(fd,pos+17)=1; //visible + case 0x099f: + WBUFL(buf,pos+14) = unit_id; + WBUFW(buf,pos+18) = unit->range; + WBUFB(buf,pos+20) = 1; break; - case 4: WFIFOL(fd,pos+14)=unit_id; pos += 3; - WFIFOW(fd,pos+15)=unit->range; - WFIFOB(fd,pos+17)=1; + case 0x09ca: + WBUFL(buf,pos+14) = unit_id; + WBUFB(buf,pos+18) = (unsigned char)unit->range; + WBUFB(buf,pos+19) = 1; + WBUFB(buf,pos+20) = (unsigned char)unit->group->skill_lv; break; } - WFIFOSET(fd,packet_len(header)); + clif_send(buf, len, bl, target); - if(unit->group->skill_id == WZ_ICEWALL) - clif_changemapcell(fd,unit->bl.m,unit->bl.x,unit->bl.y,5,SELF); + if (unit->group->skill_id == WZ_ICEWALL) + clif_changemapcell(fd, unit->bl.m, unit->bl.x, unit->bl.y, 5, SELF); } @@ -4641,7 +4678,7 @@ static int clif_getareachar(struct block_list* bl,va_list ap) clif_getareachar_item(sd,(struct flooritem_data*) bl); break; case BL_SKILL: - clif_getareachar_skillunit(1,sd,(TBL_SKILL*)bl); + clif_getareachar_skillunit(&sd->bl, (TBL_SKILL*)bl, SELF); break; default: if(&sd->bl == bl) @@ -4725,7 +4762,7 @@ int clif_insight(struct block_list *bl,va_list ap) clif_getareachar_item(tsd,(struct flooritem_data*)bl); break; case BL_SKILL: - clif_getareachar_skillunit(1,tsd,(TBL_SKILL*)bl); + clif_getareachar_skillunit(&tsd->bl, (TBL_SKILL*)bl, SELF); break; default: clif_getareachar_unit(tsd,bl); @@ -5218,51 +5255,6 @@ void clif_skill_poseffect(struct block_list *src,uint16 skill_id,int val,int x,i clif_send(buf,packet_len(0x117),src,AREA); } - -/*========================================== - * Tells all client's nearby 'unit' sight range that it spawned - *------------------------------------------*/ -//FIXME: this is just an AREA version of clif_getareachar_skillunit() -void clif_skill_setunit(struct skill_unit *unit) -{ - unsigned char buf[128]; - - nullpo_retv(unit); - - if( unit->group->state.guildaura ) - return; - -#if PACKETVER >= 3 - if(unit->group->unit_id==UNT_GRAFFITI) { // Graffiti [Valaris] - WBUFW(buf, 0)=0x1c9; - WBUFL(buf, 2)=unit->bl.id; - WBUFL(buf, 6)=unit->group->src_id; - WBUFW(buf,10)=unit->bl.x; - WBUFW(buf,12)=unit->bl.y; - WBUFB(buf,14)=unit->group->unit_id; - WBUFB(buf,15)=1; - WBUFB(buf,16)=1; - safestrncpy((char*)WBUFP(buf,17),unit->group->valstr,MESSAGE_SIZE); - clif_send(buf,packet_len(0x1c9),&unit->bl,AREA); - return; - } -#endif - WBUFW(buf, 0)=0x11f; - WBUFL(buf, 2)=unit->bl.id; - WBUFL(buf, 6)=unit->group->src_id; - WBUFW(buf,10)=unit->bl.x; - WBUFW(buf,12)=unit->bl.y; - if (unit->group->state.song_dance&0x1 && unit->val2&UF_ENSEMBLE) - WBUFB(buf,14)=unit->val2&UF_SONG?UNT_DISSONANCE:UNT_UGLYDANCE; - else if (skill_get_unit_flag(unit->group->skill_id) & UF_RANGEDSINGLEUNIT && !(unit->val2 & UF_RANGEDSINGLEUNIT)) - WBUFB(buf, 14) = UNT_DUMMYSKILL; // Only display the unit at center. - else - WBUFB(buf,14)=unit->group->unit_id; - WBUFB(buf,15)=1; // ignored by client (always gets set to 1) - clif_send(buf,packet_len(0x11f),&unit->bl,AREA); -} - - /// Presents a list of available warp destinations (ZC_WARPLIST). /// 011c .W { .16B }*4 void clif_skill_warppoint(struct map_session_data* sd, uint16 skill_id, uint16 skill_lv, unsigned short map1, unsigned short map2, unsigned short map3, unsigned short map4) @@ -5473,9 +5465,7 @@ void clif_cooking_list(struct map_session_data *sd, int trigger, uint16 skill_id /// Notifies clients of a status change. /// 0196 .W .L .B (ZC_MSG_STATE_CHANGE) [used for ending status changes and starting them on non-pc units (when needed)] /// 043f .W .L .B .L { .L }*3 (ZC_MSG_STATE_CHANGE2) [used exclusively for starting statuses on pcs] -/// 08ff .L .W .L { .L }*3 (PACKETVER >= 20111108) -/// 0983 .W .L .B .L .L { .L }*3 (PACKETVER >= 20120618) -/// 0984 .L .W .L .L { .L }*3 (PACKETVER >= 20120618) +/// 0983 .W .L .B .L .L { .L }*3 (ZC_MSG_STATE_CHANGE3) (PACKETVER >= 20120618) void clif_status_change(struct block_list *bl,int type,int flag,int tick,int val1, int val2, int val3) { unsigned char buf[32]; @@ -5549,6 +5539,12 @@ void clif_status_change2(struct block_list *bl, int tid, enum send_target target } +/// 08ff .L .W .L { .L }*3 (ZC_EFST_SET_ENTER) (PACKETVER >= 20111108) +/// 0984 .L .W .L .L { .L }*3 (ZC_EFST_SET_ENTER2) (PACKETVER >= 20120618) +//! TODO +//void clif_efst_enter(); + + /// Send message (modified by [Yor]) (ZC_NOTIFY_PLAYERCHAT). /// 008e .W .?B void clif_displaymessage(const int fd, const char* mes) @@ -17742,7 +17738,7 @@ void packetdb_readdb(void) 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, 0, 0, 0, //#0x08C0 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, + 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 10, 9, 7, 10, 0, 0, 0, 6, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -17758,11 +17754,11 @@ void packetdb_readdb(void) 0, 0, 0, 0, 0, 0, 0, 14, 6, 50, 0, 0, 0, 0, 0, 0, //#0x0980 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 31, 0, 0, 0, 0, 0, 0, -1, 8, 11, 9, 8, 0, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, -1, 8, 11, 9, 8, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 12, 10, 14, 10, 14, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 4, 6, 4, 0, 0, 0, 0, 0, 0, //#0x09C0 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0,102, 0, 0, 0, 0, 0, 2, 0, -1, 0, 2, 0, 0, 0, 0, 0, 0, 7, 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, 0, 0, 0, diff --git a/src/map/clif.h b/src/map/clif.h index 1664193a64f..b4e427a3080 100644 --- a/src/map/clif.h +++ b/src/map/clif.h @@ -541,9 +541,8 @@ void clif_cooking_list(struct map_session_data *sd, int trigger, uint16 skill_id void clif_produceeffect(struct map_session_data* sd,int flag, unsigned short nameid); -void clif_skill_setunit(struct skill_unit *unit); +void clif_getareachar_skillunit(struct block_list *bl, struct skill_unit *unit, enum send_target target); void clif_skill_delunit(struct skill_unit *unit); - void clif_skillunit_update(struct block_list* bl); void clif_autospell(struct map_session_data *sd,uint16 skill_lv); diff --git a/src/map/skill.c b/src/map/skill.c index 3b9f7350d63..ab97065c62e 100755 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -3899,7 +3899,7 @@ static int skill_reveal_trap (struct block_list *bl, va_list ap) { //Reveal trap. //Change look is not good enough, the client ignores it as an actual trap still. [Skotlex] //clif_changetraplook(bl, su->group->unit_id); - clif_skill_setunit(su); + clif_getareachar_skillunit(&su->bl, su, AREA); return 1; } return 0; @@ -11662,7 +11662,7 @@ static int skill_dance_overlap_sub(struct block_list* bl, va_list ap) else //Remove dissonance target->val2 &= ~UF_ENSEMBLE; - clif_skill_setunit(target); //Update look of affected cell. + clif_getareachar_skillunit(&target->bl, target, AREA); //Update look of affected cell. return 1; } @@ -13203,13 +13203,13 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns status_change_start(ss, bl, SC_BLIND, (10 + 10 * sg->skill_lv)*100, sg->skill_lv, sg->skill_id, 0, 0, skill_get_time2(sg->skill_id, sg->skill_lv), 2|8); break; - case UNT_B_TRAP: //! FIXME: Unit ID isn't correct, it doesn't show proper client effect. + case UNT_B_TRAP: sc_start(ss,bl,SC_B_TRAP,100,sg->skill_lv,max(status_get_str(bl) * 150,5000)); //(custom) sg->unit_id = UNT_USED_TRAPS; clif_changetraplook(&src->bl, UNT_USED_TRAPS); - sg->limit=DIFF_TICK(tick,sg->tick)+1500; + sg->limit = DIFF_TICK(tick,sg->tick)+1500; break; - case UNT_FIRE_RAIN: //! FIXME: Unit ID isn't correct, it doesn't show proper client effect. + case UNT_FIRE_RAIN: clif_skill_damage(ss,bl,tick,status_get_amotion(ss),0, skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,SD_ANIMATION|SD_SPLASH), 1,sg->skill_id,sg->skill_lv,6); @@ -16640,7 +16640,7 @@ struct skill_unit *skill_initunit (struct skill_unit_group *group, int idx, int break; } - clif_skill_setunit(unit); + clif_getareachar_skillunit(&unit->bl, unit, AREA); return unit; } @@ -17473,7 +17473,7 @@ int skill_unit_move_unit_group (struct skill_unit_group *group, int16 m, int16 d if (!(m_flag[i]&0x2)) { //We only moved the cell in 0-1 if (group->state.song_dance&0x1) //Check for dissonance effect. skill_dance_overlap(unit1, 1); - clif_skill_setunit(unit1); + clif_getareachar_skillunit(&unit1->bl, unit1, AREA); map_foreachincell(skill_unit_effect,unit1->bl.m,unit1->bl.x,unit1->bl.y,group->bl_flag,&unit1->bl,tick,1); } }