Converted ZC_NOTIFY_ACT to struct (#8571)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
This commit is contained in:
parent
baded8330f
commit
d5267c63a9
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
193
src/map/clif.cpp
193
src/map/clif.cpp
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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 )
|
||||
|
@ -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 ) ){
|
||||
|
@ -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;
|
||||
|
@ -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 )
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user