ZC_BLADESTOP

This commit is contained in:
Atemo 2024-05-26 05:07:26 +02:00
parent 75f0634658
commit b222412b07
7 changed files with 42 additions and 33 deletions

View File

@ -9896,7 +9896,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
if(sc_start4(src,src, SC_BLADESTOP, 100, sd?pc_checkskill(sd, MO_BLADESTOP):5, 0, 0, target->id, duration))
{ //Target locked.
clif_damage(src, target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS.
clif_bladestop(target, src->id, 1);
clif_bladestop( *target, src->id, true );
sc_start4(src,target, SC_BLADESTOP, 100, skill_lv, 0, 0, src->id, duration);
return ATK_BLOCK;
}

View File

@ -8477,38 +8477,34 @@ void clif_spiritball( struct block_list *bl, struct block_list* target, enum sen
clif_send( &p, sizeof( p ), target == nullptr ? bl : target, send_target );
}
/// Notifies clients in area of a character's combo delay (ZC_COMBODELAY).
/// 01d2 <account id>.L <delay>.L
void clif_combo_delay(struct block_list *bl,t_tick wait)
{
unsigned char buf[32];
nullpo_retv(bl);
/// Notifies clients in area of a character's combo delay.
/// 01d2 <account id>.L <delay>.L (ZC_COMBODELAY)
void clif_combo_delay( block_list& bl, t_tick wait ){
PACKET_ZC_COMBODELAY packet{};
WBUFW(buf,0)=0x1d2;
WBUFL(buf,2)=bl->id;
WBUFL(buf,6)=client_tick(wait);
clif_send(buf,packet_len(0x1d2),bl,AREA);
packet.packetType = HEADER_ZC_COMBODELAY;
packet.AID = bl.id;
packet.delay = client_tick( wait );
clif_send( &packet, sizeof( packet ), &bl, AREA );
}
/// Notifies clients in area that a character has blade-stopped another (ZC_BLADESTOP).
/// 01d1 <src id>.L <dst id>.L <flag>.L
/// Notifies clients in area that a character has blade-stopped another.
/// 01d1 <src id>.L <dst id>.L <flag>.L (ZC_BLADESTOP)
/// flag:
/// 0 = inactive
/// 1 = active
void clif_bladestop(struct block_list *src, int dst_id, int active)
{
unsigned char buf[32];
void clif_bladestop( block_list& src, uint32 target_id, bool active ){
PACKET_ZC_BLADESTOP packet{};
nullpo_retv(src);
packet.packetType = HEADER_ZC_BLADESTOP;
packet.srcId = src.id;
packet.targetId = target_id;
packet.flag = active;
WBUFW(buf,0)=0x1d1;
WBUFL(buf,2)=src->id;
WBUFL(buf,6)=dst_id;
WBUFL(buf,10)=active;
clif_send(buf,packet_len(0x1d1),src,AREA);
clif_send( &packet, sizeof( packet ), &src, AREA );
}

View File

@ -950,8 +950,8 @@ void clif_spiritball( struct block_list *bl, struct block_list* target = nullptr
void clif_soulball( map_session_data *sd, struct block_list* target = nullptr, enum send_target send_target = AREA );
void clif_servantball( map_session_data& sd, struct block_list* target = nullptr, enum send_target send_target = AREA );
void clif_abyssball( map_session_data& sd, struct block_list* target = nullptr, enum send_target send_target = AREA );
void clif_combo_delay(struct block_list *bl,t_tick wait);
void clif_bladestop(struct block_list *src, int dst_id, int active);
void clif_combo_delay( block_list& bl, t_tick wait );
void clif_bladestop( block_list& src, uint32 target_id, bool active );
void clif_changemapcell(int fd, int16 m, int x, int y, int type, enum send_target target);
#define clif_status_load(bl, type, flag) clif_status_change((bl), (type), (flag), 0, 0, 0, 0)

View File

@ -285,8 +285,6 @@
parseable_packet(0x01ce,6,clif_parse_AutoSpell,2);
packet(0x01cf,28);
packet(0x01d0,8);
packet(0x01d1,14);
packet(0x01d2,10);
parseable_packet(0x01d5,-1,clif_parse_NpcStringInput,2,4,8);
packet(0x01d7,11);
packet(0x01d8,54);

View File

@ -1082,6 +1082,21 @@ struct PACKET_ZC_PET_ACT {
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_PET_ACT, 0x1aa);
struct PACKET_ZC_COMBODELAY {
int16 packetType;
uint32 AID;
uint32 delay;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_COMBODELAY, 0x1d2);
struct PACKET_ZC_BLADESTOP {
int16 packetType;
uint32 srcId;
uint32 targetId;
uint32 flag;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_BLADESTOP, 0x1d1);
// NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
#if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 )
#pragma pack( pop )

View File

@ -3346,7 +3346,7 @@ void skill_combo(struct block_list* src,struct block_list *dsrc, struct block_li
if(sd && duration==1) duration = DIFF_TICK(sd->ud.canact_tick, tick); //Auto calc duration
duration = i64max(status_get_amotion(src),duration); //Never less than aMotion
sc_start4(src,src,SC_COMBO,100,skill_id,target_id,nodelay,0,duration);
clif_combo_delay(src, duration);
clif_combo_delay( *src, duration );
}
}
@ -11551,7 +11551,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
if( sc_start2(src,bl, type, 100, skill_lv, src->id, skill_get_time(skill_id, skill_lv))) {
if( bl->type == BL_MOB )
mob_unlocktarget((TBL_MOB*)bl,gettick());
clif_bladestop(src, bl->id, 1);
clif_bladestop( *src, bl->id, true );
map_freeblock_unlock();
return 1;
}
@ -11573,7 +11573,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
if( sc_start2(src,bl, type, 50, skill_lv, src->id, skill_get_time(skill_id, skill_lv))) {
if( bl->type == BL_MOB )
mob_unlocktarget((TBL_MOB*)bl,gettick());
clif_bladestop(src, bl->id, 1);
clif_bladestop( *src, bl->id, true );
map_freeblock_unlock();
return 1;
}

View File

@ -13365,7 +13365,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
tsc->getSCE(SC_BLADESTOP)->val4 = 0;
status_change_end(tbl, SC_BLADESTOP);
}
clif_bladestop(bl, tid2, 0);
clif_bladestop( *bl, tid2, false );
}
break;
case SC_DANCING:
@ -13614,7 +13614,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
status_change *sc2 = status_get_sc(src);
if( sc2 && sc2->getSCE(SC_CURSEDCIRCLE_ATKER) && --(sc2->getSCE(SC_CURSEDCIRCLE_ATKER)->val2) == 0 ) {
clif_bladestop(bl, sce->val2, 0);
clif_bladestop( *bl, sce->val2, false );
status_change_end(src, SC_CURSEDCIRCLE_ATKER);
}
}
@ -15005,7 +15005,7 @@ int status_change_timer_sub(struct block_list* bl, va_list ap)
break;
case SC_CURSEDCIRCLE_TARGET:
if( tsc && tsc->getSCE(SC_CURSEDCIRCLE_TARGET) && tsc->getSCE(SC_CURSEDCIRCLE_TARGET)->val2 == src->id ) {
clif_bladestop(bl, tsc->getSCE(SC_CURSEDCIRCLE_TARGET)->val2, 0);
clif_bladestop( *bl, tsc->getSCE(SC_CURSEDCIRCLE_TARGET)->val2, false );
status_change_end(bl, type);
}
break;