diff --git a/PkmnLib.Dynamic/BattleFlow/MoveTurnExecutor.cs b/PkmnLib.Dynamic/BattleFlow/MoveTurnExecutor.cs index ee4486d..f95f92a 100644 --- a/PkmnLib.Dynamic/BattleFlow/MoveTurnExecutor.cs +++ b/PkmnLib.Dynamic/BattleFlow/MoveTurnExecutor.cs @@ -57,8 +57,7 @@ public static class MoveTurnExecutor return; } - var targetSide = battle.Sides[moveChoice.TargetSide]; - targetSide.RunScriptHook(x => x.ChangeIncomingTargets(moveChoice, ref targets)); + targets.WhereNotNull().RunScriptHook(x => x.ChangeIncomingTargets(moveChoice, ref targets)); byte numberOfHits = 1; moveChoice.RunScriptHook(x => x.ChangeNumberOfHits(moveChoice, ref numberOfHits)); @@ -154,6 +153,11 @@ public static class MoveTurnExecutor break; var useMove = executingMove.UseMove; + + var isContact = useMove.HasFlag("contact"); + executingMove.RunScriptHook(x => x.ModifyIsContact(executingMove, target, hitIndex, ref isContact)); + hitData.IsContact = isContact; + var hitType = (TypeIdentifier?)useMove.MoveType; executingMove.RunScriptHook(x => x.ChangeMoveType(executingMove, target, hitIndex, ref hitType)); diff --git a/PkmnLib.Dynamic/Models/ExecutingMove.cs b/PkmnLib.Dynamic/Models/ExecutingMove.cs index c6a93bc..dd71c42 100644 --- a/PkmnLib.Dynamic/Models/ExecutingMove.cs +++ b/PkmnLib.Dynamic/Models/ExecutingMove.cs @@ -37,6 +37,11 @@ public interface IHitData /// TypeIdentifier? Type { get; } + /// + /// Whether the hit is a contact hit. This is used to determine whether abilities that trigger on contact should be activated. + /// + bool IsContact { get; } + /// /// Whether the hit has failed. /// @@ -76,6 +81,9 @@ public record HitData : IHitData /// public TypeIdentifier? Type { get; internal set; } + /// + public bool IsContact { get; internal set; } + /// public bool HasFailed { get; private set; } diff --git a/PkmnLib.Dynamic/ScriptHandling/Script.cs b/PkmnLib.Dynamic/ScriptHandling/Script.cs index d335b94..b1eaf40 100644 --- a/PkmnLib.Dynamic/ScriptHandling/Script.cs +++ b/PkmnLib.Dynamic/ScriptHandling/Script.cs @@ -769,4 +769,12 @@ public abstract class Script : IDeepCloneable public virtual void ModifyWeight(ref float weight) { } + + /// + /// Modifies whether a move is a contact move or not. This is used for abilities such as Long Reach. + /// + public virtual void ModifyIsContact(IExecutingMove executingMove, IPokemon target, byte hitIndex, + ref bool isContact) + { + } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Data/Abilities.jsonc b/Plugins/PkmnLib.Plugin.Gen7/Data/Abilities.jsonc index dbae696..858099f 100755 --- a/Plugins/PkmnLib.Plugin.Gen7/Data/Abilities.jsonc +++ b/Plugins/PkmnLib.Plugin.Gen7/Data/Abilities.jsonc @@ -315,15 +315,33 @@ "klutz": { "effect": "klutz" }, - "leaf_guard": {}, - "levitate": {}, - "light_metal": {}, - "lightning_rod": {}, - "limber": {}, - "liquid_ooze": {}, - "liquid_voice": {}, - "long_reach": {}, - "magic_bounce": {}, + "leaf_guard": { + "effect": "leaf_guard" + }, + "levitate": { + "effect": "levitate" + }, + "light_metal": { + "effect": "light_metal" + }, + "lightning_rod": { + "effect": "lightning_rod" + }, + "limber": { + "effect": "limber" + }, + "liquid_ooze": { + "effect": "liquid_ooze" + }, + "liquid_voice": { + "effect": "liquid_voice" + }, + "long_reach": { + "effect": "long_reach" + }, + "magic_bounce": { + "effect": "magic_bounce" + }, "magic_guard": {}, "magician": {}, "magma_armor": {}, diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Aftermath.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Aftermath.cs index 9e53410..ea515a9 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Aftermath.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Aftermath.cs @@ -14,7 +14,7 @@ public class Aftermath : Script /// public override void OnIncomingHit(IExecutingMove move, IPokemon target, byte hit) { - _lastAttack = move; + _lastAttack = !move.GetHitData(target, hit).IsContact ? move : null; } /// @@ -22,7 +22,7 @@ public class Aftermath : Script { if (source != DamageSource.MoveDamage) return; - if (_lastAttack is null || !_lastAttack.UseMove.HasFlag("contact")) + if (_lastAttack is null) return; var user = _lastAttack.User; if (!user.IsUsable) diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/CuteCharm.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/CuteCharm.cs index 2cf200b..31988c2 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/CuteCharm.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/CuteCharm.cs @@ -17,7 +17,7 @@ public class CuteCharm : Script public override void OnIncomingHit(IExecutingMove move, IPokemon target, byte hit) { // Only trigger on contact moves - if (!move.UseMove.HasFlag("contact")) + if (!move.GetHitData(target, hit).IsContact) return; // 30% chance to infatuate diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/EffectSpore.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/EffectSpore.cs index fa29722..737686f 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/EffectSpore.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/EffectSpore.cs @@ -19,7 +19,7 @@ public class EffectSpore : Script return; if (move.User.HasHeldItem("safety_goggles")) return; - if (!move.UseMove.HasFlag("contact")) + if (!move.GetHitData(target, hit).IsContact) return; var rng = move.Battle.Random; diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FlameBody.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FlameBody.cs index d4c92b2..71e5da3 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FlameBody.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FlameBody.cs @@ -12,7 +12,7 @@ public class FlameBody : Script /// public override void OnIncomingHit(IExecutingMove move, IPokemon target, byte hit) { - if (!move.UseMove.HasFlag("contact")) + if (!move.GetHitData(target, hit).IsContact) return; var rng = move.Battle.Random; diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Fluffy.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Fluffy.cs index b0c8710..003ec38 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Fluffy.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Fluffy.cs @@ -16,7 +16,7 @@ public class Fluffy : Script { modifier *= 2f; } - if (move.UseMove.HasFlag("contact")) + if (move.GetHitData(target, hit).IsContact) { modifier *= 0.5f; } diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Gooey.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Gooey.cs index 788dfc9..2de0126 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Gooey.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Gooey.cs @@ -11,7 +11,7 @@ public class Gooey : Script /// public override void OnIncomingHit(IExecutingMove move, IPokemon target, byte hit) { - if (!move.UseMove.HasFlag("contact")) + if (!move.GetHitData(target, hit).IsContact) return; move.User.ChangeStatBoost(Statistic.Speed, -1, false, false); } diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/IronBarbs.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/IronBarbs.cs index 5f7afd3..efd5629 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/IronBarbs.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/IronBarbs.cs @@ -11,7 +11,7 @@ public class IronBarbs : Script /// public override void OnIncomingHit(IExecutingMove move, IPokemon target, byte hit) { - if (move.UseMove.HasFlag("contact")) + if (move.GetHitData(target, hit).IsContact) { move.User.Damage(move.User.MaxHealth / 8, DamageSource.Misc); } diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/LeafGuard.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/LeafGuard.cs new file mode 100644 index 0000000..cff2d41 --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/LeafGuard.cs @@ -0,0 +1,21 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Leaf Guard is an ability that prevents status conditions in harsh sunlight. +/// +/// Bulbapedia - Leaf Guard +/// +[Script(ScriptCategory.Ability, "leaf_guard")] +public class LeafGuard : Script +{ + /// + public override void PreventStatusChange(IPokemon pokemon, StringKey status, bool selfInflicted, + ref bool preventStatus) + { + if (pokemon.BattleData?.Battle.WeatherName != ScriptUtils.ResolveName()) + return; + if (selfInflicted) + return; + preventStatus = true; + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Levitate.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Levitate.cs new file mode 100644 index 0000000..b44d4c9 --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Levitate.cs @@ -0,0 +1,16 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Levitate is an ability that gives full immunity to all Ground-type moves. +/// +/// Bulbapedia - Levitate +/// +[Script(ScriptCategory.Ability, "levitate")] +public class Levitate : Script +{ + /// + public override void IsFloating(IPokemon pokemon, ref bool isFloating) + { + isFloating = true; + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/LightMetal.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/LightMetal.cs new file mode 100644 index 0000000..f05397c --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/LightMetal.cs @@ -0,0 +1,16 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Light Metal is an ability that halves the Pokémon's weight. +/// +/// Bulbapedia - Light Metal +/// +[Script(ScriptCategory.Ability, "light_metal")] +public class LightMetal : Script +{ + /// + public override void ModifyWeight(ref float weight) + { + weight *= 0.5f; + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/LightningRod.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/LightningRod.cs new file mode 100644 index 0000000..e993b0b --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/LightningRod.cs @@ -0,0 +1,34 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Lightning Rod is an ability that draws all Electric-type moves to the Pokémon, raising its Special Attack. +/// +/// Bulbapedia - Lightning Rod +/// +[Script(ScriptCategory.Ability, "lightning_rod")] +public class LightningRod : Script +{ + /// + public override void ChangeIncomingTargets(IMoveChoice moveChoice, ref IReadOnlyList targets) + { + if (moveChoice.ChosenMove.MoveData.MoveType.Name == "electric" && targets.Count == 1) + { + targets = [moveChoice.User]; + } + } + + /// + public override void ChangeEffectiveness(IExecutingMove move, IPokemon target, byte hit, ref float effectiveness) + { + if (move.GetHitData(target, hit).Type?.Name != "electric") + return; + + effectiveness = 0f; + EventBatchId batchId = new(); + move.Battle.EventHook.Invoke(new AbilityTriggerEvent(move.User) + { + BatchId = batchId, + }); + move.User.ChangeStatBoost(Statistic.SpecialAttack, 1, true, true, batchId); + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Limber.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Limber.cs new file mode 100644 index 0000000..86f948e --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Limber.cs @@ -0,0 +1,25 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Limber is an ability that prevents the Pokémon from being paralyzed. +/// +/// Bulbapedia - Limber +/// +[Script(ScriptCategory.Ability, "limber")] +public class Limber : Script +{ + /// + public override void PreventStatusChange(IPokemon pokemon, StringKey status, bool selfInflicted, + ref bool preventStatus) + { + if (status != ScriptUtils.ResolveName()) + return; + + // If the status is being inflicted by a move, we can also prevent the move from inflicting it + if (selfInflicted) + return; + + pokemon.BattleData?.Battle.EventHook.Invoke(new AbilityTriggerEvent(pokemon)); + preventStatus = true; + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/LiquidOoze.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/LiquidOoze.cs new file mode 100644 index 0000000..1902f59 --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/LiquidOoze.cs @@ -0,0 +1,19 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Liquid Ooze is an ability that damages attackers using draining moves instead of healing them. +/// +/// Bulbapedia - Liquid Ooze +/// +[Script(ScriptCategory.Ability, "liquid_ooze")] +public class LiquidOoze : Script +{ + /// + public override void CustomTrigger(StringKey eventName, IDictionary? parameters) + { + if (eventName != CustomTriggers.ModifyDrain || parameters is null) + return; + + parameters["invert"] = true; + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/LiquidVoice.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/LiquidVoice.cs new file mode 100644 index 0000000..571fee0 --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/LiquidVoice.cs @@ -0,0 +1,21 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Liquid Voice is an ability that makes all sound-based moves become Water-type. +/// +/// Bulbapedia - Liquid Voice +/// +[Script(ScriptCategory.Ability, "liquid_voice")] +public class LiquidVoice : Script +{ + /// + public override void ChangeMoveType(IExecutingMove move, IPokemon target, byte hit, + ref TypeIdentifier? typeIdentifier) + { + if (move.UseMove.HasFlag("sound") && + move.Battle.Library.StaticLibrary.Types.TryGetTypeIdentifier("water", out var waterType)) + { + typeIdentifier = waterType; + } + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/LongReach.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/LongReach.cs new file mode 100644 index 0000000..6181189 --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/LongReach.cs @@ -0,0 +1,17 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Long Reach is an ability that allows the Pokémon to use contact moves without making contact. +/// +/// Bulbapedia - Long Reach +/// +[Script(ScriptCategory.Ability, "long_reach")] +public class LongReach : Script +{ + /// + public override void ModifyIsContact(IExecutingMove executingMove, IPokemon target, byte hitIndex, + ref bool isContact) + { + isContact = false; + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/MagicBounce.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/MagicBounce.cs new file mode 100644 index 0000000..d72eba4 --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/MagicBounce.cs @@ -0,0 +1,21 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Magic Bounce is an ability that reflects status moves back to the user. +/// +/// Bulbapedia - Magic Bounce +/// +[Script(ScriptCategory.Ability, "magic_bounce")] +public class MagicBounce : Script +{ + /// + public override void ChangeIncomingTargets(IMoveChoice moveChoice, ref IReadOnlyList targets) + { + if (moveChoice.ChosenMove.MoveData.HasFlag("reflectable")) + { + var target = targets[0]; + target?.BattleData?.Battle.EventHook.Invoke(new AbilityTriggerEvent(target)); + targets = [moveChoice.User]; + } + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/CustomTriggers.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/CustomTriggers.cs index 132bf9b..be64c6c 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/CustomTriggers.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/CustomTriggers.cs @@ -27,4 +27,6 @@ public static class CustomTriggers public static readonly StringKey BypassProtection = "bypass_protection"; public static readonly StringKey BypassSubstitute = "bypass_subsitute"; + + public static readonly StringKey ModifyDrain = "modify_drain"; } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Drain.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Drain.cs index bcb7f7a..9a9474f 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Drain.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Drain.cs @@ -1,5 +1,3 @@ -using PkmnLib.Static.Utils; - namespace PkmnLib.Plugin.Gen7.Scripts.Moves; [Script(ScriptCategory.Move, "drain")] @@ -24,6 +22,26 @@ public class Drain : Script var healed = (uint)(damage * DrainModifier); if (move.User.HasHeldItem("big_root")) healed = (uint)(healed * 1.3f); - user.Heal(healed); + var invert = false; + var parameters = new Dictionary + { + { "user", user }, + { "target", target }, + { "damage", damage }, + { "healed", healed }, + { "invert", invert }, + }; + target.RunScriptHook(x => x.CustomTrigger(CustomTriggers.ModifyDrain, parameters)); + if (parameters.TryGetValue("invert", out var invertObj) && invertObj is bool invertBool) + invert = invertBool; + + if (invert) + { + user.Damage(damage, DamageSource.Misc); + } + else + { + user.Heal(healed); + } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/DreamEater.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/DreamEater.cs index 12f0982..32202cc 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/DreamEater.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/DreamEater.cs @@ -18,6 +18,27 @@ public class DreamEater : Script var healed = (uint)(damage * 0.5f); if (move.User.HasHeldItem("big_root")) healed = (uint)(healed * 1.3f); - user.Heal(healed); + + var invert = false; + var parameters = new Dictionary + { + { "user", user }, + { "target", target }, + { "damage", damage }, + { "healed", healed }, + { "invert", invert }, + }; + target.RunScriptHook(x => x.CustomTrigger(CustomTriggers.ModifyDrain, parameters)); + if (parameters.TryGetValue("invert", out var invertObj) && invertObj is bool invertBool) + invert = invertBool; + + if (invert) + { + user.Damage(damage, DamageSource.Misc); + } + else + { + user.Heal(healed); + } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BanefulBunkerEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BanefulBunkerEffect.cs index 6270ce7..21d8877 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BanefulBunkerEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BanefulBunkerEffect.cs @@ -9,7 +9,8 @@ public class BanefulBunkerEffect : ProtectionEffectScript public override void BlockIncomingHit(IExecutingMove executingMove, IPokemon target, byte hitIndex, ref bool block) { base.BlockIncomingHit(executingMove, target, hitIndex, ref block); - if (executingMove.UseMove.Category != MoveCategory.Status && executingMove.UseMove.HasFlag("contact")) + if (executingMove.UseMove.Category != MoveCategory.Status && + executingMove.GetHitData(target, hitIndex).IsContact) { executingMove.User.SetStatus("poisoned", false); } diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BeakBlastEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BeakBlastEffect.cs index 1d5c999..75b4cc5 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BeakBlastEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BeakBlastEffect.cs @@ -6,7 +6,7 @@ public class BeakBlastEffect : Script /// public override void OnIncomingHit(IExecutingMove move, IPokemon target, byte hit) { - if (move.UseMove.HasFlag("contact")) + if (move.GetHitData(target, hit).IsContact) { move.User.SetStatus("burned", false); } diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/KingsShield.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/KingsShield.cs index 44d69ca..dc5d4cf 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/KingsShield.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/KingsShield.cs @@ -9,7 +9,8 @@ public class KingsShield : ProtectionEffectScript public override void BlockIncomingHit(IExecutingMove executingMove, IPokemon target, byte hitIndex, ref bool block) { base.BlockIncomingHit(executingMove, target, hitIndex, ref block); - if (executingMove.UseMove.Category != MoveCategory.Status && executingMove.UseMove.HasFlag("contact")) + if (executingMove.UseMove.Category != MoveCategory.Status && + executingMove.GetHitData(target, hitIndex).IsContact) { executingMove.User.ChangeStatBoost(Statistic.Accuracy, -2, false, false); }