Fixed skill unit effect issue, wrong used packet for newer client. Causing some skills shows wrong animation. (Partial merge from 3CeAM 2.0 r16, r17, & r18)

Signed-off-by: Cydh Ramdh <house.bad@gmail.com>
This commit is contained in:
Cydh Ramdh 2014-08-09 05:16:50 +07:00
parent a1e53caa71
commit 05d3c6bd43
6 changed files with 113 additions and 110 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 <src ID>.L <dst ID>.L <server tick>.L <src speed>.L <dst speed>.L <damage>.W <div>.W <type>.B <damage2>.W (ZC_NOTIFY_ACT)
/// 02e1 <src ID>.L <dst ID>.L <server tick>.L <src speed>.L <dst speed>.L <damage>.L <div>.W <type>.B <damage2>.L (ZC_NOTIFY_ACT2)
/// 08c8 <src ID>.L <dst ID>.L <server tick>.L <src speed>.L <dst speed>.L <damage>.L <IsSPDamage>.B <div>.W <type>.B <damage2>.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 <id>.L <creator id>.L <x>.W <y>.W <unit id>.B <visible>.B <has msg>.B <msg>.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 <id>.L <creator id>.L <x>.W <y>.W <unit id>.B <visible>.B (ZC_SKILL_ENTRY)
/// 01c9 <id>.L <creator id>.L <x>.W <y>.W <unit id>.B <visible>.B <has msg>.B <msg>.80B (ZC_SKILL_ENTRY2)
/// 08c7 <lenght>.W <id> L <creator id>.L <x>.W <y>.W <unit id>.B <range>.W <visible>.B (ZC_SKILL_ENTRY3)
/// 099f <lenght>.W <id> L <creator id>.L <x>.W <y>.W <unit id>.L <range>.W <visible>.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 <lenght>.W <id> L <creator id>.L <x>.W <y>.W <unit id>.L <range>.B <visible>.B <skill level>.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( unit->group->state.guildaura )
if (bl->type == BL_PC)
fd = ((TBL_PC*)bl)->fd;
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;
len = packet_len(header);
WBUFW(buf,pos) = header;
if (header != 0x011f) {
WBUFW(buf, pos+2) = len;
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;
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 <skill id>.W { <map name>.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 <index>.W <id>.L <state>.B (ZC_MSG_STATE_CHANGE) [used for ending status changes and starting them on non-pc units (when needed)]
/// 043f <index>.W <id>.L <state>.B <remain msec>.L { <val>.L }*3 (ZC_MSG_STATE_CHANGE2) [used exclusively for starting statuses on pcs]
/// 08ff <id>.L <index>.W <remain msec>.L { <val>.L }*3 (PACKETVER >= 20111108)
/// 0983 <index>.W <id>.L <state>.B <total msec>.L <remain msec>.L { <val>.L }*3 (PACKETVER >= 20120618)
/// 0984 <id>.L <index>.W <total msec>.L <remain msec>.L { <val>.L }*3 (PACKETVER >= 20120618)
/// 0983 <index>.W <id>.L <state>.B <total msec>.L <remain msec>.L { <val>.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 <id>.L <index>.W <remain msec>.L { <val>.L }*3 (ZC_EFST_SET_ENTER) (PACKETVER >= 20111108)
/// 0984 <id>.L <index>.W <total msec>.L <remain msec>.L { <val>.L }*3 (ZC_EFST_SET_ENTER2) (PACKETVER >= 20120618)
//! TODO
//void clif_efst_enter();
/// Send message (modified by [Yor]) (ZC_NOTIFY_PLAYERCHAT).
/// 008e <packet len>.W <message>.?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,

View File

@ -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);

View File

@ -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);
}
}