Converted ZC_NOTIFY_ACT to struct (#8571)

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
This commit is contained in:
AoShinHo 2024-08-27 04:59:26 -03:00 committed by GitHub
parent baded8330f
commit d5267c63a9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 174 additions and 167 deletions

View File

@ -1314,7 +1314,7 @@ ACMD_FUNC(heal)
if ( hp < 0 && sp <= 0 ) {
status_damage(nullptr, &sd->bl, -hp, -sp, 0, 0, 0);
clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, -hp, 0, DMG_ENDURE, 0, false);
clif_damage(sd->bl,sd->bl, gettick(), 0, 0, -hp, 0, DMG_ENDURE, 0, false);
clif_displaymessage(fd, msg_txt(sd,156)); // HP or/and SP modified.
return 0;
}
@ -1325,7 +1325,7 @@ ACMD_FUNC(heal)
status_heal(&sd->bl, hp, 0, 0);
else {
status_damage(nullptr, &sd->bl, -hp, 0, 0, 0, 0);
clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, -hp, 0, DMG_ENDURE, 0, false);
clif_damage(sd->bl,sd->bl, gettick(), 0, 0, -hp, 0, DMG_ENDURE, 0, false);
}
}

View File

@ -6920,7 +6920,7 @@ static void battle_calc_attack_gvg_bg(struct Damage* wd, struct block_list *src,
if( rdamage > 0 ) { //Item reflect gets calculated before any mapflag reducing is applicated
struct block_list *d_bl = battle_check_devotion(src);
rdelay = clif_damage(src, (!d_bl) ? src : d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false);
rdelay = clif_damage(*src, (d_bl == nullptr) ? *src : *d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false);
if( tsd )
battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_);
//Use Reflect Shield to signal this kind of skill trigger [Skotlex]
@ -6991,7 +6991,7 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo
{
ATK_RATER(wd->damage, 50)
clif_skill_nodamage(target,target,ST_REJECTSWORD, tsc->getSCE(SC_REJECTSWORD)->val1,1);
battle_fix_damage(target,src,wd->damage,clif_damage(target,src,gettick(),0,0,wd->damage,0,DMG_NORMAL,0,false),ST_REJECTSWORD);
battle_fix_damage(target,src,wd->damage,clif_damage(*target,*src,gettick(),0,0,wd->damage,0,DMG_NORMAL,0,false),ST_REJECTSWORD);
if (status_isdead(*target))
return;
if( --(tsc->getSCE(SC_REJECTSWORD)->val3) <= 0 )
@ -7008,7 +7008,7 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo
skill_blown(target, src, skill_get_blewcount(SR_CRESCENTELBOW_AUTOSPELL, tsc->getSCE(SC_CRESCENTELBOW)->val1), unit_getdir(src), BLOWN_NONE);
clif_skill_damage(target, src, gettick(), status_get_amotion(src), 0, rdamage,
1, SR_CRESCENTELBOW_AUTOSPELL, tsc->getSCE(SC_CRESCENTELBOW)->val1, DMG_SINGLE); // This is how official does
clif_damage(src, target, gettick(), status_get_amotion(src)+1000, 0, rdamage/10, 1, DMG_NORMAL, 0, false);
clif_damage(*src, *target, gettick(), status_get_amotion(src)+1000, 0, rdamage/10, 1, DMG_NORMAL, 0, false);
battle_fix_damage(target, src, rdamage, 0, SR_CRESCENTELBOW);
status_damage(src, target, rdamage/10, 0, 0, 1, 0);
status_change_end(target, SC_CRESCENTELBOW);
@ -7290,7 +7290,7 @@ void battle_do_reflect(int attack_type, struct Damage *wd, struct block_list* sr
if( attack_type == BF_WEAPON && tsc->getSCE(SC_REFLECTDAMAGE) ) // Don't reflect your own damage (Grand Cross)
map_foreachinshootrange(battle_damage_area,target,skill_get_splash(LG_REFLECTDAMAGE,1),BL_CHAR,tick,target,wd->amotion,sstatus->dmotion,rdamage,wd->flag);
else if( attack_type == BF_WEAPON || attack_type == BF_MISC) {
rdelay = clif_damage(src, (!d_bl) ? src : d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false);
rdelay = clif_damage(*src, (d_bl == nullptr) ? *src : *d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false);
if( tsd )
battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_);
// It appears that official servers give skill reflect damage a longer delay
@ -9731,7 +9731,7 @@ int battle_damage_area(struct block_list *bl, va_list ap) {
battle_delay_damage(tick, amotion,src,bl,0,CR_REFLECTSHIELD,0,damage,ATK_DEF,0,true,false);
else
battle_fix_damage(src,bl,damage,0,LG_REFLECTDAMAGE);
clif_damage(bl,bl,tick,amotion,dmotion,damage,1,DMG_ENDURE,0,false);
clif_damage(*bl,*bl,tick,amotion,dmotion,damage,1,DMG_ENDURE,0,false);
skill_additional_effect(src, bl, CR_REFLECTSHIELD, 1, BF_WEAPON|BF_SHORT|BF_NORMAL,ATK_DEF,tick);
map_freeblock_unlock();
}
@ -9877,7 +9877,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
uint16 skill_lv = tsc->getSCE(SC_AUTOCOUNTER)->val1;
clif_skillcastcancel( *target ); //Remove the casting bar. [Skotlex]
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.
status_change_end(target, SC_AUTOCOUNTER);
skill_attack(BF_WEAPON,target,target,src,KN_AUTOCOUNTER,skill_lv,tick,0);
return ATK_BLOCK;
@ -9900,7 +9900,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
status_change_end(target, SC_BLADESTOP_WAIT);
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_damage(*src, *target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS.
clif_bladestop(target, src->id, 1);
sc_start4(src,target, SC_BLADESTOP, 100, skill_lv, 0, 0, src->id, duration);
return ATK_BLOCK;
@ -10042,7 +10042,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
}
}
wd.dmotion = clif_damage(src, target, tick, wd.amotion, wd.dmotion, wd.damage, wd.div_ , wd.type, wd.damage2, wd.isspdamage);
wd.dmotion = clif_damage(*src, *target, tick, wd.amotion, wd.dmotion, wd.damage, wd.div_ , wd.type, wd.damage2, wd.isspdamage);
if (sd && sd->bonus.splash_range > 0 && damage > 0)
skill_castend_damage_id(src, target, 0, 1, tick, 0);
@ -10095,7 +10095,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
if (d_sc && d_sc->getSCE(SC_REBOUND_S))
devotion_damage -= devotion_damage * d_sc->getSCE(SC_REBOUND_S)->val2 / 100;
clif_damage(d_bl, d_bl, gettick(), wd.amotion, wd.dmotion, devotion_damage, 1, DMG_NORMAL, 0, false);
clif_damage(*d_bl, *d_bl, gettick(), wd.amotion, wd.dmotion, devotion_damage, 1, DMG_NORMAL, 0, false);
battle_fix_damage(src, d_bl, devotion_damage, 0, CR_DEVOTION);
}
}
@ -10114,7 +10114,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
struct block_list *e_bl = map_id2bl(tsc->getSCE(SC_WATER_SCREEN_OPTION)->val1);
if (e_bl && !status_isdead(*e_bl)) {
clif_damage(e_bl, e_bl, tick, 0, 0, damage, wd.div_, DMG_NORMAL, 0, false);
clif_damage(*e_bl, *e_bl, tick, 0, 0, damage, wd.div_, DMG_NORMAL, 0, false);
battle_fix_damage(src, e_bl, damage, 0, EL_WATER_SCREEN);
}
}

View File

@ -631,7 +631,7 @@ void buyingstore_reopen( map_session_data* sd ){
if( at->sit ) {
pc_setsit(sd);
skill_sit(sd, 1);
clif_sitting(&sd->bl);
clif_sitting(sd->bl);
}
// Immediate save

View File

@ -5134,38 +5134,25 @@ static int clif_hallucination_damage()
/// 11 = lucky dodge
/// 12 = (touch skill?)
/// 13 = multi-hit critical
int clif_damage(struct block_list* src, struct block_list* dst, t_tick tick, int sdelay, int ddelay, int64 sdamage, int div, enum e_damage_type type, int64 sdamage2, bool spdamage)
{
unsigned char buf[34];
status_change *sc;
int clif_damage(block_list& src, block_list& dst, t_tick tick, int sdelay, int ddelay, int64 sdamage, int div, enum e_damage_type type, int64 sdamage2, bool spdamage){
int damage = (int)cap_value(sdamage,INT_MIN,INT_MAX);
int damage2 = (int)cap_value(sdamage2,INT_MIN,INT_MAX);
#if PACKETVER < 20071113
const int cmd = 0x8a;
int offset = 0;
#elif PACKETVER < 20131223
const int cmd = 0x2e1;
int offset = 2;
#else
const int cmd = 0x8c8;
int offset = 3;
#endif
nullpo_ret(src);
nullpo_ret(dst);
if (type != DMG_MULTI_HIT_CRITICAL)
type = clif_calc_delay(type,div,damage+damage2,ddelay);
sc = status_get_sc(dst);
status_change *sc = status_get_sc(&dst);
if(sc && sc->count) {
if(sc->getSCE(SC_HALLUCINATION)) {
damage = clif_hallucination_damage();
if(damage2) damage2 = clif_hallucination_damage();
if(damage2)
damage2 = clif_hallucination_damage();
}
}
// Calculate what sdelay to send to the client so it applies damage at the same time as the server
if (battle_config.synchronize_damage && src->type == BL_MOB) {
if (battle_config.synchronize_damage && src.type == BL_MOB) {
// When a clif_damage packet is sent to the client it will also send "sdelay" (amotion) as value.
// The client however does not interpret this value as AttackMotion but incorrectly as an inverted
// animation speed modifier, with 432 standing for 1x animation speed.
@ -5175,7 +5162,7 @@ int clif_damage(struct block_list* src, struct block_list* dst, t_tick tick, int
// it displays the damage and makes the target flinch / stop. If the damage frame is undefined,
// it instead displays the damage / flinch / stop at the beginning of the second to last frame.
// We define the time after which the damage frame shows at 1x speed as clientamotion.
uint16 clientamotion = std::max((uint16)1, status_get_clientamotion(src));
uint16 clientamotion = std::max((uint16)1, status_get_clientamotion(&src));
// Knowing when the damage frame happens in the animation allows us to synchronize the timing
// between client and server using the formula below.
@ -5187,120 +5174,102 @@ int clif_damage(struct block_list* src, struct block_list* dst, t_tick tick, int
sdelay = std::min(sdelay, DEFAULT_ANIMATION_SPEED);
}
WBUFW(buf,0) = cmd;
WBUFL(buf,2) = src->id;
WBUFL(buf,6) = dst->id;
WBUFL(buf,10) = client_tick(tick);
WBUFL(buf,14) = sdelay;
WBUFL(buf,18) = ddelay;
if (battle_config.hide_woe_damage && map_flag_gvg(src->m)) {
#if PACKETVER < 20071113
WBUFW(buf,22) = damage ? div : 0;
WBUFW(buf,27+offset) = damage2 ? div : 0;
#else
WBUFL(buf, 22) = damage ? div : 0;
WBUFL(buf, 27 + offset) = damage2 ? div : 0;
#endif
PACKET_ZC_NOTIFY_ACT p{};
p.packetType = HEADER_ZC_NOTIFY_ACT;
p.srcID = src.id;
p.targetID = dst.id;
p.serverTick = client_tick(tick);
p.srcSpeed = sdelay;
p.dmgSpeed = ddelay;
if (battle_config.hide_woe_damage && map_flag_gvg(src.m)) {
p.damage = damage ? div : 0;
p.damage2 = damage2 ? div : 0;
} else {
#if PACKETVER < 20071113
WBUFW(buf,22) = min(damage, INT16_MAX);
WBUFW(buf,27+offset) = damage2;
#else
WBUFL(buf,22) = damage;
WBUFL(buf,27+offset) = damage2;
#endif
p.damage = static_cast<decltype(p.damage)>( std::min( damage, static_cast<decltype(damage)>( std::numeric_limits<decltype(p.damage)>::max() ) ) );
p.damage2 = static_cast<decltype(p.damage2)>( std::min( damage2, static_cast<decltype(damage2)>( std::numeric_limits<decltype(p.damage2)>::max() ) ) );
}
#if PACKETVER >= 20131223
WBUFB(buf,26) = (spdamage) ? 1 : 0; // IsSPDamage - Displays blue digits.
p.isSPDamage = (spdamage) ? 1 : 0; // IsSPDamage - Displays blue digits.
#endif
WBUFW(buf,24+offset) = div;
WBUFB(buf,26+offset) = type;
if(disguised(dst)) {
clif_send(buf, packet_len(cmd), dst, AREA_WOS);
WBUFL(buf,6) = disguised_bl_id( dst->id );
clif_send(buf, packet_len(cmd), dst, SELF);
p.div = div;
p.type = type;
if(disguised(&dst)) {
clif_send( &p, sizeof(p), &dst, AREA_WOS);
p.targetID = disguised_bl_id( dst.id );
clif_send( &p, sizeof(p), &dst, SELF);
} else
clif_send(buf, packet_len(cmd), dst, AREA);
clif_send(&p, sizeof(p), &dst, AREA);
if(disguised(src)) {
WBUFL(buf,2) = disguised_bl_id( src->id );
if (disguised(dst))
WBUFL(buf,6) = dst->id;
#if PACKETVER < 20071113
if(damage > 0) WBUFW(buf,22) = -1;
if(damage2 > 0) WBUFW(buf,27) = -1;
#else
if(damage > 0) WBUFL(buf,22) = -1;
if(damage2 > 0) WBUFL(buf,27+offset) = -1;
#endif
clif_send(buf,packet_len(cmd),src,SELF);
if(disguised(&src)) {
p.srcID = disguised_bl_id( src.id );
if(damage > 0)
p.damage = -1;
if(damage2 > 0)
p.damage2 = -1;
clif_send( &p, sizeof(p), &src, SELF);
}
if(src == dst) {
unit_setdir(src, unit_getdir(src));
}
if(&src == &dst)
unit_setdir(&src, unit_getdir(&src));
// In case this assignment is bypassed by DMG_MULTI_HIT_CRITICAL
type = clif_calc_delay(type, div, damage + damage2, ddelay);
//Return adjusted can't walk delay for further processing.
return clif_calc_walkdelay(dst, ddelay, type, damage+damage2, div);
return clif_calc_walkdelay(&dst, ddelay, type, damage+damage2, div);
}
/*==========================================
* src picks up dst
*------------------------------------------*/
void clif_takeitem(struct block_list* src, struct block_list* dst)
{
//clif_damage(src,dst,0,0,0,0,0,DMG_PICKUP_ITEM,0,false);
unsigned char buf[32];
void clif_takeitem(block_list& src, block_list& dst){
PACKET_ZC_NOTIFY_ACT p{};
nullpo_retv(src);
nullpo_retv(dst);
WBUFW(buf, 0) = 0x8a;
WBUFL(buf, 2) = src->id;
WBUFL(buf, 6) = dst->id;
WBUFB(buf,26) = 1;
clif_send(buf, packet_len(0x8a), src, AREA);
p.packetType = HEADER_ZC_NOTIFY_ACT;
p.srcID = src.id;
p.targetID = dst.id;
p.type = DMG_PICKUP_ITEM;
clif_send(&p, sizeof(p), &src, AREA);
}
/*==========================================
* inform clients in area that `bl` is sitting
*------------------------------------------*/
void clif_sitting(struct block_list* bl)
{
unsigned char buf[32];
nullpo_retv(bl);
void clif_sitting(block_list& bl){
PACKET_ZC_NOTIFY_ACT p{};
WBUFW(buf, 0) = 0x8a;
WBUFL(buf, 2) = bl->id;
WBUFB(buf,26) = 2;
clif_send(buf, packet_len(0x8a), bl, AREA);
p.packetType = HEADER_ZC_NOTIFY_ACT;
p.srcID = bl.id;
p.type = DMG_SIT_DOWN;
if(disguised(bl)) {
WBUFL(buf, 2) = disguised_bl_id( bl->id );
clif_send(buf, packet_len(0x8a), bl, SELF);
clif_send(&p, sizeof(p), &bl, AREA);
if(disguised(&bl)) {
p.srcID = disguised_bl_id( bl.id );
clif_send(&p, sizeof(p), &bl, SELF);
}
}
/*==========================================
* inform clients in area that `bl` is standing
*------------------------------------------*/
void clif_standing(struct block_list* bl)
{
unsigned char buf[32];
nullpo_retv(bl);
void clif_standing(block_list& bl){
PACKET_ZC_NOTIFY_ACT p{};
WBUFW(buf, 0) = 0x8a;
WBUFL(buf, 2) = bl->id;
WBUFB(buf,26) = 3;
clif_send(buf, packet_len(0x8a), bl, AREA);
p.packetType = HEADER_ZC_NOTIFY_ACT;
p.srcID = bl.id;
p.type = DMG_STAND_UP;
if(disguised(bl)) {
WBUFL(buf, 2) = disguised_bl_id( bl->id );
clif_send(buf, packet_len(0x8a), bl, SELF);
clif_send(&p, sizeof(p), &bl, AREA);
if(disguised(&bl)) {
p.srcID = disguised_bl_id( bl.id );
clif_send(&p, sizeof(p), &bl, SELF);
}
}
@ -9814,7 +9783,7 @@ void clif_refresh(map_session_data *sd)
if( sd->state.vending )
clif_openvending( *sd );
if( pc_issit(sd) )
clif_sitting(&sd->bl); // FIXME: just send to self, not area
clif_sitting(sd->bl); // FIXME: just send to self, not area
if( pc_isdead(sd) ) // When you refresh, resend the death packet.
clif_clearunit_single( sd->bl.id, CLR_DEAD, *sd );
else
@ -11572,14 +11541,14 @@ void clif_parse_HowManyConnections(int fd, map_session_data *sd)
clif_user_count(sd, map_getusers());
}
void clif_parse_ActionRequest_sub( map_session_data& sd, int action_type, int target_id, t_tick tick ){
void clif_parse_ActionRequest_sub( map_session_data& sd, uint8 action_type, int target_id, t_tick tick ){
if (pc_isdead(&sd)) {
clif_clearunit_area(sd.bl, CLR_DEAD);
return;
}
// Statuses that don't let the player sit / stand / talk with NPCs (targeted)
if (action_type != 0x00 && action_type != 0x07) {
if (action_type != DMG_NORMAL && action_type != DMG_REPEAT) {
if (sd.sc.cant.interact)
return;
pc_stop_walking(&sd, 1);
@ -11591,8 +11560,8 @@ void clif_parse_ActionRequest_sub( map_session_data& sd, int action_type, int ta
switch(action_type)
{
case 0x00: // once attack
case 0x07: // continuous attack
case DMG_NORMAL: // once attack
case DMG_REPEAT: // continuous attack
if( pc_cant_act(&sd) )
return;
@ -11613,7 +11582,7 @@ void clif_parse_ActionRequest_sub( map_session_data& sd, int action_type, int ta
sd.idletime_mer = last_tick;
unit_attack(&sd.bl, target_id, action_type != 0);
break;
case 0x02: // sitdown
case DMG_SIT_DOWN: // sitdown
if (battle_config.basic_skill_check && pc_checkskill(&sd, NV_BASIC) < 3 && pc_checkskill(&sd, SU_BASIC_SKILL) < 1) {
clif_skill_fail( sd, 1, USESKILL_FAIL_LEVEL, 2 );
break;
@ -11621,7 +11590,7 @@ void clif_parse_ActionRequest_sub( map_session_data& sd, int action_type, int ta
if(pc_issit(&sd)) {
//Bugged client? Just refresh them.
clif_sitting(&sd.bl);
clif_sitting(sd.bl);
return;
}
@ -11648,12 +11617,12 @@ void clif_parse_ActionRequest_sub( map_session_data& sd, int action_type, int ta
pc_setsit(&sd);
skill_sit(&sd, true);
clif_sitting(&sd.bl);
clif_sitting(sd.bl);
break;
case 0x03: // standup
case DMG_STAND_UP: // standup
if (!pc_issit(&sd)) {
//Bugged client? Just refresh them.
clif_standing(&sd.bl);
clif_standing(sd.bl);
return;
}
@ -11673,7 +11642,7 @@ void clif_parse_ActionRequest_sub( map_session_data& sd, int action_type, int ta
if (battle_config.mer_idle_no_share && sd.md && battle_config.idletime_mer_option&IDLE_SIT)
sd.idletime_mer = last_tick;
skill_sit(&sd, false);
clif_standing(&sd.bl);
clif_standing(sd.bl);
}
break;
}
@ -12102,7 +12071,7 @@ void clif_parse_NpcClicked(int fd,map_session_data *sd)
switch (bl->type) {
case BL_MOB:
case BL_PC:
clif_parse_ActionRequest_sub( *sd, 0x07, bl->id, gettick() );
clif_parse_ActionRequest_sub( *sd, DMG_REPEAT, bl->id, gettick() );
break;
case BL_NPC:
#ifdef RENEWAL

View File

@ -861,10 +861,10 @@ void clif_delitem( map_session_data& sd, int index, int amount, short reason );
void clif_update_hp(map_session_data &sd);
void clif_updatestatus( map_session_data& sd, _sp type );
void clif_changemanner( map_session_data& sd );
int clif_damage(struct block_list* src, struct block_list* dst, t_tick tick, int sdelay, int ddelay, int64 sdamage, int div, enum e_damage_type type, int64 sdamage2, bool spdamage); // area
void clif_takeitem(struct block_list* src, struct block_list* dst);
void clif_sitting(struct block_list* bl);
void clif_standing(struct block_list* bl);
int clif_damage(block_list& src, block_list& dst, t_tick tick, int sdelay, int ddelay, int64 sdamage, int div, enum e_damage_type type, int64 sdamage2, bool spdamage); // area
void clif_takeitem(block_list& src, block_list& dst);
void clif_sitting(block_list& bl);
void clif_standing(block_list& bl);
void clif_sprite_change(struct block_list *bl, int id, int type, int val, int val2, enum send_target target);
void clif_changelook(struct block_list *bl,int type,int val); // area
void clif_changetraplook(struct block_list *bl,int val); // area
@ -900,7 +900,7 @@ void clif_divorced(map_session_data* sd, const char* name);
void clif_callpartner(map_session_data& sd);
void clif_playBGM( map_session_data& sd, const char* name );
void clif_soundeffect( struct block_list& bl, const char* name, int type, enum send_target target );
void clif_parse_ActionRequest_sub( map_session_data& sd, int action_type, int target_id, t_tick tick );
void clif_parse_ActionRequest_sub( map_session_data& sd, uint8 action_type, int target_id, t_tick tick );
void clif_parse_LoadEndAck(int fd,map_session_data *sd);
void clif_hotkeys_send(map_session_data *sd, int tab);

View File

@ -37,7 +37,6 @@
packet(0x0084,2);
parseable_packet(0x0085,5,clif_parse_WalkToXY,2);
parseable_packet(0x0089,7,clif_parse_ActionRequest,2,6);
packet(0x008a,29);
packet(0x008b,2);
parseable_packet(0x008c,-1,clif_parse_GlobalMessage,2,4);
packet(0x008d,-1);
@ -1021,11 +1020,6 @@
packet(0x029b,80);
#endif
// 2007-11-13aSakexe
#if PACKETVER >= 20071113
packet(0x02e1,33);
#endif
// 2007-11-20aSakexe
#if PACKETVER >= 20071120
//packet(0x01df,10 <- ???);
@ -1910,7 +1904,6 @@
packet(0x099a,9); // take_off_equipv5
packet(0x099b,8); //maptypeproperty2
// New Packets
packet(0x08C8,34); // ZC_NOTIFY_ACT3
packet(0x08ff,24); // ZC_EFST_SET_ENTER
packet(0x0984,28); // ZC_EFST_SET_ENTER2
packet(0x099f,22); // ZC_SKILL_ENTRY4

View File

@ -1934,7 +1934,7 @@ static bool mob_ai_sub_hard(struct mob_data *md, t_tick tick)
if (pcdb_checkid(md->vd->class_))
{ //Give them walk act/delay to properly mimic players. [Skotlex]
clif_takeitem(&md->bl,tbl);
clif_takeitem(md->bl,*tbl);
md->ud.canact_tick = tick + md->status.amotion;
unit_set_walkdelay(&md->bl, tick, md->status.amotion, 1);
}

View File

@ -1161,6 +1161,51 @@ struct PACKET_ZC_EL_PAR_CHANGE {
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_EL_PAR_CHANGE, 0x81e);
#if PACKETVER >= 20131223
struct PACKET_ZC_NOTIFY_ACT{
int16 packetType;
int32 srcID;
int32 targetID;
int32 serverTick;
int32 srcSpeed;
int32 dmgSpeed;
int32 damage;
int8 isSPDamage;
uint16 div;
uint8 type;
int32 damage2;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_NOTIFY_ACT, 0x8c8);
#elif PACKETVER >= 20071113
struct PACKET_ZC_NOTIFY_ACT{
int16 packetType;
int32 srcID;
int32 targetID;
int32 serverTick;
int32 srcSpeed;
int32 dmgSpeed;
int32 damage;
uint16 div;
uint8 type;
int32 damage2;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_NOTIFY_ACT, 0x2e1);
#else
struct PACKET_ZC_NOTIFY_ACT{
int16 packetType;
int32 srcID;
int32 targetID;
int32 serverTick;
int32 srcSpeed;
int32 dmgSpeed;
int16 damage;
uint16 div;
uint8 type;
int16 damage2;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_NOTIFY_ACT, 0x8a);
#endif
// 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

@ -6128,7 +6128,7 @@ bool pc_takeitem(map_session_data *sd,struct flooritem_data *fitem)
//Display pickup animation.
pc_stop_attack(sd);
clif_takeitem(&sd->bl,&fitem->bl);
clif_takeitem(sd->bl,fitem->bl);
if (fitem->mob_id &&
(itemdb_search(fitem->item.nameid))->flag.broadcast &&
@ -12969,7 +12969,7 @@ bool pc_setstand(map_session_data *sd, bool force){
status_change_end(&sd->bl, SC_TENSIONRELAX);
clif_status_load(&sd->bl,EFST_SIT,0);
clif_standing(&sd->bl); //Inform area PC is standing
clif_standing(sd->bl); //Inform area PC is standing
//Reset sitting tick.
sd->ssregen.tick.hp = sd->ssregen.tick.sp = 0;
if( pc_isdead( sd ) ){

View File

@ -15389,7 +15389,7 @@ BUILDIN_FUNC(skilleffect)
if (pc_issit(sd) && pc_setstand(sd, false)) {
skill_sit(sd, 0);
clif_standing(&sd->bl);
clif_standing(sd->bl);
}
}
@ -19910,7 +19910,7 @@ BUILDIN_FUNC(unitattack)
case BL_PC: {
map_session_data* sd = (map_session_data*)unit_bl;
clif_parse_ActionRequest_sub( *sd, actiontype > 0 ? 0x07 : 0x00, target_bl->id, gettick() );
clif_parse_ActionRequest_sub( *sd, actiontype > 0 ? DMG_REPEAT : DMG_NORMAL, target_bl->id, gettick() );
script_pushint(st, sd->ud.target == target_bl->id);
return SCRIPT_CMD_SUCCESS;
}
@ -23150,7 +23150,7 @@ BUILDIN_FUNC(sit)
if( !pc_issit(sd) ) {
pc_setsit(sd);
skill_sit(sd, 1);
clif_sitting(&sd->bl);
clif_sitting(sd->bl);
}
return SCRIPT_CMD_SUCCESS;
}
@ -23167,7 +23167,7 @@ BUILDIN_FUNC(stand)
if( pc_issit(sd) && pc_setstand(sd, false)) {
skill_sit(sd, 0);
clif_standing(&sd->bl);
clif_standing(sd->bl);
}
return SCRIPT_CMD_SUCCESS;

View File

@ -3821,7 +3821,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
case NPC_CRITICALSLASH:
case TF_DOUBLE:
case GS_CHAINACTION:
dmg.dmotion = clif_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,dmg.type,dmg.damage2,false);
dmg.dmotion = clif_damage(*src,*bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,dmg.type,dmg.damage2,false);
break;
case AS_SPLASHER:
@ -4050,7 +4050,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
devotion_damage -= devotion_damage * d_sc->getSCE(SC_REBOUND_S)->val2 / 100;
if (!rmdamage) {
clif_damage(d_bl, d_bl, gettick(), 0, 0, devotion_damage, 0, DMG_NORMAL, 0, false);
clif_damage(*d_bl, *d_bl, gettick(), 0, 0, devotion_damage, 0, DMG_NORMAL, 0, false);
battle_fix_damage(src, d_bl, devotion_damage, 0, 0);
} else {
bool isDevotRdamage = false;
@ -4060,7 +4060,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
// If !isDevotRdamage, reflected magics are done directly on the target not on paladin
// This check is only for magical skill.
// For BF_WEAPON skills types track var rdamage and function battle_calc_return_damage
clif_damage(bl, (!isDevotRdamage) ? bl : d_bl, gettick(), 0, 0, devotion_damage, 0, DMG_NORMAL, 0, false);
clif_damage(*bl, (!isDevotRdamage) ? *bl : *d_bl, gettick(), 0, 0, devotion_damage, 0, DMG_NORMAL, 0, false);
battle_fix_damage(bl, (!isDevotRdamage) ? bl : d_bl, devotion_damage, 0, 0);
}
} else {
@ -4714,7 +4714,7 @@ static TIMER_FUNC(skill_timerskill){
if( (tsd = ((TBL_PC*)target)) && !pc_issit(tsd) ) {
pc_setsit(tsd);
skill_sit(tsd, true);
clif_sitting(&tsd->bl);
clif_sitting(tsd->bl);
}
}
break;
@ -5008,7 +5008,7 @@ static int skill_tarotcard(struct block_list* src, struct block_list *target, ui
case 4: // THE CHARIOT - 1000 damage, random armor destroyed
{
battle_fix_damage(src, target, 1000, 0, skill_id);
clif_damage(src, target, tick, 0, 0, 1000, 0, DMG_NORMAL, 0, false);
clif_damage(*src, *target, tick, 0, 0, 1000, 0, DMG_NORMAL, 0, false);
if (!status_isdead(*target))
{
unsigned short where[] = { EQP_ARMOR, EQP_SHIELD, EQP_HELM };
@ -5062,7 +5062,7 @@ static int skill_tarotcard(struct block_list* src, struct block_list *target, ui
case 11: // THE DEVIL - 6666 damage, atk and matk halved, cursed
{
battle_fix_damage(src, target, 6666, 0, skill_id);
clif_damage(src, target, tick, 0, 0, 6666, 0, DMG_NORMAL, 0, false);
clif_damage(*src, *target, tick, 0, 0, 6666, 0, DMG_NORMAL, 0, false);
sc_start(src, target, SC_INCATKRATE, 100, -50, skill_get_time2(skill_id, skill_lv));
sc_start(src, target, SC_INCMATKRATE, 100, -50, skill_get_time2(skill_id, skill_lv));
sc_start(src, target, SC_CURSE, skill_lv, 100, skill_get_time2(status_db.getSkill(SC_CURSE), 1));
@ -5071,7 +5071,7 @@ static int skill_tarotcard(struct block_list* src, struct block_list *target, ui
case 12: // THE TOWER - 4444 damage
{
battle_fix_damage(src, target, 4444, 0, skill_id);
clif_damage(src, target, tick, 0, 0, 4444, 0, DMG_NORMAL, 0, false);
clif_damage(*src, *target, tick, 0, 0, 4444, 0, DMG_NORMAL, 0, false);
break;
}
case 13: // THE STAR - stun
@ -6130,7 +6130,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
break;
case CH_PALMSTRIKE: // Palm Strike takes effect 1sec after casting. [Skotlex]
// clif_skill_nodamage(src,bl,skill_id,skill_lv,0); //Can't make this one display the correct attack animation delay :/
clif_damage(src,bl,tick,status_get_amotion(src),0,-1,1,DMG_ENDURE,0,false); //Display an absorbed damage attack.
clif_damage(*src,*bl,tick,status_get_amotion(src),0,-1,1,DMG_ENDURE,0,false); //Display an absorbed damage attack.
skill_addtimerskill(src, tick + (1000+status_get_amotion(src)), bl->id, 0, 0, skill_id, skill_lv, BF_WEAPON, flag);
break;
@ -9379,7 +9379,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
// Commented because of duplicate animation [Lemongrass]
// At the moment this displays the pickup animation a second time
// If this is required in older clients, we need to add a version check here
//clif_takeitem(&sd->bl,&tbl);
//clif_takeitem(sd->bl,tbl);
eflag = pc_additem(sd,&item_tmp,1,LOG_TYPE_PRODUCE);
if(eflag) {
clif_additem(sd,0,0,eflag);
@ -9773,7 +9773,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
// If damage would be lethal, it does not deal damage
if (hp && hp < tstatus->hp) {
clif_damage(src, bl, tick, 0, 0, hp, 0, DMG_NORMAL, 0, false);
clif_damage(*src, *bl, tick, 0, 0, hp, 0, DMG_NORMAL, 0, false);
status_zap(bl, hp, 0);
// Recover 50% of damage dealt
status_heal(src, hp / 2, 0, 2);
@ -12267,7 +12267,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
if (!unit_blown_immune(bl, 0x1)) {
unit_movepos(bl,x,y,0,0);
if (bl->type == BL_PC && pc_issit((TBL_PC*)bl))
clif_sitting(bl); //Avoid sitting sync problem
clif_sitting(*bl); //Avoid sitting sync problem
clif_blown(bl);
map_foreachinallrange(unit_changetarget, src, AREA_SIZE, BL_CHAR, src, bl);
}
@ -20611,7 +20611,7 @@ bool skill_check_shadowform(struct block_list *bl, int64 damage, int hit)
return false;
}
status_damage(bl, src, damage, 0, clif_damage(src, src, gettick(), 500, 500, damage, hit, (hit > 1 ? DMG_MULTI_HIT : DMG_NORMAL), 0, false), 0, SC__SHADOWFORM);
status_damage(bl, src, damage, 0, clif_damage(*src, *src, gettick(), 500, 500, damage, hit, (hit > 1 ? DMG_MULTI_HIT : DMG_NORMAL), 0, false), 0, SC__SHADOWFORM);
if( sc && sc->getSCE(SC__SHADOWFORM) && (--sc->getSCE(SC__SHADOWFORM)->val3) <= 0 ) {
status_change_end(bl, SC__SHADOWFORM);
if( src->type == BL_PC )

View File

@ -11173,7 +11173,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
if (sd) {
pc_setsit(sd);
skill_sit(sd, true);
clif_sitting(&sd->bl);
clif_sitting(sd->bl);
}
val2 = 12; // SP cost
tick_time = 10000; // Decrease at 10secs intervals.
@ -11952,7 +11952,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
if( sd && !pc_issit(sd) ) {
pc_setsit(sd);
skill_sit(sd, true);
clif_sitting(bl);
clif_sitting(*bl);
}
break;
case SC_DANCEWITHWUG:
@ -13637,7 +13637,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
struct block_list* src = map_id2bl(sce->val2);
if( tid == -1 || !src)
break; // Terminated by Damage
status_fix_damage(src,bl,400*sce->val1,clif_damage(bl,bl,gettick(),0,0,400*sce->val1,0,DMG_NORMAL,0,false),WL_WHITEIMPRISON);
status_fix_damage(src,bl,400*sce->val1,clif_damage(*bl,*bl,gettick(),0,0,400*sce->val1,0,DMG_NORMAL,0,false),WL_WHITEIMPRISON);
}
break;
case SC_WUGDASH:
@ -13710,7 +13710,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
break;
case SC_GRAVITYCONTROL:
status_fix_damage(bl, bl, sce->val2, clif_damage(bl, bl, gettick(), 0, 0, sce->val2, 0, DMG_NORMAL, 0, false), 0);
status_fix_damage(bl, bl, sce->val2, clif_damage(*bl, *bl, gettick(), 0, 0, sce->val2, 0, DMG_NORMAL, 0, false), 0);
clif_specialeffect(bl, 223, AREA);
clif_specialeffect(bl, 330, AREA);
break;
@ -14064,7 +14064,7 @@ TIMER_FUNC(status_change_timer){
int64 damage = 1000 + (3 * status->max_hp) / 100; // Deals fixed (1000 + 3%*MaxHP)
map_freeblock_lock();
dounlock = true;
status_fix_damage(bl, bl, damage, clif_damage(bl, bl, tick, 0, 1, damage, 1, DMG_NORMAL, 0, false),0);
status_fix_damage(bl, bl, damage, clif_damage(*bl, *bl, tick, 0, 1, damage, 1, DMG_NORMAL, 0, false),0);
}
break;
@ -14073,7 +14073,7 @@ TIMER_FUNC(status_change_timer){
if (sce->val3 == 1) { // Target
map_freeblock_lock();
dounlock = true;
status_damage(bl, bl, 1, status->max_sp * 3 / 100, clif_damage(bl, bl, tick, status->amotion, status->dmotion + 500, 1, 1, DMG_NORMAL, 0, false), 0, 0);
status_damage(bl, bl, 1, status->max_sp * 3 / 100, clif_damage(*bl, *bl, tick, status->amotion, status->dmotion + 500, 1, 1, DMG_NORMAL, 0, false), 0, 0);
} else { // Caster
interval = 1000; // Assign here since status_get_sc_internval() contains the target interval.
@ -14132,7 +14132,7 @@ TIMER_FUNC(status_change_timer){
if (sce->val4 >= 0) {
map_freeblock_lock();
dounlock = true;
status_fix_damage(bl, bl, 100, clif_damage(bl, bl, tick, status->amotion, status->dmotion + 500, 100, 1, DMG_NORMAL, 0, false),0);
status_fix_damage(bl, bl, 100, clif_damage(*bl, *bl, tick, status->amotion, status->dmotion + 500, 100, 1, DMG_NORMAL, 0, false),0);
unit_skillcastcancel(bl, 2);
}
break;
@ -14142,7 +14142,7 @@ TIMER_FUNC(status_change_timer){
int64 damage = status->vit * (sce->val1 - 3) + (int)status->max_hp / 100; // {Target VIT x (New Poison Research Skill Level - 3)} + (Target HP/100)
map_freeblock_lock();
dounlock = true;
status_fix_damage(bl, bl, damage, clif_damage(bl, bl, tick, status->amotion, status->dmotion + 500, damage, 1, DMG_NORMAL, 0, false),0);
status_fix_damage(bl, bl, damage, clif_damage(*bl, *bl, tick, status->amotion, status->dmotion + 500, damage, 1, DMG_NORMAL, 0, false),0);
unit_skillcastcancel(bl, 2);
}
break;
@ -14669,7 +14669,7 @@ TIMER_FUNC(status_change_timer){
int damage = sce->val2;
map_freeblock_lock();
clif_damage(bl, bl, tick, 0, 0, damage, 1, DMG_MULTI_HIT_ENDURE, 0, false);
clif_damage(*bl, *bl, tick, 0, 0, damage, 1, DMG_MULTI_HIT_ENDURE, 0, false);
status_damage(src, bl, damage,0, 0, 1, 0);
if( sc->getSCE(type) ) {
sc_timer_next(2000 + tick);
@ -14691,7 +14691,7 @@ TIMER_FUNC(status_change_timer){
if( sd && !pc_issit(sd) ) { // Force to sit every 10 seconds.
pc_setsit(sd);
skill_sit(sd, true);
clif_sitting(bl);
clif_sitting(*bl);
}
sc_timer_next(10000 + tick);
return 0;

View File

@ -566,7 +566,7 @@ void vending_reopen( map_session_data& sd )
if( at->sit ) {
pc_setsit(&sd);
skill_sit(&sd, 1);
clif_sitting(&sd.bl);
clif_sitting(sd.bl);
}
// Immediate save