Compare commits

...

12 Commits

Author SHA1 Message Date
Lemongrass3110
d0b5466d25 Merge branch 'master' into cleanup/packets5
# Conflicts:
#	src/map/battle.cpp
#	src/map/clif.cpp
#	src/map/clif.hpp
#	src/map/clif_packetdb.hpp
#	src/map/packets.hpp
#	src/map/pet.cpp
#	src/map/script.cpp
#	src/map/skill.cpp
2024-09-15 02:48:47 +02:00
Atemo
f0f30dcca5 ZC_THROW_MVPITEM 2024-06-01 16:45:42 +02:00
Atemo
2a731b47dd ZC_MVP_GETTING_SPECIAL_EXP 2024-06-01 16:45:41 +02:00
Atemo
44f4964114 ZC_MVP 2024-06-01 16:45:39 +02:00
Atemo
b222412b07 ZC_BLADESTOP 2024-06-01 16:45:37 +02:00
Atemo
75f0634658 ZC_PET_ACT 2024-06-01 16:45:35 +02:00
Atemo
c0c8f2527c ZC_CHANGESTATE_PET 2024-06-01 16:45:33 +02:00
Atemo
a47f868be0 ZC_PROPERTY_PET 2024-06-01 16:45:31 +02:00
Atemo
11d84fb634 ZC_ACK_REQNAME_BYGID 2024-06-01 16:45:29 +02:00
Atemo
6edc930f4a WZ_ESTIMATION 2024-06-01 16:45:27 +02:00
Atemo
420635e7af ZC_NOTIFY_GROUNDSKILL 2024-06-01 16:45:25 +02:00
Atemo
f95829581f ZC_NOTIFY_SKILL 2024-06-01 16:45:23 +02:00
13 changed files with 447 additions and 440 deletions

View File

@ -3237,7 +3237,7 @@ ACMD_FUNC(petfriendly) {
} }
pet_set_intimate(pd, friendly); pet_set_intimate(pd, friendly);
clif_send_petstatus(sd); clif_send_petstatus( *sd, *pd );
clif_displaymessage(fd, msg_txt(sd,182)); // Pet intimacy changed. clif_displaymessage(fd, msg_txt(sd,182)); // Pet intimacy changed.
return 0; return 0;
} }
@ -3271,7 +3271,7 @@ ACMD_FUNC(pethungry)
} }
pd->pet.hungry = hungry; pd->pet.hungry = hungry;
clif_send_petstatus(sd); clif_send_petstatus( *sd, *pd );
clif_displaymessage(fd, msg_txt(sd,185)); // Pet hunger changed. clif_displaymessage(fd, msg_txt(sd,185)); // Pet hunger changed.
return 0; return 0;
@ -3296,7 +3296,7 @@ ACMD_FUNC(petrename)
pd->pet.rename_flag = 0; pd->pet.rename_flag = 0;
intif_save_petdata(sd->status.account_id, &pd->pet); intif_save_petdata(sd->status.account_id, &pd->pet);
clif_send_petstatus(sd); clif_send_petstatus( *sd, *pd );
clif_displaymessage(fd, msg_txt(sd,187)); // You can now rename your pet. clif_displaymessage(fd, msg_txt(sd,187)); // You can now rename your pet.
return 0; return 0;
@ -6313,13 +6313,13 @@ ACMD_FUNC(displayskill)
status_data* status = status_get_status_data(sd->bl); status_data* status = status_get_status_data(sd->bl);
tick = gettick(); tick = gettick();
if (type == 0 || type == 1) if (type == 0 || type == 1)
clif_skill_damage(&sd->bl, &sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( sd->bl, sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SINGLE );
if (type == 0 || type == 2) if (type == 0 || type == 2)
clif_skill_damage(&sd->bl, &sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SPLASH); clif_skill_damage( sd->bl, sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SPLASH );
if (type == 0 || type == 3) if (type == 0 || type == 3)
clif_skill_nodamage(&sd->bl, sd->bl, skill_id, skill_lv); clif_skill_nodamage(&sd->bl, sd->bl, skill_id, skill_lv);
if (type == 0 || type == 4) if (type == 0 || type == 4)
clif_skill_poseffect(&sd->bl, skill_id, skill_lv, sd->bl.x, sd->bl.y, tick); clif_skill_poseffect( sd->bl, skill_id, skill_lv, sd->bl.x, sd->bl.y, tick );
return 0; return 0;
} }
@ -7449,7 +7449,7 @@ ACMD_FUNC(summon)
clif_specialeffect(&md->bl,EF_ENTRY2,AREA); clif_specialeffect(&md->bl,EF_ENTRY2,AREA);
mob_spawn(md); mob_spawn(md);
sc_start4(nullptr,&md->bl, SC_MODECHANGE, 100, 1, 0, MD_AGGRESSIVE, 0, 60000); sc_start4(nullptr,&md->bl, SC_MODECHANGE, 100, 1, 0, MD_AGGRESSIVE, 0, 60000);
clif_skill_poseffect(&sd->bl,AM_CALLHOMUN,1,md->bl.x,md->bl.y,tick); clif_skill_poseffect( sd->bl, AM_CALLHOMUN, 1, md->bl.x, md->bl.y, tick );
clif_displaymessage(fd, msg_txt(sd,39)); // All monster summoned! clif_displaymessage(fd, msg_txt(sd,39)); // All monster summoned!
return 0; return 0;

View File

@ -7006,8 +7006,8 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo
rdamage = battle_calc_base_damage(target,tstatus,&tstatus->rhw,tsc,sstatus->size,0); rdamage = battle_calc_base_damage(target,tstatus,&tstatus->rhw,tsc,sstatus->size,0);
rdamage = (int64)rdamage * ratio / 100 + wd->damage * (10 + tsc->getSCE(SC_CRESCENTELBOW)->val1 * 20 / 10) / 10; rdamage = (int64)rdamage * ratio / 100 + wd->damage * (10 + tsc->getSCE(SC_CRESCENTELBOW)->val1 * 20 / 10) / 10;
skill_blown(target, src, skill_get_blewcount(SR_CRESCENTELBOW_AUTOSPELL, tsc->getSCE(SC_CRESCENTELBOW)->val1), unit_getdir(src), BLOWN_NONE); 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, 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 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); battle_fix_damage(target, src, rdamage, 0, SR_CRESCENTELBOW);
status_damage(src, target, rdamage/10, 0, 0, 1, 0); status_damage(src, target, rdamage/10, 0, 0, 1, 0);
@ -9507,7 +9507,7 @@ int64 battle_calc_return_damage(struct block_list* tbl, struct block_list *src,
int64 rd1 = i64min(damage, status_get_max_hp(tbl)) * tsc->getSCE(SC_DEATHBOUND)->val2 / 100; // Amplify damage. int64 rd1 = i64min(damage, status_get_max_hp(tbl)) * tsc->getSCE(SC_DEATHBOUND)->val2 / 100; // Amplify damage.
*dmg = rd1 * 30 / 100; // Received damage = 30% of amplified damage. *dmg = rd1 * 30 / 100; // Received damage = 30% of amplified damage.
clif_skill_damage(src, tbl, gettick(), status_get_amotion(src), 0, -30000, 1, RK_DEATHBOUND, tsc->getSCE(SC_DEATHBOUND)->val1, DMG_SINGLE); clif_skill_damage( *src, *tbl, gettick(), status_get_amotion(src), 0, -30000, 1, RK_DEATHBOUND, tsc->getSCE(SC_DEATHBOUND)->val1, DMG_SINGLE );
skill_blown(tbl, src, skill_get_blewcount(RK_DEATHBOUND, tsc->getSCE(SC_DEATHBOUND)->val1), unit_getdir(src), BLOWN_NONE); skill_blown(tbl, src, skill_get_blewcount(RK_DEATHBOUND, tsc->getSCE(SC_DEATHBOUND)->val1), unit_getdir(src), BLOWN_NONE);
status_change_end(tbl, SC_DEATHBOUND); status_change_end(tbl, SC_DEATHBOUND);
rdamage += rd1 * 70 / 100; // Target receives 70% of the amplified damage. [Rytech] rdamage += rd1 * 70 / 100; // Target receives 70% of the amplified damage. [Rytech]
@ -9901,7 +9901,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;
} }
@ -10106,7 +10106,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
s_elemental_data *ed = ((TBL_PC*)target)->ed; s_elemental_data *ed = ((TBL_PC*)target)->ed;
if (ed) { if (ed) {
clif_skill_damage(&ed->bl, target, tick, status_get_amotion(src), 0, -30000, 1, EL_CIRCLE_OF_FIRE, tsc->getSCE(SC_CIRCLE_OF_FIRE_OPTION)->val1, DMG_SINGLE); clif_skill_damage( ed->bl, *target, tick, status_get_amotion(src), 0, -30000, 1, EL_CIRCLE_OF_FIRE, tsc->getSCE(SC_CIRCLE_OF_FIRE_OPTION)->val1, DMG_SINGLE );
skill_attack(BF_WEAPON,&ed->bl,&ed->bl,src,EL_CIRCLE_OF_FIRE,tsc->getSCE(SC_CIRCLE_OF_FIRE_OPTION)->val1,tick,wd.flag); skill_attack(BF_WEAPON,&ed->bl,&ed->bl,src,EL_CIRCLE_OF_FIRE,tsc->getSCE(SC_CIRCLE_OF_FIRE_OPTION)->val1,tick,wd.flag);
} }
} }

View File

@ -1741,8 +1741,10 @@ int clif_spawn( struct block_list *bl, bool walking ){
} }
break; break;
case BL_PET: case BL_PET:
if (vd->head_bottom) if (vd->head_bottom) { // needed to display pet equip properly
clif_pet_equip_area((TBL_PET*)bl); // needed to display pet equip properly pet_data* pd = BL_CAST( BL_PET, bl );
clif_pet_equip_area( *pd );
}
break; break;
} }
return 0; return 0;
@ -2036,8 +2038,10 @@ void clif_move( struct unit_data& ud )
} }
break; break;
case BL_PET: case BL_PET:
if (vd->head_bottom) // needed to display pet equip properly if (vd->head_bottom) { // needed to display pet equip properly
clif_pet_equip_area(BL_CAST(BL_PET, bl)); pet_data* pd = reinterpret_cast<pet_data*>( bl );
clif_pet_equip_area( *pd );
}
break; break;
} }
@ -5049,8 +5053,10 @@ void clif_getareachar_unit( map_session_data* sd,struct block_list *bl ){
} }
break; break;
case BL_PET: case BL_PET:
if (vd->head_bottom) if (vd->head_bottom) { // needed to display pet equip properly
clif_pet_equip(sd, (TBL_PET*)bl); // needed to display pet equip properly pet_data* pd = BL_CAST( BL_PET, bl );
clif_pet_equip( sd, *pd );
}
break; break;
} }
} }
@ -5086,8 +5092,13 @@ static int clif_calc_walkdelay(struct block_list *bl,int delay, char type, int64
/*========================================== [Playtester] /*========================================== [Playtester]
* Returns hallucination damage the client displays * Returns hallucination damage the client displays
*------------------------------------------*/ *------------------------------------------*/
static int clif_hallucination_damage() static int64 clif_hallucination_damage( block_list& bl, int64 damage ){
{ status_change *sc;
if (!((sc = status_get_sc(&bl)) && sc->count && sc->getSCE(SC_HALLUCINATION) && damage)) {
return damage;
}
int digit = rnd() % 5 + 1; int digit = rnd() % 5 + 1;
switch (digit) switch (digit)
{ {
@ -5131,15 +5142,9 @@ int clif_damage(block_list& src, block_list& dst, t_tick tick, int sdelay, int d
if (type != DMG_MULTI_HIT_CRITICAL) if (type != DMG_MULTI_HIT_CRITICAL)
type = clif_calc_delay(type,div,damage+damage2,ddelay); type = clif_calc_delay(type,div,damage+damage2,ddelay);
status_change *sc = status_get_sc(&dst); damage = static_cast<int32>(clif_hallucination_damage( dst, damage ));
if (damage2)
if(sc && sc->count) { damage2 = static_cast<int32>(clif_hallucination_damage( dst, damage2 ));
if(sc->getSCE(SC_HALLUCINATION)) {
damage = 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 // 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) {
@ -5923,96 +5928,61 @@ void clif_skill_cooldown( map_session_data &sd, uint16 skill_id, t_tick tick ){
/// Skill attack effect and damage. /// Skill attack effect and damage.
/// 0114 <skill id>.W <src id>.L <dst id>.L <tick>.L <src delay>.L <dst delay>.L <damage>.W <level>.W <div>.W <type>.B (ZC_NOTIFY_SKILL) /// 0114 <skill id>.W <src id>.L <dst id>.L <tick>.L <src delay>.L <dst delay>.L <damage>.W <level>.W <div>.W <type>.B (ZC_NOTIFY_SKILL)
/// 01de <skill id>.W <src id>.L <dst id>.L <tick>.L <src delay>.L <dst delay>.L <damage>.L <level>.W <div>.W <type>.B (ZC_NOTIFY_SKILL2) /// 01de <skill id>.W <src id>.L <dst id>.L <tick>.L <src delay>.L <dst delay>.L <damage>.L <level>.W <div>.W <type>.B (ZC_NOTIFY_SKILL2)
int clif_skill_damage(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int64 sdamage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type) int clif_skill_damage( block_list& src, block_list& dst, t_tick tick, int32 sdelay, int32 ddelay, int64 sdamage, int32 div, uint16 skill_id, uint16 skill_lv, e_damage_type type ){
{ type = clif_calc_delay( type, div, sdamage, ddelay );
unsigned char buf[64]; sdamage = clif_hallucination_damage( dst, sdamage );
status_change *sc;
int damage = (int)cap_value(sdamage,INT_MIN,INT_MAX);
nullpo_ret(src); PACKET_ZC_NOTIFY_SKILL packet{};
nullpo_ret(dst);
type = clif_calc_delay(type,div,damage,ddelay); packet.PacketType = HEADER_ZC_NOTIFY_SKILL;
packet.SKID = skill_id;
packet.AID = src.id;
packet.targetID = dst.id;
packet.startTime = client_tick( tick );
packet.attackMT = sdelay;
packet.attackedMT = ddelay;
if( ( sc = status_get_sc(dst) ) && sc->count ) { auto damage = std::min( static_cast<decltype(packet.damage)>( sdamage ), std::numeric_limits<decltype(packet.damage)>::max() );
if(sc->getSCE(SC_HALLUCINATION) && damage)
damage = clif_hallucination_damage();
}
#if PACKETVER < 3 if (battle_config.hide_woe_damage && map_flag_gvg(src.m)) {
WBUFW(buf,0)=0x114; packet.damage = static_cast<decltype(packet.damage)>(damage ? div : 0);
WBUFW(buf,2)=skill_id;
WBUFL(buf,4)=src->id;
WBUFL(buf,8)=dst->id;
WBUFL(buf,12)=client_tick(tick);
WBUFL(buf,16)=sdelay;
WBUFL(buf,20)=ddelay;
if (battle_config.hide_woe_damage && map_flag_gvg(src->m)) {
WBUFW(buf,24)=damage?div:0;
} else { } else {
WBUFW(buf,24)=damage; packet.damage = damage;
} }
WBUFW(buf,26)=skill_lv; packet.level = skill_lv;
WBUFW(buf,28)=div; packet.count = static_cast<decltype(packet.count)>(div);
WBUFB(buf,30)=type;
if (disguised(dst)) {
clif_send(buf,packet_len(0x114),dst,AREA_WOS);
WBUFL(buf,8)=disguised_bl_id(dst->id);
clif_send(buf,packet_len(0x114),dst,SELF);
} else
clif_send(buf,packet_len(0x114),dst,AREA);
if(disguised(src)) {
WBUFL(buf,4)=disguised_bl_id(src->id);
if (disguised(dst))
WBUFL(buf,8)=dst->id;
if(damage > 0)
WBUFW(buf,24)=-1;
clif_send(buf,packet_len(0x114),src,SELF);
}
#else
WBUFW(buf,0)=0x1de;
WBUFW(buf,2)=skill_id;
WBUFL(buf,4)=src->id;
WBUFL(buf,8)=dst->id;
WBUFL(buf,12)=client_tick(tick);
WBUFL(buf,16)=sdelay;
WBUFL(buf,20)=ddelay;
if (battle_config.hide_woe_damage && map_flag_gvg(src->m)) {
WBUFL(buf,24)=damage?div:0;
} else {
WBUFL(buf,24)=damage;
}
WBUFW(buf,28)=skill_lv;
WBUFW(buf,30)=div;
// For some reason, late 2013 and newer clients have // For some reason, late 2013 and newer clients have
// a issue that causes players and monsters to endure // a issue that causes players and monsters to endure
// type 6 (ACTION_SKILL) skills. So we have to do a small // type 6 (ACTION_SKILL) skills. So we have to do a small
// hack to set all type 6 to be sent as type 8 ACTION_ATTACK_MULTIPLE // hack to set all type 6 to be sent as type 8 ACTION_ATTACK_MULTIPLE
#if PACKETVER < 20131223 #if PACKETVER < 20131223
WBUFB(buf,32)=type; packet.action = static_cast<decltype(packet.action)>(type);
#else #else
WBUFB(buf,32)=( type == DMG_SINGLE ) ? DMG_MULTI_HIT : type; packet.action = static_cast<decltype(packet.action)>(( type == DMG_SINGLE ) ? DMG_MULTI_HIT : type);
#endif #endif
if (disguised(dst)) {
clif_send(buf,packet_len(0x1de),dst,AREA_WOS);
WBUFL(buf,8)=disguised_bl_id(dst->id);
clif_send(buf,packet_len(0x1de),dst,SELF);
} else
clif_send(buf,packet_len(0x1de),dst,AREA);
if(disguised(src)) { if (disguised(&dst)) {
WBUFL(buf,4)=disguised_bl_id(src->id); clif_send( &packet, sizeof( packet ), &dst, AREA_WOS );
if (disguised(dst)) packet.targetID = disguised_bl_id( dst.id );
WBUFL(buf,8)=dst->id; clif_send( &packet, sizeof( packet ), &dst, SELF );
if(damage > 0) } else {
WBUFL(buf,24)=-1; clif_send( &packet, sizeof( packet ), &dst, AREA );
clif_send(buf,packet_len(0x1de),src,SELF); }
if (disguised(&src)) {
packet.AID = disguised_bl_id( src.id );
if (disguised(&dst)) {
packet.targetID = dst.id;
}
if (damage > 0) {
packet.damage = -1;
}
clif_send( &packet, sizeof( packet ), &src, SELF );
} }
#endif
//Because the damage delay must be synced with the client, here is where the can-walk tick must be updated. [Skotlex] //Because the damage delay must be synced with the client, here is where the can-walk tick must be updated. [Skotlex]
return clif_calc_walkdelay(dst,ddelay,type,damage,div); return clif_calc_walkdelay( &dst, ddelay, type, damage, div );
} }
@ -6022,19 +5992,14 @@ int clif_skill_damage(struct block_list *src,struct block_list *dst,t_tick tick,
int clif_skill_damage2(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int damage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type) int clif_skill_damage2(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int damage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type)
{ {
unsigned char buf[64]; unsigned char buf[64];
status_change *sc;
nullpo_ret(src); nullpo_ret(src);
nullpo_ret(dst); nullpo_ret(dst);
type = (type>DMG_NORMAL)?type:skill_get_hit(skill_id); type = (type>DMG_NORMAL)?type:skill_get_hit(skill_id);
type = clif_calc_delay(type,div,damage,ddelay); type = clif_calc_delay(type,div,damage,ddelay);
sc = status_get_sc(dst);
if(sc && sc->count) { damage = clif_hallucination_damage( *dst, damage );
if(sc->getSCE(SC_HALLUCINATION) && damage)
damage = clif_hallucination_damage();
}
WBUFW(buf,0)=0x115; WBUFW(buf,0)=0x115;
WBUFW(buf,2)=skill_id; WBUFW(buf,2)=skill_id;
@ -6110,28 +6075,27 @@ bool clif_skill_nodamage( block_list* src, block_list& dst, uint16 skill_id, int
return success; return success;
} }
/// Non-damaging ground skill effect.
/// 0117 <skill id>.W <src id>.L <level>.W <x>.W <y>.W <tick>.L (ZC_NOTIFY_GROUNDSKILL)
void clif_skill_poseffect( block_list& bl, uint16 skill_id, uint16 skill_lv, int32 x, int32 y, t_tick tick ){
PACKET_ZC_NOTIFY_GROUNDSKILL packet{};
/// Non-damaging ground skill effect (ZC_NOTIFY_GROUNDSKILL). packet.PacketType = HEADER_ZC_NOTIFY_GROUNDSKILL;
/// 0117 <skill id>.W <src id>.L <level>.W <x>.W <y>.W <tick>.L packet.SKID = skill_id;
void clif_skill_poseffect(struct block_list *src,uint16 skill_id,int val,int x,int y,t_tick tick) packet.AID = bl.id;
{ packet.level = skill_lv;
unsigned char buf[32]; packet.xPos = static_cast<decltype(packet.xPos)>( x );
packet.yPos = static_cast<decltype(packet.yPos)>( y );
packet.startTime = client_tick( tick );
nullpo_retv(src); if (disguised(&bl)) {
clif_send( &packet, sizeof( packet ), &bl, AREA_WOS );
WBUFW(buf,0)=0x117; packet.AID = disguised_bl_id( bl.id );
WBUFW(buf,2)=skill_id; clif_send( &packet, sizeof( packet ), &bl, SELF );
WBUFL(buf,4)=src->id; } else {
WBUFW(buf,8)=val; clif_send( &packet, sizeof( packet ), &bl, AREA );
WBUFW(buf,10)=x; }
WBUFW(buf,12)=y;
WBUFL(buf,14)=client_tick(tick);
if(disguised(src)) {
clif_send(buf,packet_len(0x117),src,AREA_WOS);
WBUFL(buf,4)=disguised_bl_id(src->id);
clif_send(buf,packet_len(0x117),src,SELF);
} else
clif_send(buf,packet_len(0x117),src,AREA);
} }
/// Presents a list of available warp destinations. /// Presents a list of available warp destinations.
@ -6241,38 +6205,33 @@ void clif_skill_teleportmessage( map_session_data& sd, e_notify_mapinfo_result r
} }
/// Displays Sense (WZ_ESTIMATION) information window (ZC_MONSTER_INFO). /// Displays Sense (WZ_ESTIMATION) information window.
/// 018c <class>.W <level>.W <size>.W <hp>.L <def>.W <race>.W <mdef>.W <element>.W /// 018c <class>.W <level>.W <size>.W <hp>.L <def>.W <race>.W <mdef>.W <element>.W
/// <water%>.B <earth%>.B <fire%>.B <wind%>.B <poison%>.B <holy%>.B <shadow%>.B <ghost%>.B <undead%>.B /// <water%>.B <earth%>.B <fire%>.B <wind%>.B <poison%>.B <holy%>.B <shadow%>.B <ghost%>.B <undead%>.B (ZC_MONSTER_INFO)
void clif_skill_estimation(map_session_data *sd,struct block_list *dst) void clif_skill_estimation( map_session_data& sd, mob_data& md ){
{ PACKET_ZC_MONSTER_INFO packet{};
unsigned char buf[64];
int i, fix;
nullpo_retv(sd); packet.packetType = HEADER_ZC_MONSTER_INFO;
nullpo_retv(dst); packet.class_ = md.vd->class_;
packet.level = static_cast<decltype(packet.level)>( md.level );
packet.size = md.status.size;
packet.hp = md.status.hp;
packet.def = static_cast<decltype(packet.def)>( ((battle_config.estimation_type&1) ? md.status.def : 0 ) + ((battle_config.estimation_type&2) ? md.status.def2 : 0 ) );
packet.race = md.status.race;
packet.mdef = static_cast<decltype(packet.mdef)>( ((battle_config.estimation_type&1) ? md.status.mdef : 0 ) + ((battle_config.estimation_type&2) ? md.status.mdef2 : 0 ) );
packet.element = md.status.def_ele;
// The following caps negative attributes to 0 since the client displays them as 255-fix. [Skotlex]
packet.water = static_cast<decltype(packet.water)>( std::max( elemental_attribute_db.getAttribute(md.status.ele_lv, 1, md.status.def_ele), (int16)0 ) );
packet.earth = static_cast<decltype(packet.earth)>( std::max( elemental_attribute_db.getAttribute(md.status.ele_lv, 2, md.status.def_ele), (int16)0 ) );
packet.fire = static_cast<decltype(packet.fire)>( std::max( elemental_attribute_db.getAttribute(md.status.ele_lv, 3, md.status.def_ele), (int16)0 ) );
packet.wind = static_cast<decltype(packet.wind)>( std::max( elemental_attribute_db.getAttribute(md.status.ele_lv, 4, md.status.def_ele), (int16)0 ) );
packet.poison = static_cast<decltype(packet.poison)>( std::max( elemental_attribute_db.getAttribute(md.status.ele_lv, 5, md.status.def_ele), (int16)0 ) );
packet.holy = static_cast<decltype(packet.holy)>( std::max( elemental_attribute_db.getAttribute(md.status.ele_lv, 6, md.status.def_ele), (int16)0 ) );
packet.shadow = static_cast<decltype(packet.shadow)>( std::max( elemental_attribute_db.getAttribute(md.status.ele_lv, 7, md.status.def_ele), (int16)0 ) );
packet.ghost = static_cast<decltype(packet.ghost)>( std::max( elemental_attribute_db.getAttribute(md.status.ele_lv, 8, md.status.def_ele), (int16)0 ) );
packet.undead = static_cast<decltype(packet.undead)>( std::max( elemental_attribute_db.getAttribute(md.status.ele_lv, 9, md.status.def_ele), (int16)0 ) );
if( dst->type != BL_MOB ) clif_send( &packet, sizeof( packet ), &sd.bl, (sd.status.party_id > 0) ? PARTY_SAMEMAP : SELF );
return;
status_data* status = status_get_status_data(*dst);
WBUFW(buf, 0)=0x18c;
WBUFW(buf, 2)=status_get_class(dst);
WBUFW(buf, 4)=status_get_lv(dst);
WBUFW(buf, 6)=status->size;
WBUFL(buf, 8)=status->hp;
WBUFW(buf,12)= (battle_config.estimation_type&1?status->def:0)
+(battle_config.estimation_type&2?status->def2:0);
WBUFW(buf,14)=status->race;
WBUFW(buf,16)= (battle_config.estimation_type&1?status->mdef:0)
+(battle_config.estimation_type&2?status->mdef2:0);
WBUFW(buf,18)= status->def_ele;
for(i=0;i<9;i++)
// The following caps negative attributes to 0 since the client displays them as 255-fix. [Skotlex]
WBUFB(buf,20+i)= (unsigned char)((fix=elemental_attribute_db.getAttribute(status->ele_lv, i+1, status->def_ele))<0?0:fix);
clif_send(buf,packet_len(0x18c),&sd->bl,sd->status.party_id>0?PARTY_SAMEMAP:SELF);
} }
@ -6987,25 +6946,20 @@ void clif_wis_end( map_session_data& sd, e_ack_whisper result ){
} }
/// Returns character name requested by char_id (ZC_ACK_REQNAME_BYGID). /// Returns character name requested by char_id.
/// 0194 <char id>.L <name>.24B /// 0194 <char id>.L <name>.24B (ZC_ACK_REQNAME_BYGID)
/// 0af7 <flag>.W <char id>.L <name>.24B /// 0af7 <flag>.W <char id>.L <name>.24B (ZC_ACK_REQNAME_BYGID)
void clif_solved_charname(int fd, int charid, const char* name) void clif_solved_charname( map_session_data& sd, uint32 charid, const char* name ){
{ PACKET_ZC_ACK_REQNAME_BYGID packet{};
packet.packetType = HEADER_ZC_ACK_REQNAME_BYGID;
#if PACKETVER >= 20180221 #if PACKETVER >= 20180221
WFIFOHEAD(fd,packet_len(0xaf7)); packet.flag = name[0] ? 3 : 2;
WFIFOW(fd,0) = 0xaf7;
WFIFOW(fd,2) = name[0] ? 3 : 2;
WFIFOL(fd,4) = charid;
safestrncpy(WFIFOCP(fd, 8), name, NAME_LENGTH);
WFIFOSET(fd,packet_len(0x0af7));
#else
WFIFOHEAD(fd,packet_len(0x194));
WFIFOW(fd,0)=0x194;
WFIFOL(fd,2)=charid;
safestrncpy(WFIFOCP(fd,6), name, NAME_LENGTH);
WFIFOSET(fd,packet_len(0x194));
#endif #endif
packet.CID = charid;
safestrncpy( packet.name, name, NAME_LENGTH );
clif_send( &packet, sizeof( packet ), &sd.bl, SELF );
} }
@ -8139,7 +8093,7 @@ void clif_movetoattack( map_session_data& sd, block_list& bl ){
void clif_produceeffect(map_session_data* sd,int flag, t_itemid nameid){ void clif_produceeffect(map_session_data* sd,int flag, t_itemid nameid){
nullpo_retv( sd ); nullpo_retv( sd );
clif_solved_charname( sd->fd, sd->status.char_id, sd->status.name ); clif_solved_charname( *sd, sd->status.char_id, sd->status.name );
PACKET_ZC_ACK_REQMAKINGITEM p = {}; PACKET_ZC_ACK_REQMAKINGITEM p = {};
@ -8207,8 +8161,8 @@ void clif_sendegg(map_session_data *sd)
} }
/// Sends a specific pet data update (ZC_CHANGESTATE_PET). /// Sends a specific pet data update.
/// 01a4 <type>.B <id>.L <data>.L /// 01a4 <type>.B <id>.L <data>.L (ZC_CHANGESTATE_PET)
/// type: /// type:
/// 0 = pre-init (data = 0) /// 0 = pre-init (data = 0)
/// 1 = intimacy (data = 0~4) /// 1 = intimacy (data = 0~4)
@ -8219,66 +8173,53 @@ void clif_sendegg(map_session_data *sd)
/// 6 = close egg selection ui and update egg in inventory (PACKETVER >= 20180704) /// 6 = close egg selection ui and update egg in inventory (PACKETVER >= 20180704)
/// ///
/// If sd is null, the update is sent to nearby objects, otherwise it is sent only to that player. /// If sd is null, the update is sent to nearby objects, otherwise it is sent only to that player.
void clif_send_petdata(map_session_data* sd, struct pet_data* pd, int type, int param) void clif_send_petdata( map_session_data* sd, pet_data& pd, e_changestate_pet data_type, int32 value ){
{ PACKET_ZC_CHANGESTATE_PET packet{};
uint8 buf[16];
nullpo_retv(pd);
WBUFW(buf,0) = 0x1a4; packet.PacketType = HEADER_ZC_CHANGESTATE_PET;
WBUFB(buf,2) = type; packet.type = static_cast<decltype(packet.type)>( data_type );
WBUFL(buf,3) = pd->bl.id; packet.GID = pd.bl.id;
WBUFL(buf,7) = param; packet.data = value;
if (sd)
clif_send(buf, packet_len(0x1a4), &sd->bl, SELF); if (sd != nullptr)
clif_send( &packet, sizeof( packet ), &sd->bl, SELF );
else else
clif_send(buf, packet_len(0x1a4), &pd->bl, AREA); clif_send( &packet, sizeof( packet ), &pd.bl, AREA );
} }
/// Pet's base data (ZC_PROPERTY_PET). /// Pet's base data.
/// 01a2 <name>.24B <renamed>.B <level>.W <hunger>.W <intimacy>.W <accessory id>.W <class>.W /// 01a2 <name>.24B <renamed>.B <level>.W <hunger>.W <intimacy>.W <accessory id>.W <class>.W (ZC_PROPERTY_PET)
void clif_send_petstatus(map_session_data *sd) void clif_send_petstatus( map_session_data& sd, pet_data& pd ){
{ PACKET_ZC_PROPERTY_PET packet{};
int fd;
struct s_pet *pet;
nullpo_retv(sd); packet.PacketType = HEADER_ZC_PROPERTY_PET;
nullpo_retv(sd->pd); safestrncpy( packet.szName, pd.pet.name, NAME_LENGTH );
packet.bModified = battle_config.pet_rename ? 0 : pd.pet.rename_flag;
fd=sd->fd; packet.nLevel = pd.pet.level;
pet = &sd->pd->pet; packet.nFullness = pd.pet.hungry;
WFIFOHEAD(fd,packet_len(0x1a2)); packet.nRelationship = pd.pet.intimate;
WFIFOW(fd,0)=0x1a2; packet.ITID = static_cast<decltype(packet.ITID)>( pd.pet.equip );
safestrncpy(WFIFOCP(fd,2),pet->name,NAME_LENGTH);
WFIFOB(fd,26)=battle_config.pet_rename?0:pet->rename_flag;
WFIFOW(fd,27)=pet->level;
WFIFOW(fd,29)=pet->hungry;
WFIFOW(fd,31)=pet->intimate;
WFIFOW(fd,33)=pet->equip;
#if PACKETVER >= 20081126 #if PACKETVER >= 20081126
WFIFOW(fd,35)=pet->class_; packet.job = pd.pet.class_;
#endif #endif
WFIFOSET(fd,packet_len(0x1a2));
clif_send( &packet, sizeof( packet ), &sd.bl, SELF );
} }
/// Notification about a pet's emotion/talk (ZC_PET_ACT). /// Notification about a pet's emotion/talk.
/// 01aa <id>.L <data>.L /// 01aa <id>.L <data>.L (ZC_PET_ACT)
/// data: /// data:
/// @see CZ_PET_ACT. /// @see CZ_PET_ACT.
void clif_pet_emotion(struct pet_data *pd,int param) void clif_pet_emotion( pet_data& pd, int32 param ){
{ PACKET_ZC_PET_ACT packet{};
unsigned char buf[16];
nullpo_retv(pd); packet.packetType = HEADER_ZC_PET_ACT;
packet.GID = pd.bl.id;
packet.data = param;
memset(buf,0,packet_len(0x1aa)); clif_send( &packet, sizeof( packet ), &pd.bl, AREA );
WBUFW(buf,0)=0x1aa;
WBUFL(buf,2)=pd->bl.id;
WBUFL(buf,6)=param;
clif_send(buf,packet_len(0x1aa),&pd->bl,AREA);
} }
@ -8453,52 +8394,46 @@ 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);
} }
/// MVP effect (ZC_MVP). /// MVP effect.
/// 010c <account id>.L /// 010c <account id>.L (ZC_MVP)
void clif_mvp_effect(map_session_data *sd) void clif_mvp_effect( map_session_data& sd ){
{ PACKET_ZC_MVP packet{};
unsigned char buf[16];
nullpo_retv(sd); packet.packetType = HEADER_ZC_MVP;
packet.AID = sd.bl.id;
WBUFW(buf,0)=0x10c; clif_send( &packet, sizeof( packet ), &sd.bl, AREA );
WBUFL(buf,2)=sd->bl.id;
clif_send(buf,packet_len(0x10c),&sd->bl,AREA);
} }
@ -8514,41 +8449,36 @@ void clif_mvp_item( map_session_data *sd, t_itemid nameid ){
} }
/// MVP EXP reward message (ZC_MVP_GETTING_SPECIAL_EXP). /// MVP EXP reward message.
/// 010b <exp>.L /// 010b <exp>.L (ZC_MVP_GETTING_SPECIAL_EXP)
void clif_mvp_exp(map_session_data *sd, t_exp exp) { void clif_mvp_exp( map_session_data& sd, t_exp exp ){
#if PACKETVER >= 20131223 // Kro remove this packet [Napster] #if PACKETVER >= 20131223 // Kro remove this packet [Napster]
if (battle_config.mvp_exp_reward_message) { if (battle_config.mvp_exp_reward_message) {
char e_msg[CHAT_SIZE_MAX]; char e_msg[CHAT_SIZE_MAX];
sprintf(e_msg, msg_txt(sd, 717), exp); sprintf(e_msg, msg_txt(&sd, 717), exp);
clif_messagecolor(&sd->bl, color_table[COLOR_CYAN], e_msg, false, SELF); // Congratulations! You are the MVP! Your reward EXP Points are %u !! clif_messagecolor( &sd.bl, color_table[COLOR_CYAN], e_msg, false, SELF ); // Congratulations! You are the MVP! Your reward EXP Points are %u !!
} }
#else #else
int fd; PACKET_ZC_MVP_GETTING_SPECIAL_EXP packet{};
nullpo_retv(sd); packet.packetType = HEADER_ZC_MVP_GETTING_SPECIAL_EXP;
packet.exp = std::min( static_cast<decltype(packet.exp)>( exp ), MAX_EXP );
fd = sd->fd; clif_send( &packet, sizeof( packet ), &sd.bl, SELF );
WFIFOHEAD(fd, packet_len(0x10b));
WFIFOW(fd,0) = 0x10b;
WFIFOL(fd,2) = (uint32)u64min( exp, MAX_EXP );
WFIFOSET(fd, packet_len(0x10b));
#endif #endif
} }
/// Dropped MVP item reward message (ZC_THROW_MVPITEM). /// Dropped MVP item reward message.
/// 010d /// 010d (ZC_THROW_MVPITEM)
/// ///
/// "You are the MVP, but cannot obtain the reward because /// "You are the MVP, but cannot obtain the reward because you are overweight."
/// you are overweight." void clif_mvp_noitem( map_session_data& sd ){
void clif_mvp_noitem(map_session_data* sd) PACKET_ZC_THROW_MVPITEM packet{};
{
int fd = sd->fd;
WFIFOHEAD(fd,packet_len(0x10d)); packet.packetType = HEADER_ZC_THROW_MVPITEM;
WFIFOW(fd,0) = 0x10d;
WFIFOSET(fd,packet_len(0x10d)); clif_send( &packet, sizeof( packet ), &sd.bl, SELF );
} }
@ -10771,8 +10701,8 @@ void clif_parse_LoadEndAck(int fd,map_session_data *sd)
if(map_addblock(&sd->pd->bl)) if(map_addblock(&sd->pd->bl))
return; return;
clif_spawn(&sd->pd->bl); clif_spawn(&sd->pd->bl);
clif_send_petdata(sd,sd->pd,0,0); clif_send_petdata( sd, *sd->pd, CHANGESTATEPET_INIT, 0 );
clif_send_petstatus(sd); clif_send_petstatus( *sd, *sd->pd );
// skill_unit_move(&sd->pd->bl,gettick(),1); // skill_unit_move(&sd->pd->bl,gettick(),1);
} }
} }
@ -10847,7 +10777,7 @@ void clif_parse_LoadEndAck(int fd,map_session_data *sd)
} }
if(sd->pd && sd->pd->pet.intimate > 900) if(sd->pd && sd->pd->pet.intimate > 900)
clif_pet_emotion(sd->pd,(sd->pd->pet.class_ - 100)*100 + 50 + pet_hungry_val(sd->pd)); clif_pet_emotion( *sd->pd, (sd->pd->pet.class_ - 100)*100 + 50 + pet_hungry_val(sd->pd) );
if(hom_is_active(sd->hd)) if(hom_is_active(sd->hd))
hom_init_timers(sd->hd); hom_init_timers(sd->hd);
@ -14540,7 +14470,7 @@ void clif_parse_SelectEgg(int fd, map_session_data *sd){
void clif_parse_SendEmotion(int fd, map_session_data *sd) void clif_parse_SendEmotion(int fd, map_session_data *sd)
{ {
if(sd->pd) if(sd->pd)
clif_pet_emotion(sd->pd,RFIFOL(fd,packet_db[RFIFOW(fd,0)].pos[0])); clif_pet_emotion( *sd->pd, RFIFOL(fd,packet_db[RFIFOW(fd,0)].pos[0]) );
} }

View File

@ -815,6 +815,16 @@ enum e_ack_additem_to_cart : uint8 {
ADDITEM_TO_CART_FAIL_COUNT = 1 ADDITEM_TO_CART_FAIL_COUNT = 1
}; };
enum e_changestate_pet : uint8 {
CHANGESTATEPET_INIT = 0,
CHANGESTATEPET_INTIMACY = 1,
CHANGESTATEPET_HUNGER = 2,
CHANGESTATEPET_ACCESSORY = 3,
CHANGESTATEPET_PERFORMANCE = 4,
CHANGESTATEPET_HAIRSTYLE = 5,
CHANGESTATEPET_UPDATE_EGG = 6,
};
int clif_setip(const char* ip); int clif_setip(const char* ip);
void clif_setbindip(const char* ip); void clif_setbindip(const char* ip);
void clif_setport(uint16 port); void clif_setport(uint16 port);
@ -939,11 +949,11 @@ void clif_skillcasting(struct block_list* bl, int src_id, int dst_id, int dst_x,
void clif_skillcastcancel( block_list& bl ); void clif_skillcastcancel( block_list& bl );
void clif_skill_fail( map_session_data& sd, uint16 skill_id, enum useskill_fail_cause cause = USESKILL_FAIL_LEVEL, int btype = 0, t_itemid itemId = 0 ); void clif_skill_fail( map_session_data& sd, uint16 skill_id, enum useskill_fail_cause cause = USESKILL_FAIL_LEVEL, int btype = 0, t_itemid itemId = 0 );
void clif_skill_cooldown( map_session_data &sd, uint16 skill_id, t_tick tick ); void clif_skill_cooldown( map_session_data &sd, uint16 skill_id, t_tick tick );
int clif_skill_damage(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int64 sdamage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type); int clif_skill_damage( block_list& src, block_list& dst, t_tick tick, int32 sdelay, int32 ddelay, int64 sdamage, int32 div, uint16 skill_id, uint16 skill_lv, e_damage_type type );
//int clif_skill_damage2(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int damage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type); //int clif_skill_damage2(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int damage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type);
bool clif_skill_nodamage( block_list* src, block_list& dst, uint16 skill_id, int32 heal, bool success = true ); bool clif_skill_nodamage( block_list* src, block_list& dst, uint16 skill_id, int32 heal, bool success = true );
void clif_skill_poseffect(struct block_list *src,uint16 skill_id,int val,int x,int y,t_tick tick); void clif_skill_poseffect( block_list& bl, uint16 skill_id, uint16 skill_lv, int32 x, int32 y, t_tick tick );
void clif_skill_estimation(map_session_data *sd,struct block_list *dst); void clif_skill_estimation( map_session_data& sd, mob_data& md );
void clif_skill_warppoint( map_session_data& sd, uint16 skill_id, uint16 skill_lv, std::vector<std::string>& maps ); void clif_skill_warppoint( map_session_data& sd, uint16 skill_id, uint16 skill_lv, std::vector<std::string>& maps );
void clif_skill_memomessage( map_session_data& sd, e_ack_remember_warppoint_result result ); void clif_skill_memomessage( map_session_data& sd, e_ack_remember_warppoint_result result );
void clif_skill_teleportmessage( map_session_data& sd, e_notify_mapinfo_result result ); void clif_skill_teleportmessage( map_session_data& sd, e_notify_mapinfo_result result );
@ -964,8 +974,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)
@ -976,7 +986,7 @@ void clif_efst_status_change_sub(struct block_list *tbl, struct block_list *bl,
void clif_wis_message(map_session_data* sd, const char* nick, const char* mes, size_t mes_len, int gmlvl); void clif_wis_message(map_session_data* sd, const char* nick, const char* mes, size_t mes_len, int gmlvl);
void clif_wis_end( map_session_data& sd, e_ack_whisper result ); void clif_wis_end( map_session_data& sd, e_ack_whisper result );
void clif_solved_charname(int fd, int charid, const char* name); void clif_solved_charname( map_session_data& sd, uint32 charid, const char* name );
void clif_name( struct block_list* src, struct block_list *bl, send_target target ); void clif_name( struct block_list* src, struct block_list *bl, send_target target );
#define clif_name_self(bl) clif_name( (bl), (bl), SELF ) #define clif_name_self(bl) clif_name( (bl), (bl), SELF )
#define clif_name_area(bl) clif_name( (bl), (bl), AREA ) #define clif_name_area(bl) clif_name( (bl), (bl), AREA )
@ -1004,10 +1014,10 @@ void clif_hat_effect_single( map_session_data& sd, uint16 effectId, bool enable
void clif_item_skill(map_session_data *sd,uint16 skill_id,uint16 skill_lv); void clif_item_skill(map_session_data *sd,uint16 skill_id,uint16 skill_lv);
void clif_mvp_effect(map_session_data *sd); void clif_mvp_effect( map_session_data& sd );
void clif_mvp_item(map_session_data *sd, t_itemid nameid); void clif_mvp_item(map_session_data *sd, t_itemid nameid);
void clif_mvp_exp(map_session_data *sd, t_exp exp); void clif_mvp_exp( map_session_data& sd, t_exp exp );
void clif_mvp_noitem(map_session_data* sd); void clif_mvp_noitem( map_session_data& sd );
void clif_changed_dir(block_list& bl, enum send_target target); void clif_changed_dir(block_list& bl, enum send_target target);
// vending // vending
@ -1114,12 +1124,11 @@ void clif_upgrademessage( map_session_data* sd, int result, t_itemid item_id );
void clif_catch_process( map_session_data& sd ); void clif_catch_process( map_session_data& sd );
void clif_pet_roulette( map_session_data& sd, bool success ); void clif_pet_roulette( map_session_data& sd, bool success );
void clif_sendegg(map_session_data *sd); void clif_sendegg(map_session_data *sd);
void clif_send_petstatus(map_session_data *sd); void clif_send_petstatus( map_session_data& sd, pet_data& pd );
void clif_send_petdata(map_session_data* sd, struct pet_data* pd, int type, int param); void clif_send_petdata( map_session_data* sd, pet_data& pd, e_changestate_pet data_type, int32 value );
#define clif_pet_equip(sd, pd) clif_send_petdata(sd, pd, 3, (pd)->vd.head_bottom) #define clif_pet_equip(sd, pd) clif_send_petdata(sd, pd, CHANGESTATEPET_ACCESSORY, (pd).vd.head_bottom)
#define clif_pet_equip_area(pd) clif_send_petdata(nullptr, pd, 3, (pd)->vd.head_bottom) #define clif_pet_equip_area(pd) clif_send_petdata(nullptr, pd, CHANGESTATEPET_ACCESSORY, (pd).vd.head_bottom)
#define clif_pet_performance(pd, param) clif_send_petdata(nullptr, pd, 4, param) void clif_pet_emotion( pet_data& pd, int32 param );
void clif_pet_emotion(struct pet_data *pd,int param);
void clif_pet_food( map_session_data& sd, int32 foodid, bool success ); void clif_pet_food( map_session_data& sd, int32 foodid, bool success );
void clif_pet_autofeed_status(map_session_data* sd, bool force); void clif_pet_autofeed_status(map_session_data* sd, bool force);

View File

@ -118,9 +118,6 @@
parseable_packet(0x0108,-1,clif_parse_PartyMessage,2,4); parseable_packet(0x0108,-1,clif_parse_PartyMessage,2,4);
packet(0x0109,-1); packet(0x0109,-1);
packet( HEADER_ZC_MVP_GETTING_ITEM, sizeof( struct PACKET_ZC_MVP_GETTING_ITEM ) ); packet( HEADER_ZC_MVP_GETTING_ITEM, sizeof( struct PACKET_ZC_MVP_GETTING_ITEM ) );
packet(0x010b,6);
packet(0x010c,6);
packet(0x010d,2);
packet(0x010e,11); packet(0x010e,11);
packet(0x010f,-1); packet(0x010f,-1);
packet( HEADER_ZC_ACK_TOUSESKILL, sizeof( PACKET_ZC_ACK_TOUSESKILL ) ); packet( HEADER_ZC_ACK_TOUSESKILL, sizeof( PACKET_ZC_ACK_TOUSESKILL ) );
@ -130,7 +127,6 @@
packet(0x0114,31); packet(0x0114,31);
packet(0x0115,35); packet(0x0115,35);
parseable_packet(0x0116,10,clif_parse_UseSkillToPos,2,4,6,8); parseable_packet(0x0116,10,clif_parse_UseSkillToPos,2,4,6,8);
packet(0x0117,18);
parseable_packet(0x0118,2,clif_parse_StopAttack,0); parseable_packet(0x0118,2,clif_parse_StopAttack,0);
packet(0x0119,13); packet(0x0119,13);
parseable_packet(0x011b,20,clif_parse_UseSkillMap,2,4); parseable_packet(0x011b,20,clif_parse_UseSkillMap,2,4);
@ -201,14 +197,12 @@
packet(0x0187,6); packet(0x0187,6);
parseable_packet(0x018a,4,clif_parse_QuitGame,2); parseable_packet(0x018a,4,clif_parse_QuitGame,2);
packet(0x018b,4); packet(0x018b,4);
packet(0x018c,29);
parseable_packet( HEADER_CZ_REQMAKINGITEM, sizeof( struct PACKET_CZ_REQMAKINGITEM ), clif_parse_ProduceMix, 0 ); parseable_packet( HEADER_CZ_REQMAKINGITEM, sizeof( struct PACKET_CZ_REQMAKINGITEM ), clif_parse_ProduceMix, 0 );
packet( HEADER_ZC_ACK_REQMAKINGITEM, sizeof( PACKET_ZC_ACK_REQMAKINGITEM ) ); packet( HEADER_ZC_ACK_REQMAKINGITEM, sizeof( PACKET_ZC_ACK_REQMAKINGITEM ) );
parseable_packet(0x0190,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10); parseable_packet(0x0190,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
packet( HEADER_ZC_TALKBOX_CHATCONTENTS, sizeof( struct PACKET_ZC_TALKBOX_CHATCONTENTS ) ); packet( HEADER_ZC_TALKBOX_CHATCONTENTS, sizeof( struct PACKET_ZC_TALKBOX_CHATCONTENTS ) );
packet(0x0192,24); packet(0x0192,24);
parseable_packet(0x0193,6,clif_parse_SolveCharName,2); parseable_packet(0x0193,6,clif_parse_SolveCharName,2);
packet(0x0194,30);
packet( HEADER_ZC_ACK_REQNAMEALL, sizeof( struct PACKET_ZC_ACK_REQNAMEALL ) ); packet( HEADER_ZC_ACK_REQNAMEALL, sizeof( struct PACKET_ZC_ACK_REQNAMEALL ) );
packet(0x0196,9); packet(0x0196,9);
parseable_packet(0x0197,4,clif_parse_ResetChar,2); parseable_packet(0x0197,4,clif_parse_ResetChar,2);
@ -219,15 +213,12 @@
parseable_packet(0x019d,6,clif_parse_GMHide,2); parseable_packet(0x019d,6,clif_parse_GMHide,2);
parseable_packet(0x019f,6,clif_parse_CatchPet,2); parseable_packet(0x019f,6,clif_parse_CatchPet,2);
parseable_packet(0x01a1,3,clif_parse_PetMenu,2); parseable_packet(0x01a1,3,clif_parse_PetMenu,2);
packet(0x01a2,35);
packet(0x01a3,5); packet(0x01a3,5);
packet(0x01a4,11);
parseable_packet(0x01a5,26,clif_parse_ChangePetName,2); parseable_packet(0x01a5,26,clif_parse_ChangePetName,2);
packet(0x01a6,-1); packet(0x01a6,-1);
parseable_packet(0x01a7,4,clif_parse_SelectEgg,2); parseable_packet(0x01a7,4,clif_parse_SelectEgg,2);
packet(0x01a8,4); packet(0x01a8,4);
parseable_packet(0x01a9,6,clif_parse_SendEmotion,2); parseable_packet(0x01a9,6,clif_parse_SendEmotion,2);
packet(0x01aa,10);
packet(0x01ac,6); packet(0x01ac,6);
packet(0x01ad,-1); packet(0x01ad,-1);
parseable_packet( HEADER_CZ_REQ_MAKINGARROW, sizeof( PACKET_CZ_REQ_MAKINGARROW ), clif_parse_SelectArrow, 0 ); parseable_packet( HEADER_CZ_REQ_MAKINGARROW, sizeof( PACKET_CZ_REQ_MAKINGARROW ), clif_parse_SelectArrow, 0 );
@ -257,8 +248,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);
@ -1208,7 +1197,6 @@
// 2008-11-26aSakexe // 2008-11-26aSakexe
#if PACKETVER >= 20081126 #if PACKETVER >= 20081126
packet(0x01a2,37);
packet(0x0441,4); packet(0x0441,4);
#endif #endif
@ -1286,7 +1274,6 @@
// 2008-12-17aRagexeRE // 2008-12-17aRagexeRE
#if PACKETVER >= 20081217 #if PACKETVER >= 20081217
packet(0x01a2,37);
#endif #endif
// 2008-12-17bRagexeRE // 2008-12-17bRagexeRE
@ -1999,7 +1986,6 @@
// 2018-02-21aRagexeRE or 2018-02-21bRagexeRE // 2018-02-21aRagexeRE or 2018-02-21bRagexeRE
#if PACKETVER >= 20180221 #if PACKETVER >= 20180221
packet(0x0206,35); // ZC_FRIENDS_STATE packet(0x0206,35); // ZC_FRIENDS_STATE
packet(0x0af7,32);
#endif #endif
// 2018-03-07bRagexeRE // 2018-03-07bRagexeRE

View File

@ -1979,8 +1979,8 @@ void map_addnickdb(int charid, const char* nick)
req = p->requests; req = p->requests;
p->requests = req->next; p->requests = req->next;
sd = map_charid2sd(req->charid); sd = map_charid2sd(req->charid);
if( sd ) if( sd != nullptr )
clif_solved_charname(sd->fd, charid, p->nick); clif_solved_charname( *sd, charid, p->nick );
aFree(req); aFree(req);
} }
} }
@ -2001,8 +2001,8 @@ void map_delnickdb(int charid, const char* name)
req = p->requests; req = p->requests;
p->requests = req->next; p->requests = req->next;
sd = map_charid2sd(req->charid); sd = map_charid2sd(req->charid);
if( sd ) if( sd != nullptr )
clif_solved_charname(sd->fd, charid, name); clif_solved_charname( *sd, charid, name );
aFree(req); aFree(req);
} }
aFree(p); aFree(p);
@ -2020,16 +2020,16 @@ void map_reqnickdb(map_session_data * sd, int charid)
nullpo_retv(sd); nullpo_retv(sd);
tsd = map_charid2sd(charid); tsd = map_charid2sd(charid);
if( tsd ) if( tsd != nullptr )
{ {
clif_solved_charname(sd->fd, charid, tsd->status.name); clif_solved_charname( *sd, charid, tsd->status.name );
return; return;
} }
p = (struct charid2nick*)idb_ensure(nick_db, charid, create_charid2nick); p = (struct charid2nick*)idb_ensure(nick_db, charid, create_charid2nick);
if( *p->nick ) if( *p->nick )
{ {
clif_solved_charname(sd->fd, charid, p->nick); clif_solved_charname( *sd, charid, p->nick );
return; return;
} }
// not in cache, request it // not in cache, request it

View File

@ -3052,7 +3052,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
t_itemid log_mvp_nameid = 0; t_itemid log_mvp_nameid = 0;
t_exp log_mvp_exp = 0; t_exp log_mvp_exp = 0;
clif_mvp_effect( mvp_sd ); clif_mvp_effect( *mvp_sd );
//mapflag: noexp check [Lorky] //mapflag: noexp check [Lorky]
if( md->db->mexp > 0 && !( map_getmapflag( m, MF_NOBASEEXP ) || type&2 ) ){ if( md->db->mexp > 0 && !( map_getmapflag( m, MF_NOBASEEXP ) || type&2 ) ){
@ -3074,7 +3074,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
log_mvp_exp = cap_value( log_mvp_exp, 1, MAX_EXP ); log_mvp_exp = cap_value( log_mvp_exp, 1, MAX_EXP );
clif_mvp_exp( mvp_sd, log_mvp_exp ); clif_mvp_exp( *mvp_sd, log_mvp_exp );
pc_gainexp( mvp_sd, &md->bl, log_mvp_exp, 0, 0 ); pc_gainexp( mvp_sd, &md->bl, log_mvp_exp, 0, 0 );
} }

View File

@ -1356,6 +1356,87 @@ struct PACKET_ZC_NOTIFY_ACT{
DEFINE_PACKET_HEADER(ZC_NOTIFY_ACT, 0x8a); DEFINE_PACKET_HEADER(ZC_NOTIFY_ACT, 0x8a);
#endif #endif
struct PACKET_ZC_MONSTER_INFO {
int16 packetType;
uint16 class_;
uint16 level;
uint16 size;
uint32 hp;
int16 def;
uint16 race;
int16 mdef;
uint16 element;
uint8 water;
uint8 earth;
uint8 fire;
uint8 wind;
uint8 poison;
uint8 holy;
uint8 shadow;
uint8 ghost;
uint8 undead;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_MONSTER_INFO, 0x18c);
#if PACKETVER >= 20180221
struct PACKET_ZC_ACK_REQNAME_BYGID {
int16 packetType;
uint16 flag;
uint32 CID;
char name[NAME_LENGTH];
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_ACK_REQNAME_BYGID, 0xaf7);
#else
struct PACKET_ZC_ACK_REQNAME_BYGID {
int16 packetType;
uint32 CID;
char name[NAME_LENGTH];
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_ACK_REQNAME_BYGID, 0x194);
#endif
struct PACKET_ZC_PET_ACT {
int16 packetType;
uint32 GID;
int32 data;
} __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);
struct PACKET_ZC_MVP {
int16 packetType;
uint32 AID;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_MVP, 0x10c);
// Kro remove this packet [Napster]
#if PACKETVER < 20131223
struct PACKET_ZC_MVP_GETTING_SPECIAL_EXP {
int16 packetType;
uint32 exp;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_MVP_GETTING_SPECIAL_EXP, 0x10b);
#endif
struct PACKET_ZC_THROW_MVPITEM {
int16 packetType;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_THROW_MVPITEM, 0x10d);
// 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

@ -9713,7 +9713,7 @@ int pc_dead(map_session_data *sd,struct block_list *src)
struct pet_data *pd = sd->pd; struct pet_data *pd = sd->pd;
if( !mapdata->getMapFlag(MF_NOEXPPENALTY) ) { if( !mapdata->getMapFlag(MF_NOEXPPENALTY) ) {
pet_set_intimate(pd, pd->pet.intimate + pd->get_pet_db()->die); pet_set_intimate(pd, pd->pet.intimate + pd->get_pet_db()->die);
clif_send_petdata(sd,sd->pd,1,pd->pet.intimate); clif_send_petdata( sd, *sd->pd, CHANGESTATEPET_INTIMACY, pd->pet.intimate );
} }
if( sd->pd->target_id ) // Unlock all targets... if( sd->pd->target_id ) // Unlock all targets...
pet_unlocktarget(sd->pd); pet_unlocktarget(sd->pd);

View File

@ -865,11 +865,11 @@ static TIMER_FUNC(pet_hungry){
} }
status_calc_pet(pd,SCO_NONE); status_calc_pet(pd,SCO_NONE);
clif_send_petdata(sd,pd,1,pd->pet.intimate); clif_send_petdata( sd, *pd, CHANGESTATEPET_INTIMACY, pd->pet.intimate );
interval = 20000; // While starving, it's every 20 seconds interval = 20000; // While starving, it's every 20 seconds
} }
clif_send_petdata(sd,pd,2,pd->pet.hungry); clif_send_petdata( sd, *pd, CHANGESTATEPET_HUNGER, pd->pet.hungry );
if( battle_config.feature_pet_autofeed && pd->pet.autofeed && pd->pet.hungry <= battle_config.feature_pet_autofeed_rate ){ if( battle_config.feature_pet_autofeed && pd->pet.autofeed && pd->pet.hungry <= battle_config.feature_pet_autofeed_rate ){
pet_food( sd, pd ); pet_food( sd, pd );
@ -940,7 +940,7 @@ static int pet_performance(map_session_data *sd, struct pet_data *pd)
val = 1; val = 1;
pet_stop_walking(pd,2000<<8); pet_stop_walking(pd,2000<<8);
clif_pet_performance(pd, rnd_value(1, val)); clif_send_petdata( nullptr, *pd, CHANGESTATEPET_PERFORMANCE, rnd_value(1, val) );
pet_lootitem_drop( *pd, nullptr ); pet_lootitem_drop( *pd, nullptr );
return 1; return 1;
@ -966,7 +966,7 @@ bool pet_return_egg( map_session_data *sd, struct pet_data *pd ){
pd->pet.incubate = 1; pd->pet.incubate = 1;
#if PACKETVER >= 20180704 #if PACKETVER >= 20180704
clif_inventorylist(sd); clif_inventorylist(sd);
clif_send_petdata(sd, pd, 6, 0); clif_send_petdata( sd, *pd, CHANGESTATEPET_UPDATE_EGG, 0 );
#endif #endif
unit_free(&pd->bl,CLR_OUTSIGHT); unit_free(&pd->bl,CLR_OUTSIGHT);
@ -1108,13 +1108,13 @@ int pet_birth_process(map_session_data *sd, struct s_pet *pet)
return 1; return 1;
clif_spawn(&sd->pd->bl); clif_spawn(&sd->pd->bl);
clif_send_petdata(sd,sd->pd, 0,0); clif_send_petdata( sd, *sd->pd, CHANGESTATEPET_INIT, 0 );
clif_send_petdata(sd,sd->pd, 5,battle_config.pet_hair_style); clif_send_petdata( sd, *sd->pd, CHANGESTATEPET_HAIRSTYLE, battle_config.pet_hair_style );
#if PACKETVER >= 20180704 #if PACKETVER >= 20180704
clif_send_petdata(sd, sd->pd, 6, 1); clif_send_petdata( sd, *sd->pd, CHANGESTATEPET_UPDATE_EGG, 1 );
#endif #endif
clif_pet_equip_area(sd->pd); clif_pet_equip_area( *sd->pd );
clif_send_petstatus(sd); clif_send_petstatus( *sd, *sd->pd );
clif_pet_autofeed_status(sd,true); clif_pet_autofeed_status(sd,true);
} }
@ -1169,10 +1169,10 @@ int pet_recv_petdata(uint32 account_id,struct s_pet *p,int flag)
return 1; return 1;
clif_spawn(&sd->pd->bl); clif_spawn(&sd->pd->bl);
clif_send_petdata(sd,sd->pd,0,0); clif_send_petdata( sd, *sd->pd, CHANGESTATEPET_INIT, 0 );
clif_send_petdata(sd,sd->pd,5,battle_config.pet_hair_style); clif_send_petdata( sd, *sd->pd, CHANGESTATEPET_HAIRSTYLE, battle_config.pet_hair_style );
clif_pet_equip_area(sd->pd); clif_pet_equip_area( *sd->pd );
clif_send_petstatus(sd); clif_send_petstatus( *sd, *sd->pd );
} }
} }
@ -1414,7 +1414,7 @@ int pet_menu(map_session_data *sd,int menunum)
switch(menunum) { switch(menunum) {
case 0: case 0:
clif_send_petstatus(sd); clif_send_petstatus( *sd, *sd->pd );
break; break;
case 1: case 1:
pet_food(sd, sd->pd); pet_food(sd, sd->pd);
@ -1477,15 +1477,15 @@ int pet_change_name_ack(map_session_data *sd, char* name, int flag)
if ( !flag || !strlen(name) ) { if ( !flag || !strlen(name) ) {
clif_displaymessage(sd->fd, msg_txt(sd,280)); // You cannot use this name for your pet. clif_displaymessage(sd->fd, msg_txt(sd,280)); // You cannot use this name for your pet.
clif_send_petstatus(sd); //Send status so client knows pet name change got rejected. clif_send_petstatus( *sd, *pd ); //Send status so client knows pet name change got rejected.
return 0; return 0;
} }
safestrncpy(pd->pet.name, name, NAME_LENGTH); safestrncpy(pd->pet.name, name, NAME_LENGTH);
clif_name_area(&pd->bl); clif_name_area(&pd->bl);
pd->pet.rename_flag = 1; pd->pet.rename_flag = 1;
clif_pet_equip_area(pd); clif_pet_equip_area( *pd );
clif_send_petstatus(sd); clif_send_petstatus( *sd, *pd );
int index = pet_egg_search( sd, pd->pet.pet_id ); int index = pet_egg_search( sd, pd->pet.pet_id );
@ -1529,7 +1529,7 @@ int pet_equipitem(map_session_data *sd,int index)
pc_delitem(sd,index,1,0,0,LOG_TYPE_OTHER); pc_delitem(sd,index,1,0,0,LOG_TYPE_OTHER);
pd->pet.equip = nameid; pd->pet.equip = nameid;
status_set_viewdata(&pd->bl, pd->pet.class_); //Updates view_data. status_set_viewdata(&pd->bl, pd->pet.class_); //Updates view_data.
clif_pet_equip_area(pd); clif_pet_equip_area( *pd );
if (battle_config.pet_equip_required) { // Skotlex: start support timers if need if (battle_config.pet_equip_required) { // Skotlex: start support timers if need
t_tick tick = gettick(); t_tick tick = gettick();
@ -1582,7 +1582,7 @@ static int pet_unequipitem(map_session_data *sd, struct pet_data *pd)
pd->pet.equip = 0; pd->pet.equip = 0;
status_set_viewdata(&pd->bl, pd->pet.class_); status_set_viewdata(&pd->bl, pd->pet.class_);
clif_pet_equip_area(pd); clif_pet_equip_area(*pd);
if( battle_config.pet_equip_required ) { // Skotlex: halt support timers if needed if( battle_config.pet_equip_required ) { // Skotlex: halt support timers if needed
if( pd->state.skillbonus ) { if( pd->state.skillbonus ) {
@ -1660,8 +1660,8 @@ int pet_food(map_session_data *sd, struct pet_data *pd)
log_feeding(sd, LOG_FEED_PET, pet_db_ptr->FoodID); log_feeding(sd, LOG_FEED_PET, pet_db_ptr->FoodID);
clif_send_petdata(sd,pd,2,pd->pet.hungry); clif_send_petdata( sd, *pd, CHANGESTATEPET_HUNGER, pd->pet.hungry );
clif_send_petdata(sd,pd,1,pd->pet.intimate); clif_send_petdata( sd, *pd, CHANGESTATEPET_INTIMACY, pd->pet.intimate );
clif_pet_food( *sd, pet_db_ptr->FoodID, 1 ); clif_pet_food( *sd, pet_db_ptr->FoodID, 1 );
return 0; return 0;
@ -2324,10 +2324,10 @@ void pet_evolution(map_session_data *sd, int16 pet_id) {
return; return;
clif_spawn(&sd->pd->bl); clif_spawn(&sd->pd->bl);
clif_send_petdata(sd, sd->pd, 0, 0); clif_send_petdata( sd, *sd->pd, CHANGESTATEPET_INIT, 0 );
clif_send_petdata(sd, sd->pd, 5, battle_config.pet_hair_style); clif_send_petdata( sd, *sd->pd, CHANGESTATEPET_HAIRSTYLE, battle_config.pet_hair_style );
clif_pet_equip_area(sd->pd); clif_pet_equip_area( *sd->pd );
clif_send_petstatus(sd); clif_send_petstatus( *sd, *sd->pd );
clif_emotion(&sd->bl, ET_BEST); clif_emotion(&sd->bl, ET_BEST);
clif_specialeffect(&sd->pd->bl, EF_HO_UP, AREA); clif_specialeffect(&sd->pd->bl, EF_HO_UP, AREA);

View File

@ -15340,13 +15340,13 @@ BUILDIN_FUNC(petskillsupport)
static inline void script_skill_effect( block_list& bl, uint16 skill_id, uint16 skill_lv, int16 x, int16 y ) { static inline void script_skill_effect( block_list& bl, uint16 skill_id, uint16 skill_lv, int16 x, int16 y ) {
switch (skill_get_casttype(skill_id)) { switch (skill_get_casttype(skill_id)) {
case CAST_GROUND: case CAST_GROUND:
clif_skill_poseffect(&bl, skill_id, skill_lv, x, y, gettick()); clif_skill_poseffect( bl, skill_id, skill_lv, x, y, gettick() );
break; break;
case CAST_NODAMAGE: case CAST_NODAMAGE:
clif_skill_nodamage(&bl, bl, skill_id, skill_lv); clif_skill_nodamage(&bl, bl, skill_id, skill_lv);
break; break;
case CAST_DAMAGE: case CAST_DAMAGE:
clif_skill_damage(&bl, &bl, gettick(), status_get_amotion(&bl), status_get_dmotion(&bl), 0, 1, skill_id, skill_lv, skill_get_hit(skill_id)); clif_skill_damage( bl, bl, gettick(), status_get_amotion(&bl), status_get_dmotion(&bl), 0, 1, skill_id, skill_lv, skill_get_hit(skill_id) );
break; break;
} }
} }
@ -16488,7 +16488,7 @@ BUILDIN_FUNC(summon)
check_event(st, event); check_event(st, event);
} }
clif_skill_poseffect(&sd->bl,AM_CALLHOMUN,1,sd->bl.x,sd->bl.y,tick); clif_skill_poseffect( sd->bl, AM_CALLHOMUN, 1, sd->bl.x, sd->bl.y, tick );
md = mob_once_spawn_sub(&sd->bl, sd->bl.m, sd->bl.x, sd->bl.y, str, _class, event, SZ_SMALL, AI_NONE); md = mob_once_spawn_sub(&sd->bl, sd->bl.m, sd->bl.x, sd->bl.y, str, _class, event, SZ_SMALL, AI_NONE);
if (md) { if (md) {
@ -19386,8 +19386,8 @@ BUILDIN_FUNC(setunitdata)
case UPET_MAPID: if (mapname) value = map_mapname2mapid(mapname); unit_warp(bl, (short)value, 0, 0, CLR_TELEPORT); break; case UPET_MAPID: if (mapname) value = map_mapname2mapid(mapname); unit_warp(bl, (short)value, 0, 0, CLR_TELEPORT); break;
case UPET_X: if (!unit_walktoxy(bl, (short)value, pd->bl.y, 2)) unit_movepos(bl, (short)value, pd->bl.y, 0, 0); break; case UPET_X: if (!unit_walktoxy(bl, (short)value, pd->bl.y, 2)) unit_movepos(bl, (short)value, pd->bl.y, 0, 0); break;
case UPET_Y: if (!unit_walktoxy(bl, pd->bl.x, (short)value, 2)) unit_movepos(bl, pd->bl.x, (short)value, 0, 0); break; case UPET_Y: if (!unit_walktoxy(bl, pd->bl.x, (short)value, 2)) unit_movepos(bl, pd->bl.x, (short)value, 0, 0); break;
case UPET_HUNGER: pd->pet.hungry = cap_value((short)value, 0, 100); clif_send_petdata(map_id2sd(pd->pet.account_id), pd, 2, pd->pet.hungry); break; case UPET_HUNGER: pd->pet.hungry = cap_value((short)value, 0, 100); clif_send_petdata( map_id2sd(pd->pet.account_id), *pd, CHANGESTATEPET_HUNGER, pd->pet.hungry ); break;
case UPET_INTIMACY: pet_set_intimate(pd, (unsigned int)value); clif_send_petdata(map_id2sd(pd->pet.account_id), pd, 1, pd->pet.intimate); break; case UPET_INTIMACY: pet_set_intimate(pd, (unsigned int)value); clif_send_petdata( map_id2sd(pd->pet.account_id), *pd, CHANGESTATEPET_INTIMACY, pd->pet.intimate ); break;
case UPET_SPEED: pd->status.speed = (unsigned short)value; status_calc_misc(bl, &pd->status, pd->pet.level); break; case UPET_SPEED: pd->status.speed = (unsigned short)value; status_calc_misc(bl, &pd->status, pd->pet.level); break;
case UPET_LOOKDIR: unit_setdir(bl, (uint8)value); break; case UPET_LOOKDIR: unit_setdir(bl, (uint8)value); break;
case UPET_CANMOVETICK: pd->ud.canmove_tick = value > 0 ? (unsigned int)value : 0; break; case UPET_CANMOVETICK: pd->ud.canmove_tick = value > 0 ? (unsigned int)value : 0; break;
@ -19422,7 +19422,7 @@ BUILDIN_FUNC(setunitdata)
} }
// Client information update // Client information update
clif_send_petstatus( pd->master ); clif_send_petstatus( *pd->master, *pd );
} break; } break;
case BL_MER: { case BL_MER: {

View File

@ -3361,7 +3361,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 );
} }
} }
@ -3736,7 +3736,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
nbl = battle_getenemyarea(bl,bl->x,bl->y,2,BL_CHAR,bl->id); nbl = battle_getenemyarea(bl,bl->x,bl->y,2,BL_CHAR,bl->id);
if( nbl ){ // Only one target is chosen. if( nbl ){ // Only one target is chosen.
damage = damage / 2; // Deflect half of the damage to a target nearby damage = damage / 2; // Deflect half of the damage to a target nearby
clif_skill_damage(bl, nbl, tick, status_get_amotion(src), 0, battle_fix_damage(bl,nbl,damage,0,0), dmg.div_, OB_OBOROGENSOU_TRANSITION_ATK, -1, DMG_SINGLE); clif_skill_damage( *bl, *nbl, tick, status_get_amotion(src), 0, battle_fix_damage(bl,nbl,damage,0,0), dmg.div_, OB_OBOROGENSOU_TRANSITION_ATK, -1, DMG_SINGLE );
} }
} }
@ -3809,7 +3809,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
//Display damage. //Display damage.
switch( skill_id ) { switch( skill_id ) {
case PA_GOSPEL: //Should look like Holy Cross [Skotlex] case PA_GOSPEL: //Should look like Holy Cross [Skotlex]
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, CR_HOLYCROSS, -1, DMG_SPLASH); dmg.dmotion = clif_skill_damage( *src, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, CR_HOLYCROSS, -1, DMG_SPLASH );
break; break;
//Skills that need be passed as a normal attack for the client to display correctly. //Skills that need be passed as a normal attack for the client to display correctly.
case HVAN_EXPLOSION: case HVAN_EXPLOSION:
@ -3827,12 +3827,12 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
case AS_SPLASHER: case AS_SPLASHER:
if( flag&SD_ANIMATION ) // the surrounding targets if( flag&SD_ANIMATION ) // the surrounding targets
dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SPLASH); // needs -1 as skill level dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SPLASH ); // needs -1 as skill level
else // the central target doesn't display an animation else // the central target doesn't display an animation
dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, DMG_SPLASH); // needs -2(!) as skill level dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, DMG_SPLASH ); // needs -2(!) as skill level
break; break;
case SR_EARTHSHAKER: case SR_EARTHSHAKER:
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,1,skill_id,-2,DMG_SINGLE); dmg.dmotion = clif_skill_damage( *src, *bl, tick, dmg.amotion, dmg.dmotion, damage, 1, skill_id, -2, DMG_SINGLE );
break; break;
case WL_SOULEXPANSION: case WL_SOULEXPANSION:
case WL_COMET: case WL_COMET:
@ -3841,19 +3841,19 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
#ifndef RENEWAL #ifndef RENEWAL
case NJ_HUUMA: case NJ_HUUMA:
#endif #endif
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,skill_lv,DMG_MULTI_HIT); dmg.dmotion = clif_skill_damage( *src, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, skill_lv, DMG_MULTI_HIT );
break; break;
case WL_CHAINLIGHTNING_ATK: case WL_CHAINLIGHTNING_ATK:
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,1,WL_CHAINLIGHTNING_ATK,-2,DMG_SINGLE); dmg.dmotion = clif_skill_damage( *src, *bl, tick, dmg.amotion, dmg.dmotion, damage, 1, WL_CHAINLIGHTNING_ATK, -2, DMG_SINGLE );
break; break;
case WL_TETRAVORTEX_FIRE: case WL_TETRAVORTEX_FIRE:
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, WL_TETRAVORTEX_WIND, -1, DMG_SPLASH); dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, WL_TETRAVORTEX_WIND, -1, DMG_SPLASH );
break; break;
case LG_SHIELDPRESS: case LG_SHIELDPRESS:
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, status_get_amotion(src), dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SINGLE); dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, status_get_amotion(src), dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SINGLE );
break; break;
case NPC_EARTHQUAKE: case NPC_EARTHQUAKE:
dmg.dmotion = clif_skill_damage(src, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_ENDURE); dmg.dmotion = clif_skill_damage( *src, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_ENDURE );
break; break;
case NPC_DARKPIERCING: case NPC_DARKPIERCING:
case EL_FIRE_BOMB: case EL_FIRE_BOMB:
@ -3875,19 +3875,19 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
case KO_BAKURETSU: case KO_BAKURETSU:
case GN_HELLS_PLANT_ATK: case GN_HELLS_PLANT_ATK:
case SU_SV_ROOTTWIST_ATK: case SU_SV_ROOTTWIST_ATK:
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,-1,DMG_SPLASH); dmg.dmotion = clif_skill_damage( *src, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SPLASH );
break; break;
case GN_FIRE_EXPANSION_ACID: case GN_FIRE_EXPANSION_ACID:
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, CR_ACIDDEMONSTRATION, skill_lv, DMG_MULTI_HIT); dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, CR_ACIDDEMONSTRATION, skill_lv, DMG_MULTI_HIT );
break; break;
case GN_SLINGITEM_RANGEMELEEATK: case GN_SLINGITEM_RANGEMELEEATK:
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,GN_SLINGITEM,-2,DMG_SINGLE); dmg.dmotion = clif_skill_damage( *src, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, GN_SLINGITEM, -2, DMG_SINGLE );
break; break;
case EL_STONE_RAIN: case EL_STONE_RAIN:
dmg.dmotion = clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,-1,(flag&1)?DMG_MULTI_HIT:DMG_SPLASH); dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, (flag&1) ? DMG_MULTI_HIT : DMG_SPLASH );
break; break;
case WM_SEVERE_RAINSTORM_MELEE: case WM_SEVERE_RAINSTORM_MELEE:
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,WM_SEVERE_RAINSTORM,-2,DMG_SPLASH); dmg.dmotion = clif_skill_damage( *src, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, WM_SEVERE_RAINSTORM, -2, DMG_SPLASH );
break; break;
case HT_CLAYMORETRAP: case HT_CLAYMORETRAP:
case HT_BLASTMINE: case HT_BLASTMINE:
@ -3896,20 +3896,20 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
case RA_CLUSTERBOMB: case RA_CLUSTERBOMB:
case RA_FIRINGTRAP: case RA_FIRINGTRAP:
case RA_ICEBOUNDTRAP: case RA_ICEBOUNDTRAP:
dmg.dmotion = clif_skill_damage(src, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, (flag&SD_LEVEL) ? -1 : skill_lv, DMG_SPLASH); dmg.dmotion = clif_skill_damage( *src, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, (flag&SD_LEVEL) ? -1 : skill_lv, DMG_SPLASH );
if( dsrc != src ) // avoid damage display redundancy if( dsrc != src ) // avoid damage display redundancy
break; break;
[[fallthrough]]; [[fallthrough]];
case HT_LANDMINE: case HT_LANDMINE:
dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, dmg_type); dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, dmg_type );
break; break;
case WZ_SIGHTBLASTER: case WZ_SIGHTBLASTER:
//Sightblaster should never call clif_skill_damage twice //Sightblaster should never call clif_skill_damage twice
dmg.dmotion = clif_skill_damage(src, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, (flag&SD_LEVEL) ? -1 : skill_lv, DMG_SPLASH); dmg.dmotion = clif_skill_damage( *src, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, (flag&SD_LEVEL) ? -1 : skill_lv, DMG_SPLASH );
break; break;
case RL_R_TRIP_PLUSATK: case RL_R_TRIP_PLUSATK:
case RL_S_STORM: case RL_S_STORM:
dmg.dmotion = clif_skill_damage(dsrc,bl,tick,status_get_amotion(src),dmg.dmotion,damage,dmg.div_,skill_id,-1,DMG_SPLASH); dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, status_get_amotion(src), dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SPLASH );
break; break;
case SU_LUNATICCARROTBEAT: case SU_LUNATICCARROTBEAT:
case SU_LUNATICCARROTBEAT2: case SU_LUNATICCARROTBEAT2:
@ -3922,31 +3922,31 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
clif_skill_nodamage(dsrc, *bl, skill_id, skill_lv); clif_skill_nodamage(dsrc, *bl, skill_id, skill_lv);
[[fallthrough]]; [[fallthrough]];
case WM_REVERBERATION: case WM_REVERBERATION:
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, dmg_type); dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, dmg_type );
break; break;
case SJ_FALLINGSTAR_ATK: case SJ_FALLINGSTAR_ATK:
case SJ_FALLINGSTAR_ATK2: case SJ_FALLINGSTAR_ATK2:
dmg.dmotion = clif_skill_damage(src,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, DMG_MULTI_HIT); dmg.dmotion = clif_skill_damage( *src, *bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, DMG_MULTI_HIT );
break; break;
case SJ_NOVAEXPLOSING: case SJ_NOVAEXPLOSING:
dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, DMG_SINGLE); dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, DMG_SINGLE );
break; break;
case DK_HACKANDSLASHER_ATK: case DK_HACKANDSLASHER_ATK:
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, dmg_type); dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, dmg_type );
break; break;
case AG_STORM_CANNON: case AG_STORM_CANNON:
case AG_CRIMSON_ARROW: case AG_CRIMSON_ARROW:
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, skill_lv, DMG_SPLASH); dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, skill_lv, DMG_SPLASH );
break; break;
case TR_ROSEBLOSSOM_ATK: case TR_ROSEBLOSSOM_ATK:
case ABC_FROM_THE_ABYSS_ATK: case ABC_FROM_THE_ABYSS_ATK:
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SPLASH); dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SPLASH );
break; break;
case TR_SOUNDBLEND: case TR_SOUNDBLEND:
if (flag&SD_ANIMATION)// For some reason the caster reacts on the splash flag. Best reduce amotion to minimize it for now. [Rytech] if (flag&SD_ANIMATION)// For some reason the caster reacts on the splash flag. Best reduce amotion to minimize it for now. [Rytech]
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, 10, dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SPLASH); dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, 10, dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SPLASH );
else else
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, skill_lv, dmg_type); dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, skill_lv, dmg_type );
break; break;
case AB_DUPLELIGHT_MELEE: case AB_DUPLELIGHT_MELEE:
case AB_DUPLELIGHT_MAGIC: case AB_DUPLELIGHT_MAGIC:
@ -3958,11 +3958,11 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
if (src->type == BL_SKILL) { if (src->type == BL_SKILL) {
TBL_SKILL *su = (TBL_SKILL*)src; TBL_SKILL *su = (TBL_SKILL*)src;
if (su->group && skill_get_inf2(su->group->skill_id, INF2_ISTRAP)) { // show damage on trap targets if (su->group && skill_get_inf2(su->group->skill_id, INF2_ISTRAP)) { // show damage on trap targets
clif_skill_damage(src, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, flag&SD_LEVEL ? -1 : skill_lv, DMG_SPLASH); clif_skill_damage( *src, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, flag&SD_LEVEL ? -1 : skill_lv, DMG_SPLASH );
break; break;
} }
} }
dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, flag&SD_LEVEL?-1:skill_lv, dmg_type); dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, (flag&SD_LEVEL) ? -1 : skill_lv, dmg_type );
break; break;
} }
@ -4076,10 +4076,10 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
if (e_bl) { if (e_bl) {
if (!rmdamage) { if (!rmdamage) {
clif_skill_damage(e_bl, e_bl, gettick(), 0, 0, damage, dmg.div_, skill_id, -1, skill_get_hit(skill_id)); clif_skill_damage( *e_bl, *e_bl, gettick(), 0, 0, damage, dmg.div_, skill_id, -1, skill_get_hit(skill_id) );
battle_fix_damage(src, e_bl, damage, 0, 0); battle_fix_damage(src, e_bl, damage, 0, 0);
} else { } else {
clif_skill_damage(bl, bl, gettick(), 0, 0, damage, dmg.div_, skill_id, -1, skill_get_hit(skill_id)); clif_skill_damage( *bl, *bl, gettick(), 0, 0, damage, dmg.div_, skill_id, -1, skill_get_hit(skill_id) );
battle_fix_damage(bl, bl, damage, 0, 0); battle_fix_damage(bl, bl, damage, 0, 0);
} }
} }
@ -4185,7 +4185,7 @@ int skill_area_sub(struct block_list *bl, va_list ap)
if(battle_check_target(src,bl,flag) > 0) { if(battle_check_target(src,bl,flag) > 0) {
// several splash skills need this initial dummy packet to display correctly // several splash skills need this initial dummy packet to display correctly
if (flag&SD_PREAMBLE && skill_area_temp[2] == 0) if (flag&SD_PREAMBLE && skill_area_temp[2] == 0)
clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
if (flag&(SD_SPLASH|SD_PREAMBLE)) if (flag&(SD_SPLASH|SD_PREAMBLE))
skill_area_temp[2]++; skill_area_temp[2]++;
@ -4544,7 +4544,7 @@ static TIMER_FUNC(skill_timerskill){
if (skl->skill_id == SR_SKYNETBLOW) { if (skl->skill_id == SR_SKYNETBLOW) {
skill_area_temp[1] = 0; skill_area_temp[1] = 0;
clif_skill_damage(src,src,tick,status_get_amotion(src),0,-30000,1,skl->skill_id,skl->skill_lv,DMG_SINGLE); clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skl->skill_id, skl->skill_lv, DMG_SINGLE );
map_foreachinallrange(skill_area_sub,src,skill_get_splash(skl->skill_id,skl->skill_lv),BL_CHAR|BL_SKILL,src, map_foreachinallrange(skill_area_sub,src,skill_get_splash(skl->skill_id,skl->skill_lv),BL_CHAR|BL_SKILL,src,
skl->skill_id,skl->skill_lv,tick,skl->flag|BCT_ENEMY|SD_SPLASH|1,skill_castend_damage_id); skl->skill_id,skl->skill_lv,tick,skl->flag|BCT_ENEMY|SD_SPLASH|1,skill_castend_damage_id);
break; break;
@ -4804,7 +4804,7 @@ static TIMER_FUNC(skill_timerskill){
int splash = skill_get_splash(skl->skill_id, skl->skill_lv); int splash = skill_get_splash(skl->skill_id, skl->skill_lv);
clif_skill_poseffect(src, skl->skill_id, skl->skill_lv, tmpx, tmpy, tick); clif_skill_poseffect( *src, skl->skill_id, skl->skill_lv, tmpx, tmpy, tick );
map_foreachinarea(skill_area_sub, src->m, tmpx - splash, tmpy - splash, tmpx + splash, tmpy + splash, BL_CHAR, src, skl->skill_id, skl->skill_lv, tick, skl->flag | BCT_ENEMY | SD_SPLASH | SKILL_ALTDMG_FLAG | 1, skill_castend_damage_id); map_foreachinarea(skill_area_sub, src->m, tmpx - splash, tmpy - splash, tmpx + splash, tmpy + splash, BL_CHAR, src, skl->skill_id, skl->skill_lv, tick, skl->flag | BCT_ENEMY | SD_SPLASH | SKILL_ALTDMG_FLAG | 1, skill_castend_damage_id);
skill_unitsetting(src, skl->skill_id, skl->skill_lv, tmpx, tmpy, skill_get_unit_interval(skl->skill_id)); skill_unitsetting(src, skl->skill_id, skl->skill_lv, tmpx, tmpy, skill_get_unit_interval(skl->skill_id));
} }
@ -5128,7 +5128,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
sc_type sct = skill_get_sc(skill_id); sc_type sct = skill_get_sc(skill_id);
if(sct != SC_NONE) if(sct != SC_NONE)
status_change_end(bl, sct); status_change_end(bl, sct);
clif_skill_damage(src, bl, tick, status_get_amotion(src), status_get_dmotion(bl), 0, 1, skill_id, skill_lv, skill_get_hit(skill_id)); clif_skill_damage( *src, *bl, tick, status_get_amotion(src), status_get_dmotion(bl), 0, 1, skill_id, skill_lv, skill_get_hit(skill_id));
return 1; return 1;
} }
@ -5814,7 +5814,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
#endif #endif
case LG_MOONSLASHER: case LG_MOONSLASHER:
case MH_XENO_SLASHER: case MH_XENO_SLASHER:
clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
break; break;
case NPC_REVERBERATION_ATK: case NPC_REVERBERATION_ATK:
case NC_ARMSCANNON: case NC_ARMSCANNON:
@ -6688,7 +6688,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
status_change_end(bl, SC__SHADOWFORM); status_change_end(bl, SC__SHADOWFORM);
sc_start(src,bl, SC_INFRAREDSCAN, 10000, skill_lv, skill_get_time(skill_id, skill_lv)); sc_start(src,bl, SC_INFRAREDSCAN, 10000, skill_lv, skill_get_time(skill_id, skill_lv));
} else { } else {
clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
} }
break; break;
@ -6697,7 +6697,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag); skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
else { else {
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_damage_id); map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_damage_id);
clif_skill_damage(src,src,tick,status_get_amotion(src),0,-30000,1,skill_id,skill_lv,DMG_SINGLE); clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
} }
break; break;
@ -6712,7 +6712,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
skill_area_temp[5] = y; skill_area_temp[5] = y;
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_damage_id); map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_damage_id);
skill_addtimerskill(src,tick + 800,src->id,x,y,skill_id,skill_lv,0,flag); // To teleport Self skill_addtimerskill(src,tick + 800,src->id,x,y,skill_id,skill_lv,0,flag); // To teleport Self
clif_skill_damage(src,src,tick,status_get_amotion(src),0,-30000,1,skill_id,skill_lv,DMG_SINGLE); clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
} }
break; break;
@ -6762,7 +6762,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
status_change_end(bl, SC__SHADOWFORM); status_change_end(bl, SC__SHADOWFORM);
} else { } else {
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
} }
break; break;
@ -6828,7 +6828,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
else { else {
int i = skill_get_splash(skill_id,skill_lv); int i = skill_get_splash(skill_id,skill_lv);
clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv); clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv);
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
if( rnd()%100 < 30 ) if( rnd()%100 < 30 )
map_foreachinrange(skill_area_sub,bl,i,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id); map_foreachinrange(skill_area_sub,bl,i,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id);
else else
@ -6838,7 +6838,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case EL_ROCK_CRUSHER: case EL_ROCK_CRUSHER:
clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv); clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv);
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
if( rnd()%100 < 50 ) if( rnd()%100 < 50 )
skill_attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag); skill_attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag);
else else
@ -6851,7 +6851,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
else { else {
int i = skill_get_splash(skill_id,skill_lv); int i = skill_get_splash(skill_id,skill_lv);
clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv); clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv);
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
if( rnd()%100 < 30 ) if( rnd()%100 < 30 )
map_foreachinrange(skill_area_sub,bl,i,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id); map_foreachinrange(skill_area_sub,bl,i,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id);
else else
@ -6864,7 +6864,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case EL_WIND_SLASH: case EL_WIND_SLASH:
case EL_STONE_HAMMER: case EL_STONE_HAMMER:
clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv); clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv);
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
skill_attack(skill_get_type(skill_id),src,src,bl,skill_id,skill_lv,tick,flag); skill_attack(skill_get_type(skill_id),src,src,bl,skill_id,skill_lv,tick,flag);
break; break;
@ -6875,7 +6875,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
sc_type type = SC_TIDAL_WEAPON_OPTION, type2 = SC_TIDAL_WEAPON; sc_type type = SC_TIDAL_WEAPON_OPTION, type2 = SC_TIDAL_WEAPON;
clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv); clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv);
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
if( (tsc_ele && tsc_ele->getSCE(type2)) || (tsc && tsc->getSCE(type)) ) { if( (tsc_ele && tsc_ele->getSCE(type2)) || (tsc && tsc->getSCE(type)) ) {
status_change_end(battle_get_master(src),type); status_change_end(battle_get_master(src),type);
status_change_end(src,type2); status_change_end(src,type2);
@ -6927,7 +6927,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
type = SC_TINDER_BREAKER2; type = SC_TINDER_BREAKER2;
if( unit_movepos(src, bl->x, bl->y, 1, 1) ){ if( unit_movepos(src, bl->x, bl->y, 1, 1) ){
clif_blown(src); clif_blown(src);
clif_skill_poseffect(src,skill_id,skill_lv,bl->x,bl->y,tick); clif_skill_poseffect( *src, skill_id, skill_lv, bl->x, bl->y, tick );
} }
}else if( skill_id == MH_CBC ){ }else if( skill_id == MH_CBC ){
type = SC_CBC; type = SC_CBC;
@ -6987,7 +6987,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
} }
if (skill_id == RL_HAMMER_OF_GOD) if (skill_id == RL_HAMMER_OF_GOD)
clif_skill_poseffect(src, skill_id, 1, bl->x, bl->y, gettick()); clif_skill_poseffect( *src, skill_id, 1, bl->x, bl->y, gettick() );
else else
clif_skill_nodamage(src, *bl, skill_id, skill_lv); clif_skill_nodamage(src, *bl, skill_id, skill_lv);
@ -7144,9 +7144,9 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
default: default:
ShowWarning("skill_castend_damage_id: Unknown skill used:%d\n",skill_id); ShowWarning("skill_castend_damage_id: Unknown skill used:%d\n",skill_id);
clif_skill_damage(src, bl, tick, status_get_amotion(src), tstatus->dmotion, clif_skill_damage( *src, *bl, tick, status_get_amotion(src), tstatus->dmotion,
0, abs(skill_get_num(skill_id, skill_lv)), 0, abs(skill_get_num(skill_id, skill_lv)),
skill_id, skill_lv, skill_get_hit(skill_id)); skill_id, skill_lv, skill_get_hit(skill_id) );
map_freeblock_unlock(); map_freeblock_unlock();
return 1; return 1;
} }
@ -7806,7 +7806,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
} }
clif_skill_nodamage(src, *bl, skill_id, skill_lv); clif_skill_nodamage(src, *bl, skill_id, skill_lv);
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
clif_blown(bl); clif_blown(bl);
// If caster is not a boss, switch coordinates with the target // If caster is not a boss, switch coordinates with the target
@ -8036,7 +8036,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case NPC_ALL_STAT_DOWN: case NPC_ALL_STAT_DOWN:
status_change_start(src, bl, type, 10000, skill_lv, 0, 0, 0, skill_get_time(skill_id, skill_lv), SCSTART_NOAVOID|SCSTART_NOTICKDEF|SCSTART_NORATEDEF); status_change_start(src, bl, type, 10000, skill_lv, 0, 0, 0, skill_get_time(skill_id, skill_lv), SCSTART_NOAVOID|SCSTART_NOTICKDEF|SCSTART_NORATEDEF);
clif_skill_nodamage(src, *bl, skill_id, skill_lv); clif_skill_nodamage(src, *bl, skill_id, skill_lv);
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
break; break;
// EDP also give +25% WATK poison pseudo element to user. // EDP also give +25% WATK poison pseudo element to user.
@ -8660,7 +8660,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
i = map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), starget, i = map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), starget,
src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
if( !i && ( skill_id == RK_WINDCUTTER || skill_id == NC_AXETORNADO || skill_id == LG_CANNONSPEAR || skill_id == SR_SKYNETBLOW || skill_id == KO_HAPPOKUNAI ) ) if( !i && ( skill_id == RK_WINDCUTTER || skill_id == NC_AXETORNADO || skill_id == LG_CANNONSPEAR || skill_id == SR_SKYNETBLOW || skill_id == KO_HAPPOKUNAI ) )
clif_skill_damage(src,src,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
} }
break; break;
@ -8744,7 +8744,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
#if PACKETVER >= 20180207 #if PACKETVER >= 20180207
clif_skill_nodamage(src,*bl,skill_id,skill_lv); clif_skill_nodamage(src,*bl,skill_id,skill_lv);
#else #else
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
#endif #endif
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
break; break;
@ -9262,7 +9262,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
} }
clif_skill_nodamage(src, *bl, skill_id, skill_lv); clif_skill_nodamage(src, *bl, skill_id, skill_lv);
clif_skill_estimation(sd, bl); if (dstmd != nullptr)
clif_skill_estimation( *sd, *dstmd );
if( skill_id == MER_ESTIMATION ) if( skill_id == MER_ESTIMATION )
sd = nullptr; sd = nullptr;
break; break;
@ -10865,7 +10866,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case LG_EARTHDRIVE: { case LG_EARTHDRIVE: {
int dummy = 1; int dummy = 1;
clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
i = skill_get_splash(skill_id,skill_lv); i = skill_get_splash(skill_id,skill_lv);
map_foreachinallarea(skill_cell_overlap, src->m, src->x-i, src->y-i, src->x+i, src->y+i, BL_SKILL, LG_EARTHDRIVE, &dummy, src); map_foreachinallarea(skill_cell_overlap, src->m, src->x-i, src->y-i, src->x+i, src->y+i, BL_SKILL, LG_EARTHDRIVE, &dummy, src);
map_foreachinrange(skill_area_sub, bl,i,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id); map_foreachinrange(skill_area_sub, bl,i,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id);
@ -10979,7 +10980,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
break; break;
case GC_PHANTOMMENACE: case GC_PHANTOMMENACE:
clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
clif_skill_nodamage(src,*bl,skill_id,skill_lv); clif_skill_nodamage(src,*bl,skill_id,skill_lv);
map_foreachinrange(skill_area_sub,src,skill_get_splash(skill_id,skill_lv),BL_CHAR, map_foreachinrange(skill_area_sub,src,skill_get_splash(skill_id,skill_lv),BL_CHAR,
src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id); src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id);
@ -11321,7 +11322,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
break; break;
case RA_FEARBREEZE: case RA_FEARBREEZE:
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start(src,bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start(src,bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)));
break; break;
@ -11362,7 +11363,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case RA_SENSITIVEKEEN: case RA_SENSITIVEKEEN:
clif_skill_nodamage(src,*bl,skill_id,skill_lv); clif_skill_nodamage(src,*bl,skill_id,skill_lv);
clif_skill_damage(src,src,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
map_foreachinrange(skill_area_sub,src,skill_get_splash(skill_id,skill_lv),BL_CHAR|BL_SKILL,src,skill_id,skill_lv,tick,flag|BCT_ENEMY,skill_castend_damage_id); map_foreachinrange(skill_area_sub,src,skill_get_splash(skill_id,skill_lv),BL_CHAR|BL_SKILL,src,skill_id,skill_lv,tick,flag|BCT_ENEMY,skill_castend_damage_id);
break; break;
@ -11404,7 +11405,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
break; break;
case NC_ANALYZE: case NC_ANALYZE:
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
sc_start(src,bl,type, 30 + 12 * skill_lv,skill_lv,skill_get_time(skill_id,skill_lv)); sc_start(src,bl,type, 30 + 12 * skill_lv,skill_lv,skill_get_time(skill_id,skill_lv));
break; break;
@ -11415,7 +11416,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
if (map_flag_vs(src->m)) // Doesn't affect the caster in non-PVP maps [exneval] if (map_flag_vs(src->m)) // Doesn't affect the caster in non-PVP maps [exneval]
sc_start2(src, bl, type, 100, skill_lv, src->id, skill_get_time(skill_id, skill_lv)); sc_start2(src, bl, type, 100, skill_lv, src->id, skill_get_time(skill_id, skill_lv));
map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_nodamage_id); map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_nodamage_id);
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
} }
break; break;
@ -11535,7 +11536,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
break; break;
case LG_TRAMPLE: case LG_TRAMPLE:
clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
if (rnd()%100 < (25 + 25 * skill_lv)) if (rnd()%100 < (25 + 25 * skill_lv))
map_foreachinallrange(skill_destroy_trap,bl,skill_get_splash(skill_id,skill_lv),BL_SKILL,tick); map_foreachinallrange(skill_destroy_trap,bl,skill_get_splash(skill_id,skill_lv),BL_SKILL,tick);
status_change_end(bl, SC_SV_ROOTTWIST); status_change_end(bl, SC_SV_ROOTTWIST);
@ -11566,13 +11567,13 @@ 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;
} }
} else { } else {
int count = 0; int count = 0;
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
count = map_forcountinrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv), (sd)?sd->spiritball_old:15, // Assume 15 spiritballs in non-charactors count = map_forcountinrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv), (sd)?sd->spiritball_old:15, // Assume 15 spiritballs in non-charactors
BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id);
if( sd ) pc_delspiritball(sd, count, 0); if( sd ) pc_delspiritball(sd, count, 0);
@ -11588,13 +11589,13 @@ 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;
} }
} else { } else {
int count = 0; int count = 0;
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
count = map_forcountinrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv), (sd)?sd->spiritball_old:15, // Assume 15 spiritballs in non-charactors count = map_forcountinrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv), (sd)?sd->spiritball_old:15, // Assume 15 spiritballs in non-charactors
BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id);
if( sd ) pc_delspiritball(sd, count, 0); if( sd ) pc_delspiritball(sd, count, 0);
@ -11630,7 +11631,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
status_percent_heal(src, 0, i); status_percent_heal(src, 0, i);
clif_skill_nodamage(src, *bl, skill_id, skill_lv, i != 0); clif_skill_nodamage(src, *bl, skill_id, skill_lv, i != 0);
} else { } else {
clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|BCT_SELF|SD_SPLASH|1, skill_castend_nodamage_id); map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|BCT_SELF|SD_SPLASH|1, skill_castend_nodamage_id);
} }
break; break;
@ -11918,7 +11919,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
status_change_end(bl, SC_DECREASEAGI); status_change_end(bl, SC_DECREASEAGI);
break; break;
} }
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, 1, DMG_SINGLE); clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, 1, DMG_SINGLE );
clif_skill_nodamage(src,*bl,skill_id,skill_lv); clif_skill_nodamage(src,*bl,skill_id,skill_lv);
break; break;
@ -12178,7 +12179,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
} else { } else {
clif_skill_nodamage(src,*src,skill_id,skill_lv); clif_skill_nodamage(src,*src,skill_id,skill_lv);
if (!(skill_id >= EM_EL_FLAMETECHNIC && skill_id <= EM_EL_DEADLY_POISON)) if (!(skill_id >= EM_EL_FLAMETECHNIC && skill_id <= EM_EL_DEADLY_POISON))
clif_skill_damage(src, ( skill_id == EL_GUST || skill_id == EL_BLAST || skill_id == EL_WILD_STORM )?src:bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, ( skill_id == EL_GUST || skill_id == EL_BLAST || skill_id == EL_WILD_STORM ) ? *src : *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
if( skill_id == EL_WIND_STEP ) // There aren't teleport, just push the master away. if( skill_id == EL_WIND_STEP ) // There aren't teleport, just push the master away.
skill_blown(src,bl,(rnd()%skill_get_blewcount(skill_id,skill_lv))+1,rnd()%8,BLOWN_NONE); skill_blown(src,bl,(rnd()%skill_get_blewcount(skill_id,skill_lv))+1,rnd()%8,BLOWN_NONE);
sc_start(src,src,type2,100,skill_lv,skill_get_time(skill_id,skill_lv)); sc_start(src,src,type2,100,skill_lv,skill_get_time(skill_id,skill_lv));
@ -12191,7 +12192,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case EL_WATER_BARRIER: case EL_WATER_BARRIER:
case EL_ZEPHYR: case EL_ZEPHYR:
case EL_POWER_OF_GAIA: case EL_POWER_OF_GAIA:
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
skill_unitsetting(src,skill_id,skill_lv,bl->x,bl->y,0); skill_unitsetting(src,skill_id,skill_lv,bl->x,bl->y,0);
break; break;
case EL_WATER_SCREEN: { case EL_WATER_SCREEN: {
@ -12206,7 +12207,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
status_change_end(src,type2); status_change_end(src,type2);
} else { } else {
// This not heals at the end. // This not heals at the end.
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
sc_start(src,src,type2,100,skill_lv,skill_get_time(skill_id,skill_lv)); sc_start(src,src,type2,100,skill_lv,skill_get_time(skill_id,skill_lv));
sc_start(src,bl,type,100,src->id,skill_get_time(skill_id,skill_lv)); sc_start(src,bl,type,100,src->id,skill_get_time(skill_id,skill_lv));
} }
@ -12311,7 +12312,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
clif_skill_nodamage(src,*bl,skill_id,skill_lv, clif_skill_nodamage(src,*bl,skill_id,skill_lv,
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
break; break;
case KG_KAGEHUMI: case KG_KAGEHUMI:
if( flag&1 ){ if( flag&1 ){
@ -12331,7 +12332,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
} }
}else{ }else{
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id);
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
clif_skill_nodamage(src, *bl, skill_id, skill_lv); clif_skill_nodamage(src, *bl, skill_id, skill_lv);
} }
break; break;
@ -13520,7 +13521,7 @@ TIMER_FUNC(skill_castend_id){
clif_blown(src); clif_blown(src);
clif_spiritball(src); clif_spiritball(src);
} }
clif_skill_damage(src,target,tick,sd->battle_status.amotion,0,0,1,ud->skill_id,ud->skill_lv,DMG_SPLASH); clif_skill_damage( *src, *target, tick, sd->battle_status.amotion, 0, 0, 1, ud->skill_id, ud->skill_lv, DMG_SPLASH );
} }
} }
@ -13742,7 +13743,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
if(skill_get_inf(skill_id)&INF_SELF_SKILL) if(skill_get_inf(skill_id)&INF_SELF_SKILL)
clif_skill_nodamage(src,*src,skill_id,skill_lv); clif_skill_nodamage(src,*src,skill_id,skill_lv);
else else
clif_skill_poseffect(src,skill_id,skill_lv,x,y,tick); clif_skill_poseffect( *src, skill_id, skill_lv, x, y, tick );
} }
switch(skill_id) switch(skill_id)
@ -13962,14 +13963,14 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
case NPC_CANE_OF_EVIL_EYE: case NPC_CANE_OF_EVIL_EYE:
flag|=1; flag|=1;
if(skill_unitsetting(src,skill_id,skill_lv,x,y,0)) if(skill_unitsetting(src,skill_id,skill_lv,x,y,0))
clif_skill_poseffect(src,skill_id,skill_lv,x,y,tick); clif_skill_poseffect( *src, skill_id, skill_lv, x, y, tick );
break; break;
case RG_GRAFFITI: /* Graffiti [Valaris] */ case RG_GRAFFITI: /* Graffiti [Valaris] */
skill_unitsetting(src,skill_id,skill_lv,x,y,0); skill_unitsetting(src,skill_id,skill_lv,x,y,0);
flag|=1; flag|=1;
break; break;
case NPC_EARTHQUAKE: case NPC_EARTHQUAKE:
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
skill_unitsetting(src, skill_id, skill_lv, x, y, 0); skill_unitsetting(src, skill_id, skill_lv, x, y, 0);
break; break;
#ifndef RENEWAL #ifndef RENEWAL
@ -14073,7 +14074,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
#if PACKETVER >= 20111005 #if PACKETVER >= 20111005
clif_snap(src, src->x, src->y); clif_snap(src, src->x, src->y);
#else #else
clif_skill_poseffect(src,skill_id,skill_lv,src->x,src->y,tick); clif_skill_poseffect( *src, skill_id, skill_lv, src->x, src->y, tick );
#endif #endif
if (sd) if (sd)
skill_blockpc_start (sd, MO_EXTREMITYFIST, 2000); skill_blockpc_start (sd, MO_EXTREMITYFIST, 2000);
@ -14173,7 +14174,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
case HW_GANBANTEIN: case HW_GANBANTEIN:
if (rnd()%100 < 80) { if (rnd()%100 < 80) {
int dummy = 1; int dummy = 1;
clif_skill_poseffect(src,skill_id,skill_lv,x,y,tick); clif_skill_poseffect( *src, skill_id, skill_lv, x, y, tick );
i = skill_get_splash(skill_id, skill_lv); i = skill_get_splash(skill_id, skill_lv);
map_foreachinallarea(skill_cell_overlap, src->m, x-i, y-i, x+i, y+i, BL_SKILL, HW_GANBANTEIN, &dummy, src); map_foreachinallarea(skill_cell_overlap, src->m, x-i, y-i, x+i, y+i, BL_SKILL, HW_GANBANTEIN, &dummy, src);
} else { } else {
@ -14198,7 +14199,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
clif_skill_fail( *sd, skill_id ); clif_skill_fail( *sd, skill_id );
return 1; return 1;
} }
clif_skill_poseffect(src,skill_id,skill_lv,x,y,tick); clif_skill_poseffect( *src, skill_id, skill_lv, x, y, tick );
if (rnd()%100 < 50) { if (rnd()%100 < 50) {
clif_skill_fail( *sd, skill_id ); clif_skill_fail( *sd, skill_id );
} else { } else {
@ -14260,7 +14261,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
if (sce) if (sce)
status_change_end(src, type); //Was under someone else's Gospel. [Skotlex] status_change_end(src, type); //Was under someone else's Gospel. [Skotlex]
sc_start4(src,src,type,100,skill_lv,0,sg->group_id,BCT_SELF,skill_get_time(skill_id,skill_lv)); sc_start4(src,src,type,100,skill_lv,0,sg->group_id,BCT_SELF,skill_get_time(skill_id,skill_lv));
clif_skill_poseffect(src, skill_id, skill_lv, 0, 0, tick); // PA_GOSPEL music packet clif_skill_poseffect( *src, skill_id, skill_lv, 0, 0, tick ); // PA_GOSPEL music packet
} }
break; break;
case NJ_TATAMIGAESHI: case NJ_TATAMIGAESHI:
@ -14308,7 +14309,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
clif_skill_fail( *sd, skill_id, USESKILL_FAIL_GC_POISONINGWEAPON ); clif_skill_fail( *sd, skill_id, USESKILL_FAIL_GC_POISONINGWEAPON );
return 0; return 0;
} }
clif_skill_damage(src,src,tick,status_get_amotion(src),0,-30000,1,skill_id,skill_lv,DMG_SINGLE); clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
skill_unitsetting(src, skill_id, skill_lv, x, y, flag); skill_unitsetting(src, skill_id, skill_lv, x, y, flag);
break; break;
@ -14340,7 +14341,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
case RA_DETONATOR: case RA_DETONATOR:
i = skill_get_splash(skill_id, skill_lv); i = skill_get_splash(skill_id, skill_lv);
map_foreachinallarea(skill_detonator, src->m, x-i, y-i, x+i, y+i, BL_SKILL, src); map_foreachinallarea(skill_detonator, src->m, x-i, y-i, x+i, y+i, BL_SKILL, src);
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
break; break;
case NC_NEUTRALBARRIER: case NC_NEUTRALBARRIER:
@ -16706,9 +16707,9 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t
break; break;
case UNT_FIRE_RAIN: case UNT_FIRE_RAIN:
clif_skill_damage(ss,bl,tick,status_get_amotion(ss),0, clif_skill_damage( *ss, *bl, tick, status_get_amotion(ss), 0,
skill_attack(skill_get_type(sg->skill_id),ss,&unit->bl,bl,sg->skill_id,sg->skill_lv,tick,SD_ANIMATION|SD_SPLASH), skill_attack(skill_get_type(sg->skill_id),ss,&unit->bl,bl,sg->skill_id,sg->skill_lv,tick,SD_ANIMATION|SD_SPLASH),
1,sg->skill_id,sg->skill_lv,DMG_SINGLE); 1, sg->skill_id, sg->skill_lv, DMG_SINGLE );
break; break;
case UNT_MAGMA_ERUPTION: case UNT_MAGMA_ERUPTION:
@ -20465,7 +20466,7 @@ static int skill_trap_splash(struct block_list *bl, va_list ap)
if (status_change_start(ss, bl, SC_ELECTRICSHOCKER, 10000, sg->skill_lv, sg->group_id, 0, 0, skill_get_time2(sg->skill_id, sg->skill_lv), SCSTART_NORATEDEF)) { if (status_change_start(ss, bl, SC_ELECTRICSHOCKER, 10000, sg->skill_lv, sg->group_id, 0, 0, skill_get_time2(sg->skill_id, sg->skill_lv), SCSTART_NORATEDEF)) {
map_moveblock(bl, unit->bl.x, unit->bl.y, tick); map_moveblock(bl, unit->bl.x, unit->bl.y, tick);
clif_fixpos( *bl ); clif_fixpos( *bl );
clif_skill_damage(src, bl, tick, 0, 0, -30000, 1, sg->skill_id, sg->skill_lv, DMG_SPLASH); clif_skill_damage( *src, *bl, tick, 0, 0, -30000, 1, sg->skill_id, sg->skill_lv, DMG_SPLASH );
} }
} }
break; break;
@ -21489,9 +21490,9 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
if (src != nullptr) { if (src != nullptr) {
if (group->skill_id == AG_VIOLENT_QUAKE_ATK || group->skill_id == AG_ALL_BLOOM_ATK || group->skill_id == AG_ALL_BLOOM_ATK2) if (group->skill_id == AG_VIOLENT_QUAKE_ATK || group->skill_id == AG_ALL_BLOOM_ATK || group->skill_id == AG_ALL_BLOOM_ATK2)
clif_skill_poseffect(src, group->skill_id, -1, bl->x, bl->y, tick); // Don't yell a blank skill name. clif_skill_poseffect( *src, group->skill_id, -1, bl->x, bl->y, tick ); // Don't yell a blank skill name.
else else
clif_skill_poseffect(src, group->skill_id, group->skill_lv, bl->x, bl->y, tick); clif_skill_poseffect( *src, group->skill_id, group->skill_lv, bl->x, bl->y, tick );
group->val2 = 1; group->val2 = 1;
} }
} }

View File

@ -3038,7 +3038,7 @@ void status_calc_pet_(struct pet_data *pd, uint8 opt)
status_calc_misc(&pd->bl, &pd->status, lv); status_calc_misc(&pd->bl, &pd->status, lv);
if (!(opt&SCO_FIRST)) // Not done the first time because the pet is not visible yet if (!(opt&SCO_FIRST)) // Not done the first time because the pet is not visible yet
clif_send_petstatus(sd); clif_send_petstatus( *sd, *pd );
} }
} else if (opt&SCO_FIRST) { } else if (opt&SCO_FIRST) {
status_calc_misc(&pd->bl, &pd->status, pd->db->lv); status_calc_misc(&pd->bl, &pd->status, pd->db->lv);
@ -13448,7 +13448,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:
@ -13697,7 +13697,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);
} }
} }
@ -15090,7 +15090,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;