Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
84 changes: 84 additions & 0 deletions src/main/java/ch/njol/skript/events/EvtEntityLunge.java
Original file line number Diff line number Diff line change
@@ -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<EntityType> 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<>() {
Comment thread
vuxeim marked this conversation as resolved.
@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<EntityType>) 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();
}

}
104 changes: 104 additions & 0 deletions src/main/java/ch/njol/skript/expressions/ExprLungePower.java
Original file line number Diff line number Diff line change
@@ -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<Integer> 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<Integer>) 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<? extends Event>[] supportedEvents() {
return CollectionUtils.array(EntityLungeEvent.class);
}

@Override
public boolean isSingle() {
return true;
}

@Override
public Class<Integer> getReturnType() {
return Integer.class;
}

@Override
public String toString(@Nullable Event event, boolean debug) {
return "lunge power";
}

}
17 changes: 17 additions & 0 deletions src/test/skript/environments/java25/paper-26.1.2.json
Original file line number Diff line number Diff line change
@@ -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"
]
}