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..2fd5fc96744 --- /dev/null +++ b/src/main/java/ch/njol/skript/events/EvtFertilizeEgg.java @@ -0,0 +1,73 @@ +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: + 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 -> { + 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.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 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 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}