From 98aafb059205b3c05e2dd161f410d3683af4feb5 Mon Sep 17 00:00:00 2001
From: TheLimeGlass <seantgrover@gmail.com>
Date: Wed, 17 Jan 2024 11:15:59 -0700
Subject: [PATCH 1/7] Update healing event and related expressions

---
 .../ch/njol/skript/events/EvtHealing.java     | 94 +++++++++++++++++++
 .../ch/njol/skript/events/SimpleEvents.java   |  5 -
 .../skript/expressions/ExprHealAmount.java    | 75 ++++++++-------
 .../skript/expressions/ExprHealReason.java    | 47 ++++++----
 4 files changed, 163 insertions(+), 58 deletions(-)
 create mode 100644 src/main/java/ch/njol/skript/events/EvtHealing.java

diff --git a/src/main/java/ch/njol/skript/events/EvtHealing.java b/src/main/java/ch/njol/skript/events/EvtHealing.java
new file mode 100644
index 00000000000..dfb2232710d
--- /dev/null
+++ b/src/main/java/ch/njol/skript/events/EvtHealing.java
@@ -0,0 +1,94 @@
+/**
+ *   This file is part of Skript.
+ *
+ *  Skript is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  Skript is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with Skript.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Copyright Peter Güttinger, SkriptLang team and contributors
+ */
+package ch.njol.skript.events;
+
+import org.bukkit.entity.Entity;
+import org.bukkit.event.Event;
+import org.bukkit.event.entity.EntityRegainHealthEvent;
+import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason;
+import org.eclipse.jdt.annotation.Nullable;
+
+import ch.njol.skript.Skript;
+import ch.njol.skript.entity.EntityData;
+import ch.njol.skript.lang.Literal;
+import ch.njol.skript.lang.SkriptEvent;
+import ch.njol.skript.lang.SkriptParser.ParseResult;
+
+public class EvtHealing extends SkriptEvent {
+
+	static {
+		Skript.registerEvent("Heal", EvtHealing.class, EntityRegainHealthEvent.class, "heal[ing] [of %-entitydatas%] [(from|due to|by) %-healreasons%]", "%entitydatas% heal[ing] [(from|due to|by) %-healreasons%]")
+				.description("Called when an entity is healed, e.g. by eating (players), being fed (pets), or by the effect of a potion of healing (overworld mobs) or harm (nether mobs).")
+				.examples("on heal:", "on player healing from a regeneration potion:",
+						"on healing of a zombie, cow or a wither:" +
+								"\theal reason is healing potion" +
+								"\tcancel event"
+				)
+				.since("1.0, INSERT VERSION (by entity)");
+	}
+
+	@Nullable
+	private Literal<EntityData<?>> entityDatas;
+
+	@Nullable
+	private Literal<RegainReason> healReasons;
+
+	@Override
+	@SuppressWarnings("unchecked")
+	public boolean init(Literal<?>[] args, int matchedPattern, ParseResult parser) {
+		entityDatas = (Literal<EntityData<?>>) args[0];
+		healReasons = (Literal<RegainReason>) args[1];
+		return true;
+	}
+
+	@Override
+	public boolean check(Event event) {
+		if (!(event instanceof EntityRegainHealthEvent))
+			return false;
+		EntityRegainHealthEvent healthEvent = (EntityRegainHealthEvent) event;
+		if (entityDatas != null) {
+			Entity compare = healthEvent.getEntity();
+			boolean result = false;
+			for (EntityData<?> entityData : entityDatas.getArray()) {
+				if (entityData.isInstance(compare))
+					result = true;
+			}
+			if (!result)
+				return false;
+		}
+		if (healReasons != null) {
+			RegainReason compare = healthEvent.getRegainReason();
+			boolean result = false;
+			for (RegainReason healReason : healReasons.getArray()) {
+				if (healReason == compare)
+					result = true;
+			}
+			if (!result)
+				return false;
+		}
+		return true;
+	}
+
+	@Override
+	public String toString(@Nullable Event event, boolean debug) {
+		return "heal" + (entityDatas != null ? " of " + entityDatas.toString(event, debug) : "") +
+				(healReasons != null ? " by " + healReasons.toString(event, debug) : "");
+	}
+
+}
diff --git a/src/main/java/ch/njol/skript/events/SimpleEvents.java b/src/main/java/ch/njol/skript/events/SimpleEvents.java
index ae20f51dc0d..07f79c62cb0 100644
--- a/src/main/java/ch/njol/skript/events/SimpleEvents.java
+++ b/src/main/java/ch/njol/skript/events/SimpleEvents.java
@@ -45,7 +45,6 @@
 import org.bukkit.event.entity.EntityExplodeEvent;
 import org.bukkit.event.entity.EntityPortalEnterEvent;
 import org.bukkit.event.entity.EntityPortalEvent;
-import org.bukkit.event.entity.EntityRegainHealthEvent;
 import org.bukkit.event.entity.EntityResurrectEvent;
 import org.bukkit.event.entity.EntityTameEvent;
 import org.bukkit.event.entity.EntityToggleGlideEvent;
@@ -209,10 +208,6 @@ public class SimpleEvents {
 				.description("Called when an entity enters a nether portal or an end portal. Please note that this event will be fired many times for a nether portal.")
 				.examples("on portal enter:")
 				.since("1.0");
-		Skript.registerEvent("Heal", SimpleEvent.class, EntityRegainHealthEvent.class, "heal[ing]")
-				.description("Called when an entity is healed, e.g. by eating (players), being fed (pets), or by the effect of a potion of healing (overworld mobs) or harm (nether mobs).")
-				.examples("on heal:")
-				.since("1.0");
 		Skript.registerEvent("Tame", SimpleEvent.class, EntityTameEvent.class, "[entity] tam(e|ing)")
 				.description("Called when a player tames a wolf or ocelot. Can be cancelled to prevent the entity from being tamed.")
 				.examples("on tame:")
diff --git a/src/main/java/ch/njol/skript/expressions/ExprHealAmount.java b/src/main/java/ch/njol/skript/expressions/ExprHealAmount.java
index 9e74f6aa68e..9c66ed878fc 100644
--- a/src/main/java/ch/njol/skript/expressions/ExprHealAmount.java
+++ b/src/main/java/ch/njol/skript/expressions/ExprHealAmount.java
@@ -25,6 +25,7 @@
 
 import ch.njol.skript.Skript;
 import ch.njol.skript.classes.Changer;
+import ch.njol.skript.classes.Changer.ChangeMode;
 import ch.njol.skript.doc.Description;
 import ch.njol.skript.doc.Events;
 import ch.njol.skript.doc.Examples;
@@ -32,49 +33,49 @@
 import ch.njol.skript.doc.Since;
 import ch.njol.skript.lang.Expression;
 import ch.njol.skript.lang.ExpressionType;
-import ch.njol.skript.lang.SkriptParser;
+import ch.njol.skript.lang.SkriptParser.ParseResult;
 import ch.njol.skript.lang.util.SimpleExpression;
-import ch.njol.skript.log.ErrorQuality;
 import ch.njol.util.Kleenean;
 import ch.njol.util.coll.CollectionUtils;
 
 @Name("Heal Amount")
-@Description("The amount of health healed in a healing event.")
-@Examples({"increase heal amount by 2",
-	"remove 0.5 from heal amount"})
-@Since("2.5.1")
+@Description("The amount of health healed in a <a href='./events.html#heal'>heal event</a>.")
+@Examples({
+	"on player healing:",
+		"\tincrease the heal amount by 2",
+		"\tremove 0.5 from the healing amount"
+})
 @Events("heal")
-public class ExprHealAmount extends SimpleExpression<Number> {
-	
+@Since("2.5.1")
+public class ExprHealAmount extends SimpleExpression<Double> {
+
 	static {
-		Skript.registerExpression(ExprHealAmount.class, Number.class, ExpressionType.SIMPLE, "[the] heal amount");
+		Skript.registerExpression(ExprHealAmount.class, Double.class, ExpressionType.SIMPLE, "[the] heal[ing] amount");
 	}
-	
-	@SuppressWarnings("null")
+
 	private Kleenean delay;
-	
+
 	@Override
-	public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) {
+	public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
 		if (!getParser().isCurrentEvent(EntityRegainHealthEvent.class)) {
-			Skript.error("The expression 'heal amount' may only be used in a healing event", ErrorQuality.SEMANTIC_ERROR);
+			Skript.error("The expression 'heal amount' may only be used in a healing event");
 			return false;
 		}
 		delay = isDelayed;
 		return true;
 	}
-	
+
 	@Nullable
 	@Override
-	protected Number[] get(Event e) {
-		if (!(e instanceof EntityRegainHealthEvent))
+	protected Double[] get(Event event) {
+		if (!(event instanceof EntityRegainHealthEvent))
 			return null;
-
-		return new Number[]{((EntityRegainHealthEvent) e).getAmount()};
+		return new Double[]{((EntityRegainHealthEvent) event).getAmount()};
 	}
-	
+
 	@Nullable
 	@Override
-	public Class<?>[] acceptChange(Changer.ChangeMode mode) {
+	public Class<?>[] acceptChange(ChangeMode mode) {
 		if (delay != Kleenean.FALSE) {
 			Skript.error("The heal amount cannot be changed after the event has already passed");
 			return null;
@@ -83,42 +84,48 @@ public Class<?>[] acceptChange(Changer.ChangeMode mode) {
 			return null;
 		return CollectionUtils.array(Number.class);
 	}
-	
+
 	@Override
-	public void change(Event e, @Nullable Object[] delta, Changer.ChangeMode mode) {
-		if (!(e instanceof EntityRegainHealthEvent))
+	public void change(Event event, @Nullable Object[] delta, ChangeMode mode) {
+		if (!(event instanceof EntityRegainHealthEvent))
 			return;
 
+		EntityRegainHealthEvent healthEvent = (EntityRegainHealthEvent) event;
 		double value = delta == null ? 0 : ((Number) delta[0]).doubleValue();
 		switch (mode) {
 			case SET:
 			case DELETE:
-				((EntityRegainHealthEvent) e).setAmount(value);
+				healthEvent.setAmount(value);
 				break;
 			case ADD:
-				((EntityRegainHealthEvent) e).setAmount(((EntityRegainHealthEvent) e).getAmount() + value);
+				healthEvent.setAmount(healthEvent.getAmount() + value);
 				break;
 			case REMOVE:
-				((EntityRegainHealthEvent) e).setAmount(((EntityRegainHealthEvent) e).getAmount() - value);
+				healthEvent.setAmount(healthEvent.getAmount() - value);
 				break;
 			default:
 				break;
 		}
 	}
-	
+
+	@Override
+	public boolean setTime(int time) {
+		return super.setTime(time);
+	}
+
 	@Override
 	public boolean isSingle() {
 		return true;
 	}
-	
+
 	@Override
-	public Class<? extends Number> getReturnType() {
-		return Number.class;
+	public Class<? extends Double> getReturnType() {
+		return Double.class;
 	}
-	
+
 	@Override
-	public String toString(@Nullable Event e, boolean debug) {
+	public String toString(@Nullable Event event, boolean debug) {
 		return "heal amount";
 	}
-	
+
 }
diff --git a/src/main/java/ch/njol/skript/expressions/ExprHealReason.java b/src/main/java/ch/njol/skript/expressions/ExprHealReason.java
index 12dc0270976..ea47c022894 100644
--- a/src/main/java/ch/njol/skript/expressions/ExprHealReason.java
+++ b/src/main/java/ch/njol/skript/expressions/ExprHealReason.java
@@ -25,6 +25,7 @@
 
 import ch.njol.skript.Skript;
 import ch.njol.skript.doc.Description;
+import ch.njol.skript.doc.Events;
 import ch.njol.skript.doc.Examples;
 import ch.njol.skript.doc.Name;
 import ch.njol.skript.doc.Since;
@@ -32,53 +33,61 @@
 import ch.njol.skript.lang.ExpressionType;
 import ch.njol.skript.lang.SkriptParser.ParseResult;
 import ch.njol.skript.lang.util.SimpleExpression;
-import ch.njol.skript.log.ErrorQuality;
+import ch.njol.skript.registrations.EventValues;
 import ch.njol.util.Kleenean;
 
-
 @Name("Heal Reason")
-@Description("The <a href='./classes.html#healreason'>heal reason</a> of a heal event. Please click on the link for more information.")
-@Examples({"on heal:",
-	"\tif heal reason = satiated:",
-	"\t\tsend \"You ate enough food and gained health back!\" to player"})
+@Description("The <a href='./classes.html#healreason'>heal reason</a> of a <a href='./events.html#heal'>heal event</a>.")
+@Examples({
+	"on heal:",
+		"\theal reason is satiated",
+		"\tsend \"You ate enough food and gained full health back!\""
+})
+@Events("heal")
 @Since("2.5")
 public class ExprHealReason extends SimpleExpression<RegainReason> {
-	
+
 	static {
-		Skript.registerExpression(ExprHealReason.class, RegainReason.class, ExpressionType.SIMPLE, "(regen|health regain|heal) (reason|cause)");
+		Skript.registerExpression(ExprHealReason.class, RegainReason.class, ExpressionType.SIMPLE, "(regen|health regain|heal[ing]) (reason|cause)");
 	}
-	
+
 	@Override
 	public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
 		if (!getParser().isCurrentEvent(EntityRegainHealthEvent.class)) {
-			Skript.error("Heal reason can only be used in an on heal event", ErrorQuality.SEMANTIC_ERROR);
+			Skript.error("The expression 'heal reason' may only be used in a healing event");
 			return false;
 		}
 		return true;
 	}
-	
+
 	@Nullable
 	@Override
-	protected RegainReason[] get(Event e) {
-		if (!(e instanceof EntityRegainHealthEvent))
+	protected RegainReason[] get(Event event) {
+		if (!(event instanceof EntityRegainHealthEvent))
 			return null;
+		return new RegainReason[]{((EntityRegainHealthEvent) event).getRegainReason()};
+	}
 
-		return new RegainReason[]{((EntityRegainHealthEvent) e).getRegainReason()};
+	@Override
+	public boolean setTime(int time) {
+		if (time == EventValues.TIME_FUTURE)
+			return false;
+		return super.setTime(time);
 	}
-	
+
 	@Override
 	public boolean isSingle() {
 		return true;
 	}
-	
+
 	@Override
 	public Class<? extends RegainReason> getReturnType() {
 		return RegainReason.class;
 	}
-	
+
 	@Override
-	public String toString(@Nullable Event e, boolean debug) {
+	public String toString(@Nullable Event event, boolean debug) {
 		return "heal reason";
 	}
-	
+
 }

From 5c992db23e395dbaec207766c116e5f46b756f3a Mon Sep 17 00:00:00 2001
From: LimeGlass <16087552+TheLimeGlass@users.noreply.github.com>
Date: Fri, 29 Mar 2024 17:50:57 -0600
Subject: [PATCH 2/7] Update
 src/main/java/ch/njol/skript/expressions/ExprHealAmount.java

Co-authored-by: Ayham Al Ali <20037329+AyhamAl-Ali@users.noreply.github.com>
---
 src/main/java/ch/njol/skript/expressions/ExprHealAmount.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/ch/njol/skript/expressions/ExprHealAmount.java b/src/main/java/ch/njol/skript/expressions/ExprHealAmount.java
index 9c66ed878fc..bc3fa71c5b0 100644
--- a/src/main/java/ch/njol/skript/expressions/ExprHealAmount.java
+++ b/src/main/java/ch/njol/skript/expressions/ExprHealAmount.java
@@ -39,7 +39,7 @@
 import ch.njol.util.coll.CollectionUtils;
 
 @Name("Heal Amount")
-@Description("The amount of health healed in a <a href='./events.html#heal'>heal event</a>.")
+@Description("The amount of health healed in a <a href='/events.html#heal'>heal event</a>.")
 @Examples({
 	"on player healing:",
 		"\tincrease the heal amount by 2",

From 91c4fbf8b0a30768eae345ece7cf3933f5c12e81 Mon Sep 17 00:00:00 2001
From: LimeGlass <16087552+TheLimeGlass@users.noreply.github.com>
Date: Fri, 29 Mar 2024 17:51:17 -0600
Subject: [PATCH 3/7] Update
 src/main/java/ch/njol/skript/events/EvtHealing.java

Co-authored-by: Ayham Al Ali <20037329+AyhamAl-Ali@users.noreply.github.com>
---
 src/main/java/ch/njol/skript/events/EvtHealing.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/main/java/ch/njol/skript/events/EvtHealing.java b/src/main/java/ch/njol/skript/events/EvtHealing.java
index dfb2232710d..c0fa7f34d79 100644
--- a/src/main/java/ch/njol/skript/events/EvtHealing.java
+++ b/src/main/java/ch/njol/skript/events/EvtHealing.java
@@ -36,8 +36,8 @@ public class EvtHealing extends SkriptEvent {
 		Skript.registerEvent("Heal", EvtHealing.class, EntityRegainHealthEvent.class, "heal[ing] [of %-entitydatas%] [(from|due to|by) %-healreasons%]", "%entitydatas% heal[ing] [(from|due to|by) %-healreasons%]")
 				.description("Called when an entity is healed, e.g. by eating (players), being fed (pets), or by the effect of a potion of healing (overworld mobs) or harm (nether mobs).")
 				.examples("on heal:", "on player healing from a regeneration potion:",
-						"on healing of a zombie, cow or a wither:" +
-								"\theal reason is healing potion" +
+						"on healing of a zombie, cow or a wither:",
+								"\theal reason is healing potion",
 								"\tcancel event"
 				)
 				.since("1.0, INSERT VERSION (by entity)");

From a6c66c42c980ae333485c7fbbef6bd1b13fe6be5 Mon Sep 17 00:00:00 2001
From: TheLimeGlass <seantgrover@gmail.com>
Date: Fri, 10 May 2024 13:46:49 -0600
Subject: [PATCH 4/7] Apply changes

---
 skript-aliases                                |  2 +-
 .../skript/classes/data/BukkitClasses.java    | 11 ++--
 .../classes/data/BukkitEventValues.java       | 11 ++++
 .../ch/njol/skript/events/EvtHealing.java     | 16 ++++--
 .../skript/expressions/ExprHealReason.java    | 50 +++----------------
 5 files changed, 36 insertions(+), 54 deletions(-)

diff --git a/skript-aliases b/skript-aliases
index 703f47aa957..490bbeadf6e 160000
--- a/skript-aliases
+++ b/skript-aliases
@@ -1 +1 @@
-Subproject commit 703f47aa957346dcce8642a14a168e05e5f69f40
+Subproject commit 490bbeadf6e44e26dd436acfd191dae5b740ebe6
diff --git a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java
index 1f65e0a7aaf..86022bf25bc 100644
--- a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java
+++ b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java
@@ -1438,12 +1438,13 @@ public String toVariableNameString(FireworkEffect effect) {
 					.since("2.4")
 					.requiredPlugins("Minecraft 1.14 or newer"));
 		}
+
 		Classes.registerClass(new EnumClassInfo<>(RegainReason.class, "healreason", "heal reasons")
-			.user("(regen|heal) (reason|cause)")
-			.name("Heal Reason")
-			.description("The heal reason in a heal event.")
-			.examples("")
-			.since("2.5"));
+				.user("(regen|heal) (reason|cause)")
+				.name("Heal Reason")
+				.description("The health regain reason in a <a href='events.html#heal'>heal</a> event.")
+				.since("2.5"));
+
 		if (Skript.classExists("org.bukkit.entity.Cat$Type")) {
 			Classes.registerClass(new EnumClassInfo<>(Cat.Type.class, "cattype", "cat types")
 					.user("cat ?(type|race)s?")
diff --git a/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java b/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java
index 1998e124aa4..4f20b3a42c5 100644
--- a/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java
+++ b/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java
@@ -96,6 +96,8 @@
 import org.bukkit.event.entity.EntityDeathEvent;
 import org.bukkit.event.entity.EntityEvent;
 import org.bukkit.event.entity.EntityPickupItemEvent;
+import org.bukkit.event.entity.EntityRegainHealthEvent;
+import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason;
 import org.bukkit.event.entity.EntityResurrectEvent;
 import org.bukkit.event.entity.EntityTameEvent;
 import org.bukkit.event.entity.EntityTransformEvent;
@@ -1797,6 +1799,15 @@ public TransformReason get(EntityTransformEvent event) {
 				return event.getTransformReason();
 			}
 		}, EventValues.TIME_NOW);
+
+		// EntityRegainHealthEvent
+		EventValues.registerEventValue(EntityRegainHealthEvent.class, RegainReason.class, new Getter<RegainReason, EntityRegainHealthEvent>() {
+			@Override
+			@Nullable
+			public RegainReason get(EntityRegainHealthEvent event) {
+				return event.getRegainReason();
+			}
+		}, EventValues.TIME_NOW);
 	}
 
 }
diff --git a/src/main/java/ch/njol/skript/events/EvtHealing.java b/src/main/java/ch/njol/skript/events/EvtHealing.java
index c0fa7f34d79..6966f89baea 100644
--- a/src/main/java/ch/njol/skript/events/EvtHealing.java
+++ b/src/main/java/ch/njol/skript/events/EvtHealing.java
@@ -35,7 +35,9 @@ public class EvtHealing extends SkriptEvent {
 	static {
 		Skript.registerEvent("Heal", EvtHealing.class, EntityRegainHealthEvent.class, "heal[ing] [of %-entitydatas%] [(from|due to|by) %-healreasons%]", "%entitydatas% heal[ing] [(from|due to|by) %-healreasons%]")
 				.description("Called when an entity is healed, e.g. by eating (players), being fed (pets), or by the effect of a potion of healing (overworld mobs) or harm (nether mobs).")
-				.examples("on heal:", "on player healing from a regeneration potion:",
+				.examples(
+						"on heal:",
+						"on player healing from a regeneration potion:",
 						"on healing of a zombie, cow or a wither:",
 								"\theal reason is healing potion",
 								"\tcancel event"
@@ -65,9 +67,11 @@ public boolean check(Event event) {
 		if (entityDatas != null) {
 			Entity compare = healthEvent.getEntity();
 			boolean result = false;
-			for (EntityData<?> entityData : entityDatas.getArray()) {
-				if (entityData.isInstance(compare))
+			for (EntityData<?> entityData : entityDatas.getAll()) {
+				if (entityData.isInstance(compare)) {
 					result = true;
+					break;
+				}
 			}
 			if (!result)
 				return false;
@@ -75,9 +79,11 @@ public boolean check(Event event) {
 		if (healReasons != null) {
 			RegainReason compare = healthEvent.getRegainReason();
 			boolean result = false;
-			for (RegainReason healReason : healReasons.getArray()) {
-				if (healReason == compare)
+			for (RegainReason healReason : healReasons.getAll()) {
+				if (healReason == compare) {
 					result = true;
+					break;
+				}
 			}
 			if (!result)
 				return false;
diff --git a/src/main/java/ch/njol/skript/expressions/ExprHealReason.java b/src/main/java/ch/njol/skript/expressions/ExprHealReason.java
index ea47c022894..330ec4ed4d7 100644
--- a/src/main/java/ch/njol/skript/expressions/ExprHealReason.java
+++ b/src/main/java/ch/njol/skript/expressions/ExprHealReason.java
@@ -18,23 +18,15 @@
  */
 package ch.njol.skript.expressions;
 
-import org.bukkit.event.Event;
-import org.bukkit.event.entity.EntityRegainHealthEvent;
-import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason;
-import org.eclipse.jdt.annotation.Nullable;
-
-import ch.njol.skript.Skript;
 import ch.njol.skript.doc.Description;
 import ch.njol.skript.doc.Events;
 import ch.njol.skript.doc.Examples;
 import ch.njol.skript.doc.Name;
 import ch.njol.skript.doc.Since;
-import ch.njol.skript.lang.Expression;
-import ch.njol.skript.lang.ExpressionType;
-import ch.njol.skript.lang.SkriptParser.ParseResult;
-import ch.njol.skript.lang.util.SimpleExpression;
+import ch.njol.skript.expressions.base.EventValueExpression;
 import ch.njol.skript.registrations.EventValues;
-import ch.njol.util.Kleenean;
+
+import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason;
 
 @Name("Heal Reason")
 @Description("The <a href='./classes.html#healreason'>heal reason</a> of a <a href='./events.html#heal'>heal event</a>.")
@@ -45,27 +37,14 @@
 })
 @Events("heal")
 @Since("2.5")
-public class ExprHealReason extends SimpleExpression<RegainReason> {
+public class ExprHealReason extends EventValueExpression<RegainReason> {
 
 	static {
-		Skript.registerExpression(ExprHealReason.class, RegainReason.class, ExpressionType.SIMPLE, "(regen|health regain|heal[ing]) (reason|cause)");
+		register(ExprHealReason.class, RegainReason.class, "(regen|health regain|heal[ing]) (reason|cause)");
 	}
 
-	@Override
-	public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
-		if (!getParser().isCurrentEvent(EntityRegainHealthEvent.class)) {
-			Skript.error("The expression 'heal reason' may only be used in a healing event");
-			return false;
-		}
-		return true;
-	}
-
-	@Nullable
-	@Override
-	protected RegainReason[] get(Event event) {
-		if (!(event instanceof EntityRegainHealthEvent))
-			return null;
-		return new RegainReason[]{((EntityRegainHealthEvent) event).getRegainReason()};
+	public ExprHealReason() {
+		super(RegainReason.class);
 	}
 
 	@Override
@@ -75,19 +54,4 @@ public boolean setTime(int time) {
 		return super.setTime(time);
 	}
 
-	@Override
-	public boolean isSingle() {
-		return true;
-	}
-
-	@Override
-	public Class<? extends RegainReason> getReturnType() {
-		return RegainReason.class;
-	}
-
-	@Override
-	public String toString(@Nullable Event event, boolean debug) {
-		return "heal reason";
-	}
-
 }

From c49b97629e971dce0c5d257db0efefee5f413eba Mon Sep 17 00:00:00 2001
From: TheLimeGlass <seantgrover@gmail.com>
Date: Fri, 10 May 2024 13:50:39 -0600
Subject: [PATCH 5/7] Sync aliases with master

---
 skript-aliases | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/skript-aliases b/skript-aliases
index 490bbeadf6e..9ea857f6b7d 160000
--- a/skript-aliases
+++ b/skript-aliases
@@ -1 +1 @@
-Subproject commit 490bbeadf6e44e26dd436acfd191dae5b740ebe6
+Subproject commit 9ea857f6b7dd1e4fc4a35a88149b9e463b537b06

From c200b84596ef5374970a4ae7cca8b89839159c7f Mon Sep 17 00:00:00 2001
From: LimeGlass <16087552+TheLimeGlass@users.noreply.github.com>
Date: Fri, 28 Jun 2024 10:21:53 -0600
Subject: [PATCH 6/7] Add event to setTime

---
 src/main/java/ch/njol/skript/expressions/ExprHealAmount.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/ch/njol/skript/expressions/ExprHealAmount.java b/src/main/java/ch/njol/skript/expressions/ExprHealAmount.java
index bc3fa71c5b0..ae905e96fd7 100644
--- a/src/main/java/ch/njol/skript/expressions/ExprHealAmount.java
+++ b/src/main/java/ch/njol/skript/expressions/ExprHealAmount.java
@@ -110,7 +110,7 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) {
 
 	@Override
 	public boolean setTime(int time) {
-		return super.setTime(time);
+		return super.setTime(time, EntityRegainHealthEvent.class);
 	}
 
 	@Override

From 4a85f39b660af4c38c9714eefb0ec3a7d89fbd63 Mon Sep 17 00:00:00 2001
From: sovdee <10354869+sovdeeth@users.noreply.github.com>
Date: Sun, 30 Jun 2024 15:18:18 +0200
Subject: [PATCH 7/7] Update
 src/main/java/ch/njol/skript/events/EvtHealing.java

---
 src/main/java/ch/njol/skript/events/EvtHealing.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/ch/njol/skript/events/EvtHealing.java b/src/main/java/ch/njol/skript/events/EvtHealing.java
index 6966f89baea..21dd2c2e642 100644
--- a/src/main/java/ch/njol/skript/events/EvtHealing.java
+++ b/src/main/java/ch/njol/skript/events/EvtHealing.java
@@ -42,7 +42,7 @@ public class EvtHealing extends SkriptEvent {
 								"\theal reason is healing potion",
 								"\tcancel event"
 				)
-				.since("1.0, INSERT VERSION (by entity)");
+				.since("1.0, INSERT VERSION (by reason)");
 	}
 
 	@Nullable