From 03f07ab8c7092ee32cf00b634765d3b08eeb83e9 Mon Sep 17 00:00:00 2001 From: Playtester <3785983+Playtester@users.noreply.github.com> Date: Mon, 8 Apr 2024 20:24:32 +0200 Subject: [PATCH] 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 --- db/pre-re/skill_db.yml | 77 ++++-------------------------------------- db/pre-re/status.yml | 2 ++ db/re/skill_db.yml | 77 ++++-------------------------------------- db/re/status.yml | 2 ++ src/map/battle.cpp | 15 +++++--- src/map/skill.cpp | 2 +- src/map/status.cpp | 4 ++- 7 files changed, 33 insertions(+), 146 deletions(-) diff --git a/db/pre-re/skill_db.yml b/db/pre-re/skill_db.yml index adc399bfe6..6606e2e507 100644 --- a/db/pre-re/skill_db.yml +++ b/db/pre-re/skill_db.yml @@ -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 diff --git a/db/pre-re/status.yml b/db/pre-re/status.yml index 28665a0ec7..6665f2f286 100644 --- a/db/pre-re/status.yml +++ b/db/pre-re/status.yml @@ -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: diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 166bb283fd..16e9746d00 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -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 diff --git a/db/re/status.yml b/db/re/status.yml index 68ee71e0b2..578f4df3f5 100644 --- a/db/re/status.yml +++ b/db/re/status.yml @@ -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: diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 79f0a058c4..1483c5ea20 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -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: diff --git a/src/map/skill.cpp b/src/map/skill.cpp index b68fc26c1d..043ddaef5e 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -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; diff --git a/src/map/status.cpp b/src/map/status.cpp index 5ea8a160aa..f6f3b068a7 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -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