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)) if(sc_start4(src,src, SC_BLADESTOP, 100, sd?pc_checkskill(sd, MO_BLADESTOP):5, 0, 0, target->id, duration))
{ //Target locked. { //Target locked.
clif_damage(src, target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS. 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); sc_start4(src,target, SC_BLADESTOP, 100, skill_lv, 0, 0, src->id, duration);
return ATK_BLOCK; 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 ); 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; packet.packetType = HEADER_ZC_COMBODELAY;
WBUFL(buf,2)=bl->id; packet.AID = bl.id;
WBUFL(buf,6)=client_tick(wait); packet.delay = client_tick( wait );
clif_send(buf,packet_len(0x1d2),bl,AREA);
clif_send( &packet, sizeof( packet ), &bl, AREA );
} }
/// Notifies clients in area that a character has blade-stopped another (ZC_BLADESTOP). /// Notifies clients in area that a character has blade-stopped another.
/// 01d1 <src id>.L <dst id>.L <flag>.L /// 01d1 <src id>.L <dst id>.L <flag>.L (ZC_BLADESTOP)
/// flag: /// flag:
/// 0 = inactive /// 0 = inactive
/// 1 = active /// 1 = active
void clif_bladestop(struct block_list *src, int dst_id, int active) void clif_bladestop( block_list& src, uint32 target_id, bool active ){
{ PACKET_ZC_BLADESTOP packet{};
unsigned char buf[32];
nullpo_retv(src); packet.packetType = HEADER_ZC_BLADESTOP;
packet.srcId = src.id;
packet.targetId = target_id;
packet.flag = active;
WBUFW(buf,0)=0x1d1; clif_send( &packet, sizeof( packet ), &src, AREA );
WBUFL(buf,2)=src->id;
WBUFL(buf,6)=dst_id;
WBUFL(buf,10)=active;
clif_send(buf,packet_len(0x1d1),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_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_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_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_combo_delay( block_list& bl, t_tick wait );
void clif_bladestop(struct block_list *src, int dst_id, int active); 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); 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) #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); parseable_packet(0x01ce,6,clif_parse_AutoSpell,2);
packet(0x01cf,28); packet(0x01cf,28);
packet(0x01d0,8); packet(0x01d0,8);
packet(0x01d1,14);
packet(0x01d2,10);
parseable_packet(0x01d5,-1,clif_parse_NpcStringInput,2,4,8); parseable_packet(0x01d5,-1,clif_parse_NpcStringInput,2,4,8);
packet(0x01d7,11); packet(0x01d7,11);
packet(0x01d8,54); packet(0x01d8,54);

View File

@ -1082,6 +1082,21 @@ struct PACKET_ZC_PET_ACT {
} __attribute__((packed)); } __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_PET_ACT, 0x1aa); 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 // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
#if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 ) #if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 )
#pragma pack( pop ) #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 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 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); 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( sc_start2(src,bl, type, 100, skill_lv, src->id, skill_get_time(skill_id, skill_lv))) {
if( bl->type == BL_MOB ) if( bl->type == BL_MOB )
mob_unlocktarget((TBL_MOB*)bl,gettick()); mob_unlocktarget((TBL_MOB*)bl,gettick());
clif_bladestop(src, bl->id, 1); clif_bladestop( *src, bl->id, true );
map_freeblock_unlock(); map_freeblock_unlock();
return 1; 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( sc_start2(src,bl, type, 50, skill_lv, src->id, skill_get_time(skill_id, skill_lv))) {
if( bl->type == BL_MOB ) if( bl->type == BL_MOB )
mob_unlocktarget((TBL_MOB*)bl,gettick()); mob_unlocktarget((TBL_MOB*)bl,gettick());
clif_bladestop(src, bl->id, 1); clif_bladestop( *src, bl->id, true );
map_freeblock_unlock(); map_freeblock_unlock();
return 1; 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; tsc->getSCE(SC_BLADESTOP)->val4 = 0;
status_change_end(tbl, SC_BLADESTOP); status_change_end(tbl, SC_BLADESTOP);
} }
clif_bladestop(bl, tid2, 0); clif_bladestop( *bl, tid2, false );
} }
break; break;
case SC_DANCING: 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); status_change *sc2 = status_get_sc(src);
if( sc2 && sc2->getSCE(SC_CURSEDCIRCLE_ATKER) && --(sc2->getSCE(SC_CURSEDCIRCLE_ATKER)->val2) == 0 ) { 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); status_change_end(src, SC_CURSEDCIRCLE_ATKER);
} }
} }
@ -15005,7 +15005,7 @@ int status_change_timer_sub(struct block_list* bl, va_list ap)
break; break;
case SC_CURSEDCIRCLE_TARGET: case SC_CURSEDCIRCLE_TARGET:
if( tsc && tsc->getSCE(SC_CURSEDCIRCLE_TARGET) && tsc->getSCE(SC_CURSEDCIRCLE_TARGET)->val2 == src->id ) { 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); status_change_end(bl, type);
} }
break; break;