Added support for skill scale display (#5041)

Fixes #4530

Thanks to @Balferian
This commit is contained in:
Lemongrass3110 2020-06-04 19:53:19 +02:00 committed by GitHub
parent f218994054
commit d87ac21986
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 93 additions and 5 deletions

View File

@ -145,3 +145,7 @@ ping_timer_inverval: 30
// Send packets timeout in seconds before ping packet can be sent. // Send packets timeout in seconds before ping packet can be sent.
ping_time: 20 ping_time: 20
// Show skill scale for clients 2015-12-23 and newer? (Note 1)
// Official: yes
show_skill_scale: yes

View File

@ -15309,6 +15309,7 @@ Body:
Flags: Flags:
IsNpc: true IsNpc: true
TargetTrap: true TargetTrap: true
ShowScale: true
Hit: Multi_Hit Hit: Multi_Hit
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -15414,6 +15415,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -15460,6 +15462,7 @@ Body:
Flags: Flags:
IsNpc: true IsNpc: true
TargetTrap: true TargetTrap: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: 7 SplashArea: 7
@ -15475,6 +15478,7 @@ Body:
Flags: Flags:
IsNpc: true IsNpc: true
TargetTrap: true TargetTrap: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: 14 SplashArea: 14
@ -15489,6 +15493,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -15513,6 +15518,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -15537,6 +15543,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -15561,6 +15568,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -15585,6 +15593,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -15609,6 +15618,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -15634,6 +15644,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
Element: Fire Element: Fire
@ -15652,6 +15663,7 @@ Body:
IgnoreDefCard: true IgnoreDefCard: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Range: 7 Range: 7
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
@ -15748,6 +15760,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -15864,6 +15877,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -15888,6 +15902,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -15912,6 +15927,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -15945,6 +15961,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -16224,6 +16241,7 @@ Body:
Flags: Flags:
IsNpc: true IsNpc: true
IgnoreLandProtector: true IgnoreLandProtector: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
Element: Poison Element: Poison
@ -16240,6 +16258,8 @@ Body:
Name: NPC_COMET Name: NPC_COMET
Description: Comet 2 Description: Comet 2
MaxLevel: 1 MaxLevel: 1
Flags:
ShowScale: true
- Id: 716 - Id: 716
Name: NPC_MAXPAIN Name: NPC_MAXPAIN
Description: Max Pain Description: Max Pain
@ -16271,6 +16291,8 @@ Body:
Name: NPC_JACKFROST Name: NPC_JACKFROST
Description: Jack Frost 2 Description: Jack Frost 2
MaxLevel: 1 MaxLevel: 1
Flags:
ShowScale: true
- Id: 725 - Id: 725
Name: NPC_REVERBERATION Name: NPC_REVERBERATION
Description: Reverberation 2 Description: Reverberation 2
@ -16283,6 +16305,7 @@ Body:
IsNpc: true IsNpc: true
IsTrap: true IsTrap: true
DisableNearNpc: true DisableNearNpc: true
ShowScale: true
Range: 1 Range: 1
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
@ -16323,6 +16346,8 @@ Body:
Name: NPC_LEX_AETERNA Name: NPC_LEX_AETERNA
Description: Lex Aeterna 2 Description: Lex Aeterna 2
MaxLevel: 1 MaxLevel: 1
Flags:
ShowScale: true
- Id: 728 - Id: 728
Name: NPC_ARROWSTORM Name: NPC_ARROWSTORM
Description: NPC Arrow Storm Description: NPC Arrow Storm

View File

@ -15722,6 +15722,7 @@ Body:
Flags: Flags:
IsNpc: true IsNpc: true
TargetTrap: true TargetTrap: true
ShowScale: true
Hit: Multi_Hit Hit: Multi_Hit
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -15829,6 +15830,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -15877,6 +15879,7 @@ Body:
Flags: Flags:
IsNpc: true IsNpc: true
TargetTrap: true TargetTrap: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: 7 SplashArea: 7
@ -15892,6 +15895,7 @@ Body:
Flags: Flags:
IsNpc: true IsNpc: true
TargetTrap: true TargetTrap: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: 14 SplashArea: 14
@ -15907,6 +15911,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -15932,6 +15937,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -15957,6 +15963,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -15982,6 +15989,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -16007,6 +16015,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -16032,6 +16041,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -16058,6 +16068,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
Element: Fire Element: Fire
@ -16077,6 +16088,7 @@ Body:
IgnoreDefCard: true IgnoreDefCard: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Range: 7 Range: 7
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
@ -16175,6 +16187,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -16295,6 +16308,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -16320,6 +16334,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -16345,6 +16360,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -16378,6 +16394,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
SplashArea: SplashArea:
@ -16676,6 +16693,7 @@ Body:
Flags: Flags:
IsNpc: true IsNpc: true
IgnoreLandProtector: true IgnoreLandProtector: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
Element: Poison Element: Poison
@ -16699,6 +16717,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
AlterRangeRadius: true AlterRangeRadius: true
ShowScale: true
Range: 11 Range: 11
Hit: Multi_Hit Hit: Multi_Hit
HitCount: -20 HitCount: -20
@ -16724,6 +16743,7 @@ Body:
IgnoreDefCard: true IgnoreDefCard: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
Duration1: 10000 Duration1: 10000
@ -16748,6 +16768,7 @@ Body:
Flags: Flags:
IsNpc: true IsNpc: true
IgnoreLandProtector: true IgnoreLandProtector: true
ShowScale: true
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
Knockback: 2 Knockback: 2
@ -16826,6 +16847,8 @@ Body:
TargetType: Self TargetType: Self
DamageFlags: DamageFlags:
Splash: true Splash: true
Flags:
ShowScale: true
Hit: Multi_Hit Hit: Multi_Hit
HitCount: -5 HitCount: -5
Element: Water Element: Water
@ -16864,6 +16887,7 @@ Body:
IsNpc: true IsNpc: true
IsTrap: true IsTrap: true
DisableNearNpc: true DisableNearNpc: true
ShowScale: true
Range: 1 Range: 1
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
@ -16912,6 +16936,7 @@ Body:
Splash: true Splash: true
Flags: Flags:
IsNpc: true IsNpc: true
ShowScale: true
Range: 9 Range: 9
Hit: Single Hit: Single
SplashArea: SplashArea:

View File

@ -99,8 +99,9 @@ TargetManHole - Target enemy with SC__MANHOLE.
TargetHidden - Target enemy with OPTION_HIDE. TargetHidden - Target enemy with OPTION_HIDE.
IncreaseDanceWithWugDamage - Increase SC_DANCEWITHWUG damage. IncreaseDanceWithWugDamage - Increase SC_DANCEWITHWUG damage.
IgnoreWugBite - Ignore RA_WUGBITE. IgnoreWugBite - Ignore RA_WUGBITE.
IgnoreAutoGuard - Not blocked by SC_AUTOGUARD (When TargetType is Weapon only). IgnoreAutoGuard - Not blocked by SC_AUTOGUARD (When TargetType is Weapon only).
IgnoreCicada - Not blocked by SC_UTSUSEMI or SC_BUNSINJYUTSU (When TargetType is Weapon only). IgnoreCicada - Not blocked by SC_UTSUSEMI or SC_BUNSINJYUTSU (When TargetType is Weapon only).
ShowScale - Shows AoE area while casting
--------------------------------------- ---------------------------------------

View File

@ -8956,6 +8956,7 @@ static const struct _battle_data {
{ "rental_item_novalue", &battle_config.rental_item_novalue, 1, 0, 1, }, { "rental_item_novalue", &battle_config.rental_item_novalue, 1, 0, 1, },
{ "ping_timer_inverval", &battle_config.ping_timer_interval, 30, 0, 99999999, }, { "ping_timer_inverval", &battle_config.ping_timer_interval, 30, 0, 99999999, },
{ "ping_time", &battle_config.ping_time, 20, 0, 99999999, }, { "ping_time", &battle_config.ping_time, 20, 0, 99999999, },
{ "show_skill_scale", &battle_config.show_skill_scale, 1, 0, 1, },
#include "../custom/battle_config_init.inc" #include "../custom/battle_config_init.inc"
}; };

View File

@ -680,6 +680,7 @@ struct Battle_Config
int rental_item_novalue; int rental_item_novalue;
int ping_timer_interval; int ping_timer_interval;
int ping_time; int ping_time;
int show_skill_scale;
#include "../custom/battle_config_struct.inc" #include "../custom/battle_config_struct.inc"
}; };

View File

@ -5425,6 +5425,31 @@ void clif_skillinfo(struct map_session_data *sd,int skill_id, int inf)
WFIFOSET(fd,packet_len(0x7e1)); WFIFOSET(fd,packet_len(0x7e1));
} }
void clif_skill_scale( struct block_list *bl, int src_id, int x, int y, uint16 skill_id, uint16 skill_lv, int casttime ){
#if PACKETVER >= 20151223
if( !battle_config.show_skill_scale ){
return;
}
struct PACKET_ZC_SKILL_SCALE p;
p.PacketType = skillscale;
p.AID = src_id;
p.skill_id = skill_id;
p.skill_lv = skill_lv;
p.x = x;
p.y = y;
p.casttime = casttime;
if( disguised( bl ) ){
clif_send( &p, sizeof( p ), bl, AREA_WOS );
p.AID = disguised_bl_id( bl->id );
clif_send( &p, sizeof( p ), bl, SELF );
}else{
clif_send( &p, sizeof( p ), bl, AREA );
}
#endif
}
/// Notifies clients in area, that an object is about to use a skill. /// Notifies clients in area, that an object is about to use a skill.
/// 013e <src id>.L <dst id>.L <x>.W <y>.W <skill id>.W <property>.L <delaytime>.L (ZC_USESKILL_ACK) /// 013e <src id>.L <dst id>.L <x>.W <y>.W <skill id>.W <property>.L <delaytime>.L (ZC_USESKILL_ACK)
@ -5441,7 +5466,7 @@ void clif_skillinfo(struct map_session_data *sd,int skill_id, int inf)
/// is disposable: /// is disposable:
/// 0 = yellow chat text "[src name] will use skill [skill name]." /// 0 = yellow chat text "[src name] will use skill [skill name]."
/// 1 = no text /// 1 = no text
void clif_skillcasting(struct block_list* bl, int src_id, int dst_id, int dst_x, int dst_y, uint16 skill_id, int property, int casttime) void clif_skillcasting(struct block_list* bl, int src_id, int dst_id, int dst_x, int dst_y, uint16 skill_id, uint16 skill_lv, int property, int casttime)
{ {
#if PACKETVER < 20091124 #if PACKETVER < 20091124
const int cmd = 0x13e; const int cmd = 0x13e;
@ -5468,6 +5493,10 @@ void clif_skillcasting(struct block_list* bl, int src_id, int dst_id, int dst_x,
clif_send(buf,packet_len(cmd), bl, SELF); clif_send(buf,packet_len(cmd), bl, SELF);
} else } else
clif_send(buf,packet_len(cmd), bl, AREA); clif_send(buf,packet_len(cmd), bl, AREA);
if( skill_get_inf2( skill_id, INF2_SHOWSCALE ) ){
clif_skill_scale( bl, src_id, bl->x, bl->y, skill_id, skill_lv, casttime );
}
} }

View File

@ -694,7 +694,7 @@ void clif_skillinfo(struct map_session_data *sd,int skill_id, int inf);
void clif_addskill(struct map_session_data *sd, int skill_id); void clif_addskill(struct map_session_data *sd, int skill_id);
void clif_deleteskill(struct map_session_data *sd, int skill_id); void clif_deleteskill(struct map_session_data *sd, int skill_id);
void clif_skillcasting(struct block_list* bl, int src_id, int dst_id, int dst_x, int dst_y, uint16 skill_id, int property, int casttime); void clif_skillcasting(struct block_list* bl, int src_id, int dst_id, int dst_x, int dst_y, uint16 skill_id, uint16 skill_lv, int property, int casttime);
void clif_skillcastcancel(struct block_list* bl); void clif_skillcastcancel(struct block_list* bl);
void clif_skill_fail(struct map_session_data *sd,uint16 skill_id,enum useskill_fail_cause cause,int btype, int itemId = 0); void clif_skill_fail(struct map_session_data *sd,uint16 skill_id,enum useskill_fail_cause cause,int btype, int itemId = 0);
void clif_skill_cooldown(struct map_session_data *sd, uint16 skill_id, t_tick tick); void clif_skill_cooldown(struct map_session_data *sd, uint16 skill_id, t_tick tick);

View File

@ -7527,6 +7527,7 @@
export_constant(INF2_IGNOREWUGBITE); export_constant(INF2_IGNOREWUGBITE);
export_constant(INF2_IGNOREAUTOGUARD); export_constant(INF2_IGNOREAUTOGUARD);
export_constant(INF2_IGNORECICADA); export_constant(INF2_IGNORECICADA);
export_constant(INF2_SHOWSCALE);
/* skill no near npc flags */ /* skill no near npc flags */
export_constant(SKILL_NONEAR_WARPPORTAL); export_constant(SKILL_NONEAR_WARPPORTAL);

View File

@ -105,6 +105,7 @@ enum e_skill_inf2 : uint8 {
INF2_IGNOREWUGBITE, // Skill blocked by RA_WUGBITE INF2_IGNOREWUGBITE, // Skill blocked by RA_WUGBITE
INF2_IGNOREAUTOGUARD , // Skill is not blocked by SC_AUTOGUARD (physical-skill only) INF2_IGNOREAUTOGUARD , // Skill is not blocked by SC_AUTOGUARD (physical-skill only)
INF2_IGNORECICADA, // Skill is not blocked by SC_UTSUSEMI or SC_BUNSINJYUTSU (physical-skill only) INF2_IGNORECICADA, // Skill is not blocked by SC_UTSUSEMI or SC_BUNSINJYUTSU (physical-skill only)
INF2_SHOWSCALE, // Skill shows AoE area while casting
INF2_MAX, INF2_MAX,
}; };

View File

@ -1890,7 +1890,7 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
skill_toggle_magicpower(src, skill_id); skill_toggle_magicpower(src, skill_id);
// In official this is triggered even if no cast time. // In official this is triggered even if no cast time.
clif_skillcasting(src, src->id, target_id, 0,0, skill_id, skill_get_ele(skill_id, skill_lv), casttime); clif_skillcasting(src, src->id, target_id, 0,0, skill_id, skill_lv, skill_get_ele(skill_id, skill_lv), casttime);
if (sd && target->type == BL_MOB) { if (sd && target->type == BL_MOB) {
TBL_MOB *md = (TBL_MOB*)target; TBL_MOB *md = (TBL_MOB*)target;
@ -2149,7 +2149,7 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, ui
skill_toggle_magicpower(src, skill_id); skill_toggle_magicpower(src, skill_id);
// In official this is triggered even if no cast time. // In official this is triggered even if no cast time.
clif_skillcasting(src, src->id, 0, skill_x, skill_y, skill_id, skill_get_ele(skill_id, skill_lv), casttime); clif_skillcasting(src, src->id, 0, skill_x, skill_y, skill_id, skill_lv, skill_get_ele(skill_id, skill_lv), casttime);
if( casttime > 0 ) { if( casttime > 0 ) {
ud->skilltimer = add_timer( tick+casttime, skill_castend_pos, src->id, 0 ); ud->skilltimer = add_timer( tick+casttime, skill_castend_pos, src->id, 0 );