diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml
index 08a6df7b665..677d0ce8a8b 100644
--- a/.github/ISSUE_TEMPLATE/bug-report.yml
+++ b/.github/ISSUE_TEMPLATE/bug-report.yml
@@ -7,6 +7,8 @@ body:
## Guidelines
Please make sure you are running the latest version of Skript on a supported server platform and version.
Try to make sure there are no issues of this same problem currently open either.
+ As of the release of Skript 2.10, the oldest supported version has been raised to 1.19.4.
+ Any issues created for versions older than 1.19.4 will not be looked into or fixed unless the issue persists on supported versions.
- type: textarea
attributes:
label: Skript/Server Version
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 5b930003730..16900d59a6f 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -1,5 +1,12 @@
version: 2
updates:
+ - package-ecosystem: "gitsubmodule"
+ target-branch: "dev/patch"
+ directory: "/"
+ schedule:
+ interval: "weekly"
+ labels:
+ - "dependencies"
- package-ecosystem: "github-actions"
target-branch: "dev/patch"
directory: "/"
diff --git a/.github/workflows/github-issues/issues-labeled.yml b/.github/workflows/github-issues/issues-labeled.yml
new file mode 100644
index 00000000000..6f65129b48c
--- /dev/null
+++ b/.github/workflows/github-issues/issues-labeled.yml
@@ -0,0 +1,22 @@
+name: When labels are modified, run actions.
+
+on:
+ issues:
+ types: [labeled]
+
+jobs:
+ remove-good-first-issue-label:
+ if: ${{ github.event.label.name == 'completed' || github.event.label.name == 'PR available'}}
+ runs-on: ubuntu-latest
+ permissions:
+ issues: write
+ steps:
+ - uses: actions/github-script@v6
+ with:
+ script: |
+ github.rest.issues.removeLabel({
+ issue_number: context.issue.number,
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ name: ["good first issue"]
+ })
diff --git a/.github/workflows/java-11-builds.yml b/.github/workflows/java-11-builds.yml
deleted file mode 100644
index 443aa925d0c..00000000000
--- a/.github/workflows/java-11-builds.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-name: Java 11 CI (MC 1.13-1.16)
-
-on:
- push:
- branches:
- - master
- - 'dev/**'
- pull_request:
-
-jobs:
- build:
- if: "! contains(toJSON(github.event.commits.*.message), '[ci skip]')"
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- with:
- submodules: recursive
- - name: validate gradle wrapper
- uses: gradle/wrapper-validation-action@v2
- - name: Set up JDK 21
- uses: actions/setup-java@v4
- with:
- java-version: '21'
- distribution: 'adopt'
- cache: gradle
- - name: Grant execute permission for gradlew
- run: chmod +x gradlew
- - name: Build Skript and run test scripts
- run: ./gradlew clean skriptTestJava11
- - name: Upload Nightly Build
- uses: actions/upload-artifact@v4
- if: success()
- with:
- name: skript-nightly
- path: build/libs/*
diff --git a/.github/workflows/java-17-builds.yml b/.github/workflows/java-17-builds.yml
index 2ca6d6bde61..43d6458c946 100644
--- a/.github/workflows/java-17-builds.yml
+++ b/.github/workflows/java-17-builds.yml
@@ -1,4 +1,4 @@
-name: Java 17 CI (MC 1.17-1.20.4)
+name: Java 17 CI (MC 1.19.4-1.20.4)
on:
push:
diff --git a/.github/workflows/junit-11-builds.yml b/.github/workflows/junit-11-builds.yml
deleted file mode 100644
index cdf75e4c43a..00000000000
--- a/.github/workflows/junit-11-builds.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-name: JUnit (MC 1.13-1.16)
-
-on:
- push:
- branches:
- - master
- - 'dev/**'
- pull_request:
-
-jobs:
- build:
- if: "! contains(toJSON(github.event.commits.*.message), '[ci skip]')"
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- with:
- submodules: recursive
- - name: validate gradle wrapper
- uses: gradle/wrapper-validation-action@v2
- - name: Set up JDK 21
- uses: actions/setup-java@v4
- with:
- java-version: '21'
- distribution: 'adopt'
- cache: gradle
- - name: Grant execute permission for gradlew
- run: chmod +x gradlew
- - name: Build Skript and run JUnit
- run: ./gradlew clean JUnitJava11
diff --git a/.github/workflows/junit-17-builds.yml b/.github/workflows/junit-17-builds.yml
index 238bd9b132e..7bbe8952eb3 100644
--- a/.github/workflows/junit-17-builds.yml
+++ b/.github/workflows/junit-17-builds.yml
@@ -1,4 +1,4 @@
-name: JUnit (MC 1.17-1.20.4)
+name: JUnit (MC 1.19.4-1.20.4)
on:
push:
diff --git a/.gitmodules b/.gitmodules
index 548317e15e5..015a2ca1530 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,4 @@
[submodule "skript-aliases"]
path = skript-aliases
url = https://github.com/SkriptLang/skript-aliases
+ branch = minimized-aliases
diff --git a/README.md b/README.md
index b4ab6c4e48f..bd1e1375345 100644
--- a/README.md
+++ b/README.md
@@ -16,8 +16,8 @@ Skript requires **Spigot** to work. You heard it right, **CraftBukkit** does *no
**Paper**, which is a fork of Spigot, is recommended; it is required for some
parts of Skript to be available.
-Skript supports only the **latest** patch versions of Minecraft 1.13+.
-For example, this means that 1.16.5 is supported, but 1.16.4 is *not*.
+Skript supports only the **latest** patch versions of Minecraft 1.19 and newer.
+For example, this means that 1.19.4 is supported, but 1.19.3 is *not*.
Testing with all old patch versions is not feasible for us.
Minecraft 1.12 and earlier are not, and will not be supported. New Minecraft
@@ -77,15 +77,14 @@ Skript has some tests written in Skript. Running them requires a Minecraft
server, but our build script will create one for you. Running the tests is easy:
```
-./gradlew (quickTest|skriptTest|skriptTestJava11|skriptTestJava17|skriptTestJava21)
+./gradlew (quickTest|skriptTest|skriptTestJava17|skriptTestJava21)
```
quickTest
runs the test suite on newest supported server version.
skriptTestJava21
(1.20.6+) runs the tests on Java 21 supported versions.
-skriptTestJava17
(1.17-1.20.4) runs the tests on Java 17 supported versions.
-skriptTestJava11
(1.13-1.16) runs the tests on Java 11 supported versions.
+skriptTestJava17
(1.19.4-1.20.4) runs the tests on Java 17 supported versions.
skriptTest
runs the tests on all versions.
-That is, it runs skriptTestJava11, skriptTestJava17, and skriptTestJava21.
+That is, it runs skriptTestJava17, and skriptTestJava21.
By running the tests, you agree to Mojang's End User License Agreement.
diff --git a/build.gradle b/build.gradle
index 1fa00be86b8..9d647455a6b 100644
--- a/build.gradle
+++ b/build.gradle
@@ -30,11 +30,19 @@ dependencies {
shadow group: 'org.bstats', name: 'bstats-bukkit', version: '3.0.2'
shadow group: 'net.kyori', name: 'adventure-text-serializer-bungeecord', version: '4.3.2'
- implementation group: 'io.papermc.paper', name: 'paper-api', version: '1.21.3-R0.1-SNAPSHOT'
+ implementation group: 'io.papermc.paper', name: 'paper-api', version: '1.21.4-R0.1-SNAPSHOT'
implementation group: 'com.google.code.findbugs', name: 'findbugs', version: '3.0.1'
- implementation group: 'com.sk89q.worldguard', name: 'worldguard-legacy', version: '7.0.0-SNAPSHOT'
+
+ // bundled with Minecraft 1.19.4+ for display entity transforms
+ implementation group: 'org.joml', name: 'joml', version: '1.10.5'
+
+ // Plugin hook libraries
+ implementation group: 'com.sk89q.worldguard', name: 'worldguard-legacy', version: '7.0.0-SNAPSHOT', {
+ exclude group: 'org.bukkit', module: 'bukkit'
+ }
implementation group: 'net.milkbowl.vault', name: 'Vault', version: '1.7.3', {
exclude group: 'org.bstats', module: 'bstats-bukkit'
+ exclude group: 'org.bukkit', module: 'bukkit'
}
implementation fileTree(dir: 'lib', include: '*.jar')
@@ -75,7 +83,7 @@ task build(overwrite: true, type: ShadowJar) {
from sourceSets.main.output
}
-// Excludes the tests for the build task. Should be using JUnitQuick, JUnitJava21, JUnitJava17, JUnitJava11, skriptTest, quickTest.
+// Excludes the tests for the build task. Should be using JUnitQuick, JUnitJava21, JUnitJava17, skriptTest, quickTest.
// We do not want tests to run for building. That's time consuming and annoying. Especially in development.
test {
exclude '**/*'
@@ -238,11 +246,10 @@ void createTestTask(String name, String desc, String environments, int javaVersi
def java21 = 21
def java17 = 17
-def java11 = 11
-def latestEnv = 'java21/paper-1.21.3.json'
+def latestEnv = 'java21/paper-1.21.4.json'
def latestJava = java21
-def oldestJava = java11
+def oldestJava = java17
def latestJUnitEnv = latestEnv
def latestJUnitJava = latestJava
@@ -265,23 +272,21 @@ int envJava = project.property('testEnvJavaVersion') == null ? latestJava : Inte
createTestTask('quickTest', 'Runs tests on one environment being the latest supported Java and Minecraft.', environments + latestEnv, latestJava, 0)
createTestTask('skriptTestJava21', 'Runs tests on all Java 21 environments.', environments + 'java21', java21, 0)
createTestTask('skriptTestJava17', 'Runs tests on all Java 17 environments.', environments + 'java17', java17, 0)
-createTestTask('skriptTestJava11', 'Runs tests on all Java 11 environments.', environments + 'java11', java11, 0)
createTestTask('skriptTestDev', 'Runs testing server and uses \'system.in\' for command input, stop server to finish.', environments + env, envJava, 0, Modifiers.DEV_MODE, Modifiers.DEBUG)
createTestTask('skriptProfile', 'Starts the testing server with JProfiler support.', environments + latestEnv, latestJava, -1, Modifiers.PROFILE)
createTestTask('genNightlyDocs', 'Generates the Skript documentation website html files.', environments + env, envJava, 0, Modifiers.GEN_NIGHTLY_DOCS)
createTestTask('genReleaseDocs', 'Generates the Skript documentation website html files for a release.', environments + env, envJava, 0, Modifiers.GEN_RELEASE_DOCS)
tasks.register('skriptTest') {
description = 'Runs tests on all environments.'
- dependsOn skriptTestJava11, skriptTestJava17, skriptTestJava21
+ dependsOn skriptTestJava17, skriptTestJava21
}
createTestTask('JUnitQuick', 'Runs JUnit tests on one environment being the latest supported Java and Minecraft.', environments + latestJUnitEnv, latestJUnitJava, 0, Modifiers.JUNIT)
createTestTask('JUnitJava21', 'Runs JUnit tests on all Java 21 environments.', environments + 'java21', java21, 0, Modifiers.JUNIT)
createTestTask('JUnitJava17', 'Runs JUnit tests on all Java 17 environments.', environments + 'java17', java17, 0, Modifiers.JUNIT)
-createTestTask('JUnitJava11', 'Runs JUnit tests on all Java 11 environments.', environments + 'java11', java11, 0, Modifiers.JUNIT)
tasks.register('JUnit') {
description = 'Runs JUnit tests on all environments.'
- dependsOn JUnitJava11, JUnitJava17, JUnitJava21
+ dependsOn JUnitJava17, JUnitJava21
}
// Build flavor configurations
diff --git a/code-conventions.md b/code-conventions.md
index b6942221cdd..f47329495a0 100644
--- a/code-conventions.md
+++ b/code-conventions.md
@@ -195,9 +195,8 @@ Your comments should look something like these:
## Language Features
### Compatibility
-[//]: # (To be updated for 2.10 for Java 17)
-* Contributions should maintain Java 11 source/binary compatibility, even though compiling Skript requires Java 21
- - Users must not need JRE newer than version 11
+* Contributions should maintain Java 17 source/binary compatibility, even though compiling Skript requires Java 21
+ - Users must not need JRE newer than version 17
* Versions up to and including Java 21 should work too
- Please avoid using unsafe reflection
* It is recommended to make fields final, if they are effectively final
diff --git a/gradle.properties b/gradle.properties
index 8008d0748ff..8207c8da4ec 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -5,7 +5,7 @@ org.gradle.parallel=true
groupid=ch.njol
name=skript
-version=2.9.5
+version=2.10.0
jarName=Skript.jar
-testEnv=java21/paper-1.21.3
+testEnv=java21/paper-1.21.4
testEnvJavaVersion=21
diff --git a/skript-aliases b/skript-aliases
index 16949c28e0d..97212b5b809 160000
--- a/skript-aliases
+++ b/skript-aliases
@@ -1 +1 @@
-Subproject commit 16949c28e0d7bb25ea7c3479c3d6754ff3b5a3e6
+Subproject commit 97212b5b809147e16eef5c5a80dd55324662d572
diff --git a/src/main/java/ch/njol/skript/ModernSkriptBridge.java b/src/main/java/ch/njol/skript/ModernSkriptBridge.java
new file mode 100644
index 00000000000..194badaf0ac
--- /dev/null
+++ b/src/main/java/ch/njol/skript/ModernSkriptBridge.java
@@ -0,0 +1,89 @@
+package ch.njol.skript;
+
+import org.jetbrains.annotations.Unmodifiable;
+import org.skriptlang.skript.Skript;
+import org.skriptlang.skript.addon.SkriptAddon;
+import org.skriptlang.skript.localization.Localizer;
+import org.skriptlang.skript.registration.SyntaxRegistry;
+import org.skriptlang.skript.util.Registry;
+
+import java.util.Collection;
+import java.util.function.Supplier;
+
+/**
+ * Bridge for interacting with the modern API classes from {@link org.skriptlang.skript}.
+ */
+final class ModernSkriptBridge {
+
+ private ModernSkriptBridge() { }
+
+ /**
+ * Similar to {@link Skript#unmodifiableView()}, but permits addon registration.
+ */
+ public static final class SpecialUnmodifiableSkript implements Skript {
+
+ private final Skript skript;
+ private final Skript unmodifiableSkript;
+
+ public SpecialUnmodifiableSkript(Skript skript) {
+ this.skript = skript;
+ this.unmodifiableSkript = skript.unmodifiableView();
+ }
+
+ @Override
+ public SkriptAddon registerAddon(Class> source, String name) {
+ return skript.registerAddon(source, name);
+ }
+
+ @Override
+ public @Unmodifiable Collection addons() {
+ return unmodifiableSkript.addons();
+ }
+
+ @Override
+ public Class> source() {
+ return unmodifiableSkript.source();
+ }
+
+ @Override
+ public String name() {
+ return unmodifiableSkript.name();
+ }
+
+ @Override
+ public > void storeRegistry(Class registryClass, R registry) {
+ unmodifiableSkript.storeRegistry(registryClass, registry);
+ }
+
+ @Override
+ public void removeRegistry(Class extends Registry>> registryClass) {
+ unmodifiableSkript.removeRegistry(registryClass);
+ }
+
+ @Override
+ public boolean hasRegistry(Class extends Registry>> registryClass) {
+ return unmodifiableSkript.hasRegistry(registryClass);
+ }
+
+ @Override
+ public > R registry(Class registryClass) {
+ return unmodifiableSkript.registry(registryClass);
+ }
+
+ @Override
+ public > R registry(Class registryClass, Supplier putIfAbsent) {
+ return unmodifiableSkript.registry(registryClass, putIfAbsent);
+ }
+
+ @Override
+ public SyntaxRegistry syntaxRegistry() {
+ return unmodifiableSkript.syntaxRegistry();
+ }
+
+ @Override
+ public Localizer localizer() {
+ return unmodifiableSkript.localizer();
+ }
+ }
+
+}
diff --git a/src/main/java/ch/njol/skript/PatcherTool.java b/src/main/java/ch/njol/skript/PatcherTool.java
index 6b2355fdaf9..66062ae1769 100644
--- a/src/main/java/ch/njol/skript/PatcherTool.java
+++ b/src/main/java/ch/njol/skript/PatcherTool.java
@@ -1,21 +1,3 @@
-/**
- * This file is part of Skript.
- *
- * Skript is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Skript is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Skript. If not, see .
- *
- * Copyright Peter Güttinger, SkriptLang team and contributors
- */
package ch.njol.skript;
import java.io.IOException;
diff --git a/src/main/java/ch/njol/skript/ScriptLoader.java b/src/main/java/ch/njol/skript/ScriptLoader.java
index 0e1ed6a7451..411323f9795 100644
--- a/src/main/java/ch/njol/skript/ScriptLoader.java
+++ b/src/main/java/ch/njol/skript/ScriptLoader.java
@@ -1,21 +1,3 @@
-/**
- * This file is part of Skript.
- *
- * Skript is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Skript is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Skript. If not, see .
- *
- * Copyright Peter Güttinger, SkriptLang team and contributors
- */
package ch.njol.skript;
import ch.njol.skript.config.Config;
@@ -27,28 +9,28 @@
import ch.njol.skript.lang.SkriptParser;
import ch.njol.skript.lang.Statement;
import ch.njol.skript.lang.TriggerItem;
-import ch.njol.skript.lang.TriggerSection;
import ch.njol.skript.lang.parser.ParserInstance;
import ch.njol.skript.log.CountingLogHandler;
import ch.njol.skript.log.LogEntry;
import ch.njol.skript.log.RetainingLogHandler;
import ch.njol.skript.log.SkriptLogger;
-import ch.njol.skript.sections.SecLoop;
import ch.njol.skript.structures.StructOptions.OptionsData;
+import ch.njol.skript.test.runner.TestMode;
import ch.njol.skript.util.ExceptionUtils;
import ch.njol.skript.util.SkriptColor;
import ch.njol.skript.util.Task;
import ch.njol.skript.util.Timespan;
import ch.njol.skript.variables.TypeHints;
-import ch.njol.util.Kleenean;
import ch.njol.util.NonNullPair;
import ch.njol.util.OpenCloseable;
import ch.njol.util.StringUtils;
import org.bukkit.Bukkit;
-import org.bukkit.event.Event;
+import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
import org.skriptlang.skript.lang.script.Script;
+import org.skriptlang.skript.lang.script.ScriptWarning;
import org.skriptlang.skript.lang.structure.Structure;
+import org.skriptlang.skript.util.event.EventRegistry;
import java.io.File;
import java.io.FileFilter;
@@ -56,21 +38,8 @@
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.Callable;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
+import java.util.*;
+import java.util.concurrent.*;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -82,7 +51,7 @@ public class ScriptLoader {
public static final String DISABLED_SCRIPT_PREFIX = "-";
public static final int DISABLED_SCRIPT_PREFIX_LENGTH = DISABLED_SCRIPT_PREFIX.length();
-
+
/**
* A class for keeping track of the general content of a script:
*
@@ -96,12 +65,12 @@ public static class ScriptInfo {
public ScriptInfo() {
}
-
+
public ScriptInfo(int numFiles, int numStructures) {
files = numFiles;
structures = numStructures;
}
-
+
/**
* Copy constructor.
* @param other ScriptInfo to copy from
@@ -110,30 +79,30 @@ public ScriptInfo(ScriptInfo other) {
files = other.files;
structures = other.structures;
}
-
+
public void add(ScriptInfo other) {
files += other.files;
structures += other.structures;
}
-
+
public void subtract(ScriptInfo other) {
files -= other.files;
structures -= other.structures;
}
-
+
@Override
public String toString() {
return "ScriptInfo{files=" + files + ",structures=" + structures + "}";
}
}
-
+
/**
* @see ParserInstance#get()
*/
private static ParserInstance getParser() {
return ParserInstance.get();
}
-
+
/*
* Enabled/disabled script tracking
*/
@@ -172,7 +141,7 @@ private boolean isSubDir(File directory, File subDir) {
return false;
}
}));
-
+
/**
* Filter for loaded scripts and folders.
*/
@@ -232,7 +201,7 @@ public static Set