Various NPC skill fixes (#8233)

- Fixed the damage type of various NPC skills
- NPC_*BREATH skills and NPC_VAMPIRE_GIFT will now no longer be influenced by ATKpercent
- Fixed NPC_CRITICALSLASH not working in pre-re
- NPC_KEEPING now lasts 30s
- NPC_BARRIER now lasts 15s
- NPC_DEFENDER now lasts 15s, reduces damage by 87.5% and halves movement speed
- Fixes #3538
This commit is contained in:
Playtester 2024-04-08 20:24:32 +02:00 committed by GitHub
parent 100b590094
commit 03f07ab8c7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 33 additions and 146 deletions

View File

@ -5805,8 +5805,8 @@ Body:
- Id: 192
Name: NPC_MAGICALATTACK
Description: Demon Shock Attack
MaxLevel: 10
Type: Weapon
MaxLevel: 1
Type: Magic
TargetType: Attack
Flags:
IsNpc: true
@ -5912,34 +5912,13 @@ Body:
Name: NPC_KEEPING
Description: Keeping
MaxLevel: 1
Type: Weapon
TargetType: Self
DamageFlags:
NoDamage: true
Flags:
IsNpc: true
HitCount: 1
Duration1:
- Level: 1
Time: 60000
- Level: 2
Time: 70000
- Level: 3
Time: 80000
- Level: 4
Time: 90000
- Level: 5
Time: 100000
- Level: 6
Time: 110000
- Level: 7
Time: 120000
- Level: 8
Time: 130000
- Level: 9
Time: 140000
- Level: 10
Time: 150000
Duration1: 30000
Status: Keeping
- Id: 202
Name: NPC_DARKBREATH
@ -5979,60 +5958,19 @@ Body:
Flags:
IsNpc: true
HitCount: 1
Duration1:
- Level: 1
Time: 60000
- Level: 2
Time: 70000
- Level: 3
Time: 80000
- Level: 4
Time: 90000
- Level: 5
Time: 100000
- Level: 6
Time: 110000
- Level: 7
Time: 120000
- Level: 8
Time: 130000
- Level: 9
Time: 140000
- Level: 10
Time: 150000
Duration1: 15000
Status: Barrier
- Id: 205
Name: NPC_DEFENDER
Description: Defender
MaxLevel: 1
Type: Weapon
TargetType: Self
DamageFlags:
NoDamage: true
Flags:
IsNpc: true
HitCount: 1
Duration1:
- Level: 1
Time: 60000
- Level: 2
Time: 70000
- Level: 3
Time: 80000
- Level: 4
Time: 90000
- Level: 5
Time: 100000
- Level: 6
Time: 110000
- Level: 7
Time: 120000
- Level: 8
Time: 130000
- Level: 9
Time: 140000
- Level: 10
Time: 150000
Duration1: 15000
Status: Armor
- Id: 206
Name: NPC_LICK
@ -9398,8 +9336,7 @@ Body:
- Id: 349
Name: NPC_POWERUP
Description: Power Up
MaxLevel: 10
Type: Weapon
MaxLevel: 5
TargetType: Self
DamageFlags:
NoDamage: true
@ -9421,7 +9358,7 @@ Body:
- Id: 350
Name: NPC_AGIUP
Description: Agility UP
MaxLevel: 10
MaxLevel: 5
TargetType: Self
DamageFlags:
NoDamage: true

View File

@ -1130,6 +1130,8 @@ Body:
Watk_Element: true
- Status: Armor
DurationLookup: NPC_DEFENDER
CalcFlags:
Speed: true
- Status: Armor_Element_Water
Icon: EFST_RESIST_PROPERTY_WATER
CalcFlags:

View File

@ -6076,8 +6076,8 @@ Body:
- Id: 192
Name: NPC_MAGICALATTACK
Description: Demon Shock Attack
MaxLevel: 10
Type: Weapon
MaxLevel: 1
Type: Magic
TargetType: Attack
Flags:
IsNpc: true
@ -6183,34 +6183,13 @@ Body:
Name: NPC_KEEPING
Description: Keeping
MaxLevel: 1
Type: Weapon
TargetType: Self
DamageFlags:
NoDamage: true
Flags:
IsNpc: true
HitCount: 1
Duration1:
- Level: 1
Time: 60000
- Level: 2
Time: 70000
- Level: 3
Time: 80000
- Level: 4
Time: 90000
- Level: 5
Time: 100000
- Level: 6
Time: 110000
- Level: 7
Time: 120000
- Level: 8
Time: 130000
- Level: 9
Time: 140000
- Level: 10
Time: 150000
Duration1: 30000
Status: Keeping
- Id: 202
Name: NPC_DARKBREATH
@ -6250,60 +6229,19 @@ Body:
Flags:
IsNpc: true
HitCount: 1
Duration1:
- Level: 1
Time: 60000
- Level: 2
Time: 70000
- Level: 3
Time: 80000
- Level: 4
Time: 90000
- Level: 5
Time: 100000
- Level: 6
Time: 110000
- Level: 7
Time: 120000
- Level: 8
Time: 130000
- Level: 9
Time: 140000
- Level: 10
Time: 150000
Duration1: 15000
Status: Barrier
- Id: 205
Name: NPC_DEFENDER
Description: Defender
MaxLevel: 1
Type: Weapon
TargetType: Self
DamageFlags:
NoDamage: true
Flags:
IsNpc: true
HitCount: 1
Duration1:
- Level: 1
Time: 60000
- Level: 2
Time: 70000
- Level: 3
Time: 80000
- Level: 4
Time: 90000
- Level: 5
Time: 100000
- Level: 6
Time: 110000
- Level: 7
Time: 120000
- Level: 8
Time: 130000
- Level: 9
Time: 140000
- Level: 10
Time: 150000
Duration1: 15000
Status: Armor
- Id: 206
Name: NPC_LICK
@ -9708,8 +9646,7 @@ Body:
- Id: 349
Name: NPC_POWERUP
Description: Power Up
MaxLevel: 10
Type: Weapon
MaxLevel: 5
TargetType: Self
DamageFlags:
NoDamage: true
@ -9731,7 +9668,7 @@ Body:
- Id: 350
Name: NPC_AGIUP
Description: Agility UP
MaxLevel: 10
MaxLevel: 5
TargetType: Self
DamageFlags:
NoDamage: true

View File

@ -1148,6 +1148,8 @@ Body:
Watk_Element: true
- Status: Armor
DurationLookup: NPC_DEFENDER
CalcFlags:
Speed: true
- Status: Armor_Element_Water
Icon: EFST_RESIST_PROPERTY_WATER
CalcFlags:

View File

@ -1762,7 +1762,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
if((sce=tsc->getSCE(SC_ARMOR)) && //NPC_DEFENDER
sce->val3&flag && sce->val4&flag)
damage -= damage * tsc->getSCE(SC_ARMOR)->val2 / 100;
damage /= tsc->getSCE(SC_ARMOR)->val2;
if( tsc->getSCE(SC_ENERGYCOAT) && (skill_id == GN_HELLS_PLANT_ATK ||
#ifdef RENEWAL
@ -2932,10 +2932,9 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct
if (!first_call)
return (wd->type == DMG_CRITICAL || wd->type == DMG_MULTI_HIT_CRITICAL);
#ifdef RENEWAL
if (skill_id == NPC_CRITICALSLASH || skill_id == LG_PINPOINTATTACK) //Always critical skills
return true;
#endif
if( skill_id && !skill_get_nk(skill_id,NK_CRITICAL) )
return false;
@ -3367,18 +3366,26 @@ static bool attack_ignores_def(struct Damage* wd, struct block_list *src, struct
static bool battle_skill_stacks_masteries_vvs(uint16 skill_id, int type)
{
switch (skill_id) {
// PC skills that are unaffected
case PA_SHIELDCHAIN:
case CR_SHIELDBOOMERANG:
case AM_ACIDTERROR:
case MO_INVESTIGATE:
case MO_EXTREMITYFIST:
case PA_SACRIFICE:
case NPC_DRAGONBREATH:
case RK_DRAGONBREATH:
case RK_DRAGONBREATH_WATER:
case NC_SELFDESTRUCTION:
case LG_SHIELDPRESS:
case LG_EARTHDRIVE:
// NPC skills that are unaffected
case NPC_FIREBREATH:
case NPC_ICEBREATH:
case NPC_THUNDERBREATH:
case NPC_ACIDBREATH:
case NPC_DARKNESSBREATH:
case NPC_VAMPIRE_GIFT:
case NPC_DRAGONBREATH:
return false;
case CR_GRANDCROSS:
case NPC_GRANDDARKNESS:

View File

@ -6200,7 +6200,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
break;
case NPC_MAGICALATTACK:
skill_attack(BF_MAGIC,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);
sc_start(src,src,SC_MAGICALATTACK,100,skill_lv,skill_get_time(skill_id,skill_lv));
break;

View File

@ -8081,6 +8081,8 @@ static unsigned short status_calc_speed(struct block_list *bl, status_change *sc
speed = 200;
if( sc->getSCE(SC_DEFENDER) )
speed = max(speed, 200);
if (sc->getSCE(SC_ARMOR))
speed = max(speed, 200);
if( sc->getSCE(SC_WALKSPEED) && sc->getSCE(SC_WALKSPEED)->val1 > 0 ) // ChangeSpeed
speed = speed * 100 / sc->getSCE(SC_WALKSPEED)->val1;
@ -11467,7 +11469,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
break;
case SC_ARMOR:
// NPC_DEFENDER:
val2 = 80; // Damage reduction
val2 = 8; // Damage will be divided by this value
// Attack requirements to be blocked:
val3 = BF_LONG; // Range
val4 = BF_WEAPON|BF_MISC; // Type