From b75fde9c9545286d053c4af35d3742f2bdd9b815 Mon Sep 17 00:00:00 2001 From: CJH3139 Date: Thu, 9 Oct 2025 00:24:24 -0700 Subject: [PATCH 1/3] Add paper's EntityFertilizeEgg event Also change for: - block fertilize event bone[ ]meal alias - ExprBreedingFamily tweaks so that it also accepts the FertilizeEgg event --- .../njol/skript/events/EvtFertilizeEgg.java | 74 +++++++++++++++++++ .../ch/njol/skript/events/SimpleEvents.java | 9 +-- .../breeding/elements/ExprBreedingFamily.java | 35 +++++---- 3 files changed, 100 insertions(+), 18 deletions(-) create mode 100644 src/main/java/ch/njol/skript/events/EvtFertilizeEgg.java diff --git a/src/main/java/ch/njol/skript/events/EvtFertilizeEgg.java b/src/main/java/ch/njol/skript/events/EvtFertilizeEgg.java new file mode 100644 index 00000000000..78e92e1e599 --- /dev/null +++ b/src/main/java/ch/njol/skript/events/EvtFertilizeEgg.java @@ -0,0 +1,74 @@ +package ch.njol.skript.events; + +import ch.njol.skript.Skript; +import ch.njol.skript.entity.EntityType; +import ch.njol.skript.lang.Literal; +import ch.njol.skript.lang.SkriptEvent; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.skript.registrations.EventValues; +import io.papermc.paper.event.entity.EntityFertilizeEggEvent; +import org.bukkit.entity.Entity; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + +public class EvtFertilizeEgg extends SkriptEvent { + + static { + Skript.registerEvent("Entity Fertilize", EvtFertilizeEgg.class, EntityFertilizeEggEvent.class, + "[entity] fertiliz(e|ing) [an] egg [of %-entitytypes%]") + .description( + "Called whenever an entity fertilizes an egg (e.g. a turtle has an egg, a frog becomes pregnant, or a " + + "sniffer finds a sniffer egg).") + .examples( + "on fertilizing egg of turtles:", + "\tsend \"A turtle just fertilized an egg!\"", + "on fertilizing egg:", + "\tif event-entity is a frog:", + "\t\tsend \"A frog just became pregnant!\"" + ) + .since("2.14"); + + EventValues.registerEventValue(EntityFertilizeEggEvent.class, Entity.class, event -> { + assert false; + return event.getEntity(); + }, EventValues.TIME_NOW, + "Use 'mother' and/or 'father' in fertilize egg events", + EntityFertilizeEggEvent.class + ); + } + + private @Nullable Literal entitiesLiteral; + private EntityType @Nullable [] entities; + + @Override + public boolean init(Literal[] args, int matchedPattern, ParseResult parseResult) { + if (args[0] != null) { + //noinspection unchecked + entitiesLiteral = ((Literal) args[0]); + entities = entitiesLiteral.getAll(); + } + return true; + } + + @Override + public boolean check(Event event) { + return event instanceof EntityFertilizeEggEvent fertilizeEvent && checkEntity(fertilizeEvent.getEntity()); + } + + private boolean checkEntity(Entity entity) { + if (entities != null) { + for (EntityType entityType : entities) { + if (entityType.isInstance(entity)) + return true; + } + return false; + } + return true; + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + return "on fertilizing egg" + (entitiesLiteral == null ? "" : " of " + entitiesLiteral); + } + +} diff --git a/src/main/java/ch/njol/skript/events/SimpleEvents.java b/src/main/java/ch/njol/skript/events/SimpleEvents.java index 3dc2317ecff..3624320daae 100644 --- a/src/main/java/ch/njol/skript/events/SimpleEvents.java +++ b/src/main/java/ch/njol/skript/events/SimpleEvents.java @@ -449,11 +449,10 @@ public class SimpleEvents { .description("Called when a horse jumps.") .examples("on horse jump:", "\tpush event-entity upwards at speed 2") .since("2.5.1"); - Skript.registerEvent("Block Fertilize", SimpleEvent.class, BlockFertilizeEvent.class, "[block] fertilize") - .description("Called when a player fertilizes blocks.") - .requiredPlugins("Minecraft 1.13 or newer") - .examples("on block fertilize:", - "\tsend \"Fertilized %size of fertilized blocks% blocks got fertilized.\"") + Skript.registerEvent("Block Fertilize", SimpleEvent.class, BlockFertilizeEvent.class, "[block] (fertilize|bone[ ]meal)") + .description("Called when a player uses bonemeals on blocks.") + .examples("on block bonemeal:", + "\tsend \"%size of fertilized blocks% blocks got bonemealed.\"") .since("2.5"); Skript.registerEvent("Arm Swing", SimpleEvent.class, PlayerAnimationEvent.class, "[player] arm swing") .description("Called when a player swings their arm.") diff --git a/src/main/java/org/skriptlang/skript/bukkit/breeding/elements/ExprBreedingFamily.java b/src/main/java/org/skriptlang/skript/bukkit/breeding/elements/ExprBreedingFamily.java index 6f2331ac9d4..d0022393759 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/breeding/elements/ExprBreedingFamily.java +++ b/src/main/java/org/skriptlang/skript/bukkit/breeding/elements/ExprBreedingFamily.java @@ -10,6 +10,7 @@ import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; +import io.papermc.paper.event.entity.EntityFertilizeEggEvent; import org.bukkit.entity.LivingEntity; import org.bukkit.event.Event; import org.bukkit.event.entity.EntityBreedEvent; @@ -38,27 +39,35 @@ public class ExprBreedingFamily extends SimpleExpression { @Override public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - if (!getParser().isCurrentEvent(EntityBreedEvent.class)) { - Skript.error("The 'breeding family' expression can only be used in an breed event."); + if (!getParser().isCurrentEvent(EntityBreedEvent.class) && !getParser().isCurrentEvent(EntityFertilizeEggEvent.class)) { + Skript.error("The 'breeding family' expression can only be used in an breed or fertilize egg event."); + return false; + } + if (getParser().isCurrentEvent(EntityFertilizeEggEvent.class) && matchedPattern >= 2){ + Skript.error("The 'bred child' expression cannot be used in a 'fertilize egg' event."); return false; } - pattern = matchedPattern; return true; } @Override protected @Nullable LivingEntity [] get(Event event) { - if (!(event instanceof EntityBreedEvent breedEvent)) - return new LivingEntity[0]; - - return switch (pattern) { - case 0 -> new LivingEntity[]{breedEvent.getMother()}; - case 1 -> new LivingEntity[]{breedEvent.getFather()}; - case 2 -> new LivingEntity[]{breedEvent.getEntity()}; - case 3 -> new LivingEntity[]{breedEvent.getBreeder()}; - default -> new LivingEntity[0]; - }; + if (event instanceof EntityBreedEvent breedEvent) + return switch (pattern) { + case 0 -> new LivingEntity[]{breedEvent.getMother()}; + case 1 -> new LivingEntity[]{breedEvent.getFather()}; + case 2 -> new LivingEntity[]{breedEvent.getEntity()}; + case 3 -> new LivingEntity[]{breedEvent.getBreeder()}; + default -> new LivingEntity[0]; + }; + else if (event instanceof EntityFertilizeEggEvent fertilizeEggEvent) + return switch (pattern) { + case 0 -> new LivingEntity[]{fertilizeEggEvent.getMother()}; + case 1 -> new LivingEntity[]{fertilizeEggEvent.getFather()}; + default -> new LivingEntity[0]; + }; + return new LivingEntity[0]; } @Override From 642c9f40754f26f6e67928c95dc050f289ca44b1 Mon Sep 17 00:00:00 2001 From: CJH3139 Date: Thu, 9 Oct 2025 01:09:06 -0700 Subject: [PATCH 2/3] Add test skript --- .../njol/skript/events/EvtFertilizeEgg.java | 1 - src/test/skript/junit/EvtFertilizeEgg.sk | 21 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 src/test/skript/junit/EvtFertilizeEgg.sk diff --git a/src/main/java/ch/njol/skript/events/EvtFertilizeEgg.java b/src/main/java/ch/njol/skript/events/EvtFertilizeEgg.java index 78e92e1e599..c4a15b4a26d 100644 --- a/src/main/java/ch/njol/skript/events/EvtFertilizeEgg.java +++ b/src/main/java/ch/njol/skript/events/EvtFertilizeEgg.java @@ -12,7 +12,6 @@ import org.jetbrains.annotations.Nullable; public class EvtFertilizeEgg extends SkriptEvent { - static { Skript.registerEvent("Entity Fertilize", EvtFertilizeEgg.class, EntityFertilizeEggEvent.class, "[entity] fertiliz(e|ing) [an] egg [of %-entitytypes%]") diff --git a/src/test/skript/junit/EvtFertilizeEgg.sk b/src/test/skript/junit/EvtFertilizeEgg.sk new file mode 100644 index 00000000000..418300711f6 --- /dev/null +++ b/src/test/skript/junit/EvtFertilizeEgg.sk @@ -0,0 +1,21 @@ +options: + test: "org.skriptlang.skript.test.tests.syntaxes.events.EvtFertilizeEggTest" + +test "EvtFertilizeEggTest" when running Junit: + add "fertilize egg event - general" to {_evt::*} + add "fertilize egg event - specified entity" to {_evt::*} + add "fertilize egg event - mother" to {_evt::*} + add "fertilize egg event - father" to {_evt::*} + ensure junit test {@test} completes {_evt::*} + +on fertilize: + junit test is {@test} + complete objective "fertilize egg event - general" for {@test} + +on fertilize of frog: + junit test is {@test} + complete objective "fertilize egg event - specified entity" for {@test} + breeding mother is frog + complete objective "fertilize egg event - mother" for {@test} + breeding father is frog + complete objective "fertilize egg event - father" for {@test} From 57b2a517c40394e18c945bfedf175e4d355426e0 Mon Sep 17 00:00:00 2001 From: CJH3139 Date: Fri, 10 Oct 2025 15:28:22 -0700 Subject: [PATCH 3/3] Update EvtFertilizeEgg.java --- .../njol/skript/events/EvtFertilizeEgg.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/ch/njol/skript/events/EvtFertilizeEgg.java b/src/main/java/ch/njol/skript/events/EvtFertilizeEgg.java index c4a15b4a26d..2fd5fc96744 100644 --- a/src/main/java/ch/njol/skript/events/EvtFertilizeEgg.java +++ b/src/main/java/ch/njol/skript/events/EvtFertilizeEgg.java @@ -12,23 +12,23 @@ import org.jetbrains.annotations.Nullable; public class EvtFertilizeEgg extends SkriptEvent { + static { Skript.registerEvent("Entity Fertilize", EvtFertilizeEgg.class, EntityFertilizeEggEvent.class, "[entity] fertiliz(e|ing) [an] egg [of %-entitytypes%]") .description( "Called whenever an entity fertilizes an egg (e.g. a turtle has an egg, a frog becomes pregnant, or a " + "sniffer finds a sniffer egg).") - .examples( - "on fertilizing egg of turtles:", - "\tsend \"A turtle just fertilized an egg!\"", - "on fertilizing egg:", - "\tif event-entity is a frog:", - "\t\tsend \"A frog just became pregnant!\"" - ) - .since("2.14"); + .examples(""" + on fertilizing egg of turtles: + broadcast "A turtle just fertilized an egg!" + on fertilizing egg: + if event-entity is a frog: + broadcast "A frog just became pregnant!" + """) + .since("INSERT VERSION"); EventValues.registerEventValue(EntityFertilizeEggEvent.class, Entity.class, event -> { - assert false; return event.getEntity(); }, EventValues.TIME_NOW, "Use 'mother' and/or 'father' in fertilize egg events", @@ -67,7 +67,7 @@ private boolean checkEntity(Entity entity) { @Override public String toString(@Nullable Event event, boolean debug) { - return "on fertilizing egg" + (entitiesLiteral == null ? "" : " of " + entitiesLiteral); + return "on fertilizing egg" + (entitiesLiteral == null ? "" : " of " + entitiesLiteral.toString(event, debug)); } }