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> registryClass) { + unmodifiableSkript.removeRegistry(registryClass); + } + + @Override + public boolean hasRegistry(Class> 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