Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
4e1eaa6
Bump dev/feature to MC 1.21.4+ (#8582)
Absolutionism May 5, 2026
5a829dc
Add blocks aliases to the block change effect (#8579)
TheLimeGlass May 5, 2026
1b0196b
Add loadDelayableLinkedCode to SectionUtils (#8557)
ahmadmsaleem May 5, 2026
c2f0567
Merge branch 'dev/patch' into dev/feature
APickledWalrus May 7, 2026
4071e30
TreeType Makeover (#8640)
ShaneBeee May 20, 2026
06ba65f
Change ExprUUID pattern from 'UUID' to 'uuid[s]' (#8620)
TheLimeGlass May 20, 2026
8507ae1
Merge branch 'dev/patch' into dev/feature
APickledWalrus May 27, 2026
666723f
Merge branch 'dev/patch' into dev/feature
APickledWalrus Jun 2, 2026
9fa1dbd
Multiple Random Elements (#8688)
UnderscoreTud Jun 5, 2026
0d1b9e7
Add ExprPlayerListOrder (#8600)
AnOwlBe Jun 11, 2026
2c30aee
Add potion support to more entities (#8630)
APickledWalrus Jun 12, 2026
dc9223b
Add a text replace expression (#8587)
novystar Jun 12, 2026
2af4157
Merge branch 'dev/patch' into dev/feature
APickledWalrus Jun 17, 2026
2d177bb
Merge branch 'dev/patch' into dev/feature
APickledWalrus Jun 22, 2026
b6db366
Force gradlew.bat to CRLF
APickledWalrus Jun 23, 2026
f30fb34
Merge branch 'dev/patch' into dev/feature
APickledWalrus Jun 23, 2026
e03a1f7
Support for getting location of an offline player (#8708)
AnOwlBe Jun 26, 2026
804c71a
Add simple SyntaxInfo builder methods (#8709)
APickledWalrus Jun 26, 2026
b0fca92
Implement entity function (#8540)
Shroobz Jun 26, 2026
7655d15
Allow wait/halt to be used as a section (#8547)
ahmadmsaleem Jun 26, 2026
e75afd1
Add callback support to EnumClassInfo and RegistryClassInfo (#8677)
APickledWalrus Jun 26, 2026
9a34a62
Proper toString for Simple Events (#8729)
AnOwlBe Jun 28, 2026
d920676
Teleportation Cleanup (#8728)
APickledWalrus Jun 28, 2026
50fa1af
Fix simple SyntaxInfo return types (#8730)
APickledWalrus Jun 30, 2026
0b27096
Add expression for Skull Texture (#8500)
AnOwlBe Jun 30, 2026
e900340
Fix gradlew.bat line endings again
APickledWalrus Jun 30, 2026
12a1fad
Entity Pathfind Event & Pathfinding Target Expression (#8501)
AnOwlBe Jun 30, 2026
cafeb78
Modernize enchantments (#8668)
bluelhf Jun 30, 2026
a63c808
Merge branch 'dev/patch' into dev/feature
APickledWalrus Jul 1, 2026
c65ede0
Game Mode Updates (#8714)
AnOwlBe Jul 1, 2026
1548032
Add component resolution syntax (#8698)
APickledWalrus Jul 1, 2026
7fb23c4
Deprecates using [player], [sender], [message] or [msg] in ExprChatFo…
AnOwlBe Jul 1, 2026
d7f5dac
Boss Bars (#8673)
AnOwlBe Jul 1, 2026
71a2039
JSONGenerator: Fix Expression return type determination
APickledWalrus Jul 1, 2026
4991f3d
Fix BossBar Viewers Handling
APickledWalrus Jul 1, 2026
a9cad4a
World Border Updates (#8659)
AnOwlBe Jul 1, 2026
df7c044
Update Leash Syntax To Entity (#8413)
tibisabau Jul 1, 2026
1ec6afe
Merge branch 'dev/patch' into dev/feature
APickledWalrus Jul 1, 2026
88ffe0d
Prepare For Release (2.16.0-pre1)
APickledWalrus Jul 1, 2026
ba8c002
Fix ExprNamed ArrayStoreException (#8763)
erenkarakal Jul 13, 2026
aff1645
Fix Timespan TemporalAmount Implementation (#8724)
erenkarakal Jul 13, 2026
ec0993c
Fix ExprBookPages changer (#8753)
APickledWalrus Jul 14, 2026
b7d86a8
Fix StructAliases ClassCastException & AliasesParser OOME (#8762)
erenkarakal Jul 14, 2026
0e3f9ad
Support For Paper 26.2 (#8738)
APickledWalrus Jul 14, 2026
356be4d
Merge branch 'dev/patch' into dev/feature
APickledWalrus Jul 14, 2026
a109310
Boss Bar Fixes (#8768)
AnOwlBe Jul 15, 2026
8265733
Prepare For Release (2.16.0)
APickledWalrus Jul 15, 2026
c464930
Merge remote-tracking branch 'origin/master' into master-up
ShaneBeee Jul 30, 2026
285e1b0
Delay - fix merge conflict
ShaneBeee Jul 30, 2026
e6640f6
EffTeleport - fix merge conflict
ShaneBeee Jul 30, 2026
ef5d1f3
workflows - fix merge conflicts
ShaneBeee Jul 30, 2026
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 .github/workflows/java-21-builds.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
if: "! contains(toJSON(github.event.commits.*.message), '[ci skip]')"
uses: ./.github/workflows/parallelize-tests.yml
with:
environments: 1.21.3,1.21.4,1.21.5,1.21.8,1.21.10,1.21.11
environments: 1.21.4,1.21.5,1.21.8,1.21.10,1.21.11
java_version: 21
parallel_jobs: 3

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/java-25-builds.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ jobs:
if: "! contains(toJSON(github.event.commits.*.message), '[ci skip]')"
uses: ./.github/workflows/parallelize-tests.yml
with:
environments: 26.1.2
environments: 26.1.2,26.2
java_version: 25
parallel_jobs: 3
parallel_jobs: 1

build:
name: ${{ matrix.display }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/junit-21-builds.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
if: "! contains(toJSON(github.event.commits.*.message), '[ci skip]')"
uses: ./.github/workflows/parallelize-tests.yml
with:
environments: 1.21.3,1.21.4,1.21.5,1.21.8,1.21.10,1.21.11
environments: 1.21.4,1.21.5,1.21.8,1.21.10,1.21.11
java_version: 21
parallel_jobs: 3

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/junit-25-builds.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ jobs:
if: "! contains(toJSON(github.event.commits.*.message), '[ci skip]')"
uses: ./.github/workflows/parallelize-tests.yml
with:
environments: 26.1.2
environments: 26.1.2,26.2
java_version: 25
parallel_jobs: 3
parallel_jobs: 1

build:
name: ${{ matrix.display }}
Expand Down
5 changes: 1 addition & 4 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,9 @@ allprojects {
}

dependencies {
shadow group: 'io.papermc', name: 'paperlib', version: '1.0.8'
shadow group: 'org.bstats', name: 'bstats-bukkit', version: '3.2.1'

implementation group: 'io.papermc.paper', name: 'paper-api', version: '26.1.2.build.+'
implementation group: 'io.papermc.paper', name: 'paper-api', version: '26.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 Expand Up @@ -107,11 +106,9 @@ tasks.withType(ShadowJar).configureEach {
project.configurations.shadow
]
dependencies {
include(dependency('io.papermc:paperlib'))
include(dependency('org.bstats:bstats-bukkit'))
include(dependency('org.bstats:bstats-base'))
}
relocate 'io.papermc.lib', 'ch.njol.skript.paperlib'
relocate 'org.bstats', 'ch.njol.skript.bstats'
manifest {
attributes(
Expand Down
4 changes: 2 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ org.gradle.parallel=true

groupid=ch.njol
name=skript
version=2.15.4
version=2.16.0
jarName=Skript.jar
testEnv=java25/paper-26.1.2
testEnv=java25/paper-26.2
testEnvJavaVersion=25

folia_build=1
12 changes: 8 additions & 4 deletions src/main/java/ch/njol/skript/aliases/AliasesParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -424,7 +424,7 @@ protected Map<String, Variation> parseKeyVariations(String name) {
List<PatternSlot> slots = new ArrayList<>();

// Compute variation slots
for (int i = 0; i < name.length();) {
for (int i = 0; i < name.length(); i += Character.charCount(name.codePointAt(i))) {
int c = name.codePointAt(i);
if (c == '{') { // Found variation name start
varStart = i;
Expand All @@ -444,16 +444,16 @@ protected Map<String, Variation> parseKeyVariations(String name) {
VariationGroup vars = provider.getVariationGroup(varName);
if (vars == null) {
Skript.error(m_unknown_variation.toString(varName));
varStart = -1;
varEnd = i + 1;
continue;
}
slots.add(new VariationSlot(vars));

// Variation name finished
varStart = -1;
varEnd = i + 1;
}

i += Character.charCount(c);
}

// Handle last non-variation slot
Expand Down Expand Up @@ -690,6 +690,10 @@ protected void loadSingleAlias(Map<String, Variation> variations, String item) {
* @return Name fixed.
*/
protected String fixName(String name) {
if (name.isEmpty()) {
return "";
}

/*
* General logic:
*
Expand Down
5 changes: 1 addition & 4 deletions src/main/java/ch/njol/skript/aliases/ItemData.java
Original file line number Diff line number Diff line change
Expand Up @@ -657,9 +657,6 @@ public ItemData aliasCopy() {
return data;
}

// Can remove after 1.21.3 is the minimum supported version
private static final boolean HAS_CUSTOM_NAME = Skript.methodExists(PotionMeta.class, "hasCustomPotionName");

private static void copyPotionInfo(PotionMeta potionMeta, ItemData data) {
PotionMeta newMeta = (PotionMeta) itemFactory.getItemMeta(data.type);
if (newMeta.equals(potionMeta))
Expand All @@ -674,7 +671,7 @@ private static void copyPotionInfo(PotionMeta potionMeta, ItemData data) {
}
if (potionMeta.hasColor())
newMeta.setColor(potionMeta.getColor());
if (HAS_CUSTOM_NAME && potionMeta.hasCustomPotionName())
if (potionMeta.hasCustomPotionName())
newMeta.setCustomPotionName(potionMeta.getCustomPotionName());
data.itemFlags = ItemFlags.CHANGED_TAGS;
data.setItemMeta(newMeta);
Expand Down
12 changes: 4 additions & 8 deletions src/main/java/ch/njol/skript/bukkitutil/HealthUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@

import ch.njol.skript.Skript;
import ch.njol.util.Math2;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

import org.bukkit.NamespacedKey;
import org.bukkit.Registry;
import org.bukkit.attribute.Attributable;
Expand All @@ -18,6 +15,9 @@
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.jetbrains.annotations.Nullable;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class HealthUtils {
private static final @Nullable Constructor<EntityDamageEvent> OLD_DAMAGE_EVENT_CONSTRUCTOR;

Expand All @@ -31,11 +31,7 @@ public class HealthUtils {

private static final Attribute MAX_HEALTH;
static {
if (Skript.isRunningMinecraft(1, 21, 3)) { // In 1.21.3, Attribute became an Interface
MAX_HEALTH = Registry.ATTRIBUTE.get(NamespacedKey.minecraft("max_health"));
} else {
MAX_HEALTH = (Attribute) Enum.valueOf((Class) Attribute.class, "GENERIC_MAX_HEALTH");
}
MAX_HEALTH = Registry.ATTRIBUTE.get(NamespacedKey.minecraft("max_health"));
}

/**
Expand Down
33 changes: 0 additions & 33 deletions src/main/java/ch/njol/skript/bukkitutil/SkriptTeleportFlag.java

This file was deleted.

47 changes: 35 additions & 12 deletions src/main/java/ch/njol/skript/classes/EnumClassInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@
import ch.njol.skript.expressions.base.EventValueExpression;
import ch.njol.skript.lang.DefaultExpression;
import ch.njol.util.coll.iterator.ArrayIterator;
import org.skriptlang.skript.lang.comparator.Comparators;
import org.skriptlang.skript.lang.comparator.Relation;

import java.util.Map;
import java.util.function.Consumer;

/**
* This class can be used for an easier writing of ClassInfos that are enums,
Expand All @@ -20,17 +21,17 @@ public class EnumClassInfo<T extends Enum<T>> extends ClassInfo<T> {
* @param languageNode The language node of the type
*/
public EnumClassInfo(Class<T> enumClass, String codeName, String languageNode) {
this(enumClass, codeName, languageNode, new EventValueExpression<>(enumClass), true);
this(enumClass, codeName, languageNode, new EventValueExpression<>(enumClass));
}

/**
* @param enumClass The class
* @param codeName The name used in patterns
* @param languageNode The language node of the type
* @param registerComparator Whether a default comparator should be registered for this enum's classinfo
* @param parseCallback A consumer to run on a successful parse.
*/
public EnumClassInfo(Class<T> enumClass, String codeName, String languageNode, boolean registerComparator) {
this(enumClass, codeName, languageNode, new EventValueExpression<>(enumClass), registerComparator);
public EnumClassInfo(Class<T> enumClass, String codeName, String languageNode, Consumer<T> parseCallback) {
this(enumClass, codeName, languageNode, new EventValueExpression<>(enumClass), parseCallback);
}

/**
Expand All @@ -40,27 +41,49 @@ public EnumClassInfo(Class<T> enumClass, String codeName, String languageNode, b
* @param defaultExpression The default expression of the type
*/
public EnumClassInfo(Class<T> enumClass, String codeName, String languageNode, DefaultExpression<T> defaultExpression) {
this(enumClass, codeName, languageNode, defaultExpression, true);
this(enumClass, codeName, languageNode, defaultExpression, ignored -> {});
}

/**
* @param enumClass The class
* @param codeName The name used in patterns
* @param languageNode The language node of the type
* @param defaultExpression The default expression of the type
* @param registerComparator Whether a default comparator should be registered for this enum's classinfo
* @param parseCallback A consumer to run on a successful parse.
*/
public EnumClassInfo(Class<T> enumClass, String codeName, String languageNode, DefaultExpression<T> defaultExpression, boolean registerComparator) {
public EnumClassInfo(Class<T> enumClass, String codeName, String languageNode, DefaultExpression<T> defaultExpression, Consumer<T> parseCallback) {
super(enumClass, codeName);
EnumParser<T> enumParser = new EnumParser<>(enumClass, languageNode);
EnumParser<T> enumParser = new EnumParser<>(enumClass, languageNode, parseCallback);
usage(enumParser.getCombinedPatterns())
.serializer(new EnumSerializer<>(enumClass))
.defaultExpression(defaultExpression)
.supplier(() -> new ArrayIterator<>(enumClass.getEnumConstants()))
.parser(enumParser);
}

if (registerComparator)
Comparators.registerComparator(enumClass, enumClass, (o1, o2) -> Relation.get(o1.ordinal() - o2.ordinal()));
/**
* @param enumClass The class
* @param codeName The name used in patterns
* @param languageNode The language node of the type
* @param registerComparator Whether a default comparator should be registered for this enum's classinfo
* @deprecated {@code registerComparator} is no longer necessary.
*/
@Deprecated(since = "2.16", forRemoval = true)
public EnumClassInfo(Class<T> enumClass, String codeName, String languageNode, boolean registerComparator) {
this(enumClass, codeName, languageNode, new EventValueExpression<>(enumClass));
}

/**
* @param enumClass The class
* @param codeName The name used in patterns
* @param languageNode The language node of the type
* @param defaultExpression The default expression of the type
* @param registerComparator Whether a default comparator should be registered for this enum's classinfo
* @deprecated {@code registerComparator} is no longer necessary.
*/
@Deprecated(since = "2.16", forRemoval = true)
public EnumClassInfo(Class<T> enumClass, String codeName, String languageNode, DefaultExpression<T> defaultExpression, boolean registerComparator) {
this(enumClass, codeName, languageNode, defaultExpression);
}

}
19 changes: 18 additions & 1 deletion src/main/java/ch/njol/skript/classes/EnumParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.function.Consumer;

/**
* A {@link Parser} used for parsing and handling values representing an {@link Enum}
Expand All @@ -19,6 +20,8 @@ public class EnumParser<E extends Enum<E>> extends PatternedParser<E> implements

private final Class<E> enumClass;
private final String languageNode;
private final Consumer<E> parseCallback;

private String[] names;
protected final Map<String, E> parseMap = new HashMap<>();
private String[] patterns;
Expand All @@ -28,11 +31,21 @@ public class EnumParser<E extends Enum<E>> extends PatternedParser<E> implements
* @param languageNode The {@link String} representing the languageNode for the {@link Enum}
*/
public EnumParser(Class<E> enumClass, String languageNode) {
this(enumClass, languageNode, ignored -> {});
}

/**
* @param enumClass The {@link Enum} {@link Class} to be accessed.
* @param languageNode The {@link String} representing the languageNode for the {@link Enum}
* @param parseCallback A consumer to run on a successful parse.
*/
public EnumParser(Class<E> enumClass, String languageNode, Consumer<E> parseCallback) {
assert enumClass.isEnum() : enumClass;
assert !languageNode.isEmpty() && !languageNode.endsWith(".") : languageNode;

this.enumClass = enumClass;
this.languageNode = languageNode;
this.parseCallback = parseCallback;

refresh();
Language.addListener(this::refresh);
Expand Down Expand Up @@ -86,7 +99,11 @@ void refresh() {

@Override
public @Nullable E parse(String string, ParseContext context) {
return parseMap.get(string.toLowerCase(Locale.ENGLISH));
E element = parseMap.get(string.toLowerCase(Locale.ENGLISH));
if (element != null) {
parseCallback.accept(element);
}
return element;
}

@Override
Expand Down
Loading
Loading