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);
}