diff --git a/build.gradle b/build.gradle index 7dcc91a7533..cb6f8c29a1a 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ dependencies { shadow group: 'io.papermc', name: 'paperlib', version: '1.0.8' shadow group: 'org.bstats', name: 'bstats-bukkit', version: '3.1.0' - implementation group: 'io.papermc.paper', name: 'paper-api', version: '26.1.1.build.+' + implementation group: 'io.papermc.paper', name: 'paper-api', version: '26.1.2.build.+' implementation group: 'com.google.code.findbugs', name: 'findbugs', version: '3.0.1' // bundled with Minecraft 1.19.4+ for display entity transforms diff --git a/gradle.properties b/gradle.properties index e37d84156ba..450609ece68 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,5 +7,5 @@ groupid=ch.njol name=skript version=2.15.2 jarName=Skript.jar -testEnv=java25/paper-26.1.1 +testEnv=java25/paper-26.1.2 testEnvJavaVersion=25 diff --git a/src/main/java/ch/njol/skript/events/EvtEntityLunge.java b/src/main/java/ch/njol/skript/events/EvtEntityLunge.java new file mode 100644 index 00000000000..06447b1e8e1 --- /dev/null +++ b/src/main/java/ch/njol/skript/events/EvtEntityLunge.java @@ -0,0 +1,84 @@ +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.lang.SyntaxStringBuilder; +import ch.njol.skript.registrations.EventConverter; +import ch.njol.skript.registrations.EventValues; +import io.papermc.paper.event.entity.EntityLungeEvent; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + +@SuppressWarnings("unchecked") +public class EvtEntityLunge extends SkriptEvent { + + @Nullable + private Literal entityTypes; + + static { + // Since paper 26.1.2 + if (Skript.classExists("io.papermc.paper.event.entity.EntityLungeEvent")) { + Skript.registerEvent("Entity Lunge", EvtEntityLunge.class, EntityLungeEvent.class, "[%-entitytypes%] lunge") + .description("Called when an entity lunges.", + "Either by using a spear enchanted with the lunge enchantment (e.g. players, skeletons)", + "or because of a mob's natural lunge attack (e.g. ravagers).", + "Lunge attack propels entity forward horizontally.") + .examples("on lunge:", + "\tset lunge power to 4", + "on ravager lunge:", + "\tcancel event" + ) + .since("INSERT VERSION"); + + EventValues.registerEventValue(EntityLungeEvent.class, Integer.class, new EventConverter<>() { + @Override + public void set(EntityLungeEvent event, Integer value) { + event.setLungePower(value); + } + + @Override + public Integer convert(EntityLungeEvent event) { + return event.getLungePower(); + } + }); + } + } + + @Override + public boolean init(Literal[] args, int matchedPattern, ParseResult parseResult) { + entityTypes = (Literal) args[0]; + return true; + } + + @Override + public boolean check(Event event) { + if (!(event instanceof EntityLungeEvent lungeEvent)) { + return false; + } + + if (entityTypes == null) { + return true; + } + + for (EntityType entityType : entityTypes.getAll()) { + if (entityType.isInstance(lungeEvent.getEntity())) { + return true; + } + } + return false; + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + SyntaxStringBuilder builder = new SyntaxStringBuilder(event, debug); + if (entityTypes != null) { + builder.append(entityTypes).append(" "); + } + builder.append("lunge"); + return builder.toString(); + } + +} diff --git a/src/main/java/ch/njol/skript/expressions/ExprLungePower.java b/src/main/java/ch/njol/skript/expressions/ExprLungePower.java new file mode 100644 index 00000000000..6e033b1c36e --- /dev/null +++ b/src/main/java/ch/njol/skript/expressions/ExprLungePower.java @@ -0,0 +1,104 @@ +package ch.njol.skript.expressions; + +import ch.njol.skript.Skript; +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.*; +import ch.njol.skript.expressions.base.EventValueExpression; +import ch.njol.skript.expressions.base.WrapperExpression; +import ch.njol.skript.lang.*; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.util.Kleenean; +import ch.njol.util.coll.CollectionUtils; +import io.papermc.paper.event.entity.EntityLungeEvent; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + +@Name("Lunge Power") +@Description({"The power of lunge attack.", + "Can be set to modify the distance of the lunge attack.", + "Initially, the lunge power is determined by the enchantment level of the lunge enchantment" + + "of the weapon used to perform the lunge attack (e.g. a spear)."}) +@Example(""" +on skeleton lunge: + if the lunge power is 1, 2 or 3: + broadcast "Normal lunge power" + else if the lunge power is greater than 3: + broadcast "Overpowered lunge power" +""") +@Example(""" +on lunge: + set event-lunge power to 5 +""") +@Example(""" +on player lunge: + if event-entity has slowness: + remove 1 from lunge power + send "Slowed you down a bit" +""") +@Since("INSERT VERSION") +public class ExprLungePower extends WrapperExpression implements EventRestrictedSyntax { + + static { + // Since paper 26.1.2 + if (Skript.classExists("io.papermc.paper.event.entity.EntityLungeEvent")) { + Skript.registerExpression(ExprLungePower.class, Integer.class, ExpressionType.SIMPLE, "[the] [event-]lunge power"); + } + } + + @SuppressWarnings("unchecked") + @Override + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + if (exprs.length != 0) { + return false; + } + + setExpr(new EventValueExpression<>(Integer.class)); + return ((EventValueExpression) getExpr()).init(); + } + + @Override + public @Nullable Class[] acceptChange(ChangeMode mode) { + return switch (mode) { + case SET, ADD, REMOVE -> CollectionUtils.array(Integer.class); + default -> null; + }; + } + + @Override + public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + int deltaValue = delta != null ? (Integer) delta[0] : 0; + int currentValue = (Integer) getExpr().getSingle(event); + Integer newValue = switch (mode) { + case SET -> deltaValue; + case ADD -> currentValue + deltaValue; + case REMOVE -> currentValue - deltaValue; + default -> null; + }; + + // It isn't null because the change mode is guaranteed to be either SET, ADD or REMOVE + assert newValue != null; + + super.getExpr().change(event, CollectionUtils.array(newValue), ChangeMode.SET); + } + + @Override + public Class[] supportedEvents() { + return CollectionUtils.array(EntityLungeEvent.class); + } + + @Override + public boolean isSingle() { + return true; + } + + @Override + public Class getReturnType() { + return Integer.class; + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + return "lunge power"; + } + +} diff --git a/src/test/skript/environments/java25/paper-26.1.2.json b/src/test/skript/environments/java25/paper-26.1.2.json new file mode 100644 index 00000000000..45f921d8516 --- /dev/null +++ b/src/test/skript/environments/java25/paper-26.1.2.json @@ -0,0 +1,17 @@ +{ + "name": "paper-26.1.2", + "resources": [ + {"source": "server.properties.generic", "target": "server.properties"} + ], + "paperDownloads": [ + { + "version": "26.1.2", + "target": "paperclip.jar" + } + ], + "skriptTarget": "plugins/Skript.jar", + "commandLine": [ + "-Dcom.mojang.eula.agree=true", + "-jar", "paperclip.jar", "--nogui" + ] +}