Add EventHook parameter to item use scripts
All checks were successful
Build / Build (push) Successful in 47s

Items can be used on Pokemon outside of battle, and we want the user of the library to be able to check for what changed. This allows for example a heal event to be sent back to the user of the library after using an item.
This commit is contained in:
Deukhoofd 2025-06-15 11:59:17 +02:00
parent f5d18d7186
commit defb1349ca
Signed by: Deukhoofd
GPG Key ID: F63E044490819F6F
7 changed files with 21 additions and 17 deletions

View File

@ -174,6 +174,6 @@ public static class TurnRunner
var side = battle.Sides[itemChoice.TargetSide.Value]; var side = battle.Sides[itemChoice.TargetSide.Value];
target = side.Pokemon[itemChoice.TargetPosition.Value]; target = side.Pokemon[itemChoice.TargetPosition.Value];
} }
itemChoice.Item.RunItemScript(battle.Library.ScriptResolver, target ?? user); itemChoice.Item.RunItemScript(battle.Library.ScriptResolver, target ?? user, battle.EventHook);
} }
} }

View File

@ -340,7 +340,8 @@ public interface IPokemon : IScriptSource, IDeepCloneable
/// Heals the Pokemon by a specific amount. Unless allow_revive is set to true, this will not /// Heals the Pokemon by a specific amount. Unless allow_revive is set to true, this will not
/// heal if the Pokemon has 0 health. If the amount healed is 0, this will return false. /// heal if the Pokemon has 0 health. If the amount healed is 0, this will return false.
/// </summary> /// </summary>
bool Heal(uint heal, bool allowRevive = false, EventBatchId batchId = default, bool forceHeal = false); bool Heal(uint heal, bool allowRevive = false, EventBatchId batchId = default, bool forceHeal = false,
EventHook? customEventHook = null);
/// <summary> /// <summary>
/// Restores all PP of the Pokemon. /// Restores all PP of the Pokemon.
@ -1118,7 +1119,8 @@ public class PokemonImpl : ScriptSource, IPokemon
} }
/// <inheritdoc /> /// <inheritdoc />
public bool Heal(uint heal, bool allowRevive, EventBatchId batchId = default, bool forceHeal = false) public bool Heal(uint heal, bool allowRevive, EventBatchId batchId = default, bool forceHeal = false,
EventHook? customEventHook = null)
{ {
if (IsFainted && !allowRevive) if (IsFainted && !allowRevive)
return false; return false;
@ -1137,7 +1139,8 @@ public class PokemonImpl : ScriptSource, IPokemon
} }
var newHealth = CurrentHealth + heal; var newHealth = CurrentHealth + heal;
BattleData?.Battle.EventHook.Invoke(new HealEvent(this, CurrentHealth, newHealth) customEventHook ??= BattleData?.Battle.EventHook;
customEventHook?.Invoke(new HealEvent(this, CurrentHealth, newHealth)
{ {
BatchId = batchId, BatchId = batchId,
}); });

View File

@ -1,3 +1,4 @@
using PkmnLib.Dynamic.Events;
using PkmnLib.Dynamic.Models; using PkmnLib.Dynamic.Models;
using PkmnLib.Static; using PkmnLib.Static;
using PkmnLib.Static.Utils; using PkmnLib.Static.Utils;
@ -55,15 +56,14 @@ public abstract class ItemScript : IDeepCloneable
/// <summary> /// <summary>
/// Handles the use of the item. /// Handles the use of the item.
/// </summary> /// </summary>
public virtual void OnUse() public virtual void OnUse(EventHook eventHook)
{ {
} }
/// <summary> /// <summary>
/// Handles the use of the item on the given target. /// Handles the use of the item on the given target.
/// </summary> /// </summary>
/// <param name="target"></param> public virtual void OnUseWithTarget(IPokemon target, EventHook eventHook)
public virtual void OnUseWithTarget(IPokemon target)
{ {
} }
} }

View File

@ -1,3 +1,4 @@
using PkmnLib.Dynamic.Events;
using PkmnLib.Dynamic.Models; using PkmnLib.Dynamic.Models;
using PkmnLib.Static; using PkmnLib.Static;
@ -19,12 +20,10 @@ public abstract class PokeballScript : ItemScript
public abstract byte GetCatchRate(IPokemon target); public abstract byte GetCatchRate(IPokemon target);
/// <inheritdoc /> /// <inheritdoc />
public override void OnUseWithTarget(IPokemon target) public override void OnUseWithTarget(IPokemon target, EventHook eventHook)
{ {
var battleData = target.BattleData; var battleData = target.BattleData;
if (battleData == null)
return;
battleData.Battle.AttempCapture(battleData.SideIndex, battleData.Position, Item); battleData?.Battle.AttempCapture(battleData.SideIndex, battleData.Position, Item);
} }
} }

View File

@ -1,4 +1,5 @@
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using PkmnLib.Dynamic.Events;
using PkmnLib.Dynamic.Models; using PkmnLib.Dynamic.Models;
using PkmnLib.Static; using PkmnLib.Static;
@ -95,7 +96,8 @@ public static class ScriptExecution
/// <summary> /// <summary>
/// Executes a script on an item. /// Executes a script on an item.
/// </summary> /// </summary>
public static void RunItemScript(this IItem item, ScriptResolver scriptResolver, IPokemon? target) public static void RunItemScript(this IItem item, ScriptResolver scriptResolver, IPokemon? target,
EventHook eventHook)
{ {
if (!scriptResolver.TryResolveBattleItemScript(item, out var itemScript)) if (!scriptResolver.TryResolveBattleItemScript(item, out var itemScript))
{ {
@ -110,11 +112,11 @@ public static class ScriptExecution
{ {
if (target == null) if (target == null)
throw new ArgumentNullException(nameof(target), "Item script requires a target."); throw new ArgumentNullException(nameof(target), "Item script requires a target.");
itemScript.OnUseWithTarget(target); itemScript.OnUseWithTarget(target, eventHook);
} }
else else
{ {
itemScript.OnUse(); itemScript.OnUse(eventHook);
} }
} }
} }

View File

@ -34,8 +34,8 @@ public class HealingItem : ItemScript
public override bool IsTargetValid(IPokemon target) => !target.IsFainted; public override bool IsTargetValid(IPokemon target) => !target.IsFainted;
/// <inheritdoc /> /// <inheritdoc />
public override void OnUseWithTarget(IPokemon target) public override void OnUseWithTarget(IPokemon target, EventHook eventHook)
{ {
target.Heal(_healAmount); target.Heal(_healAmount, customEventHook: eventHook);
} }
} }

View File

@ -20,6 +20,6 @@ public class BugBite : Script
} }
_ = target.SetHeldItem(null); _ = target.SetHeldItem(null);
targetHeldItem.RunItemScript(battleData.Battle.Library.ScriptResolver, user); targetHeldItem.RunItemScript(battleData.Battle.Library.ScriptResolver, user, move.Battle.EventHook);
} }
} }