diff --git a/.github/workflows/java-8-builds.yml b/.github/workflows/java-11-builds.yml
similarity index 92%
rename from .github/workflows/java-8-builds.yml
rename to .github/workflows/java-11-builds.yml
index 0120b950f94..443aa925d0c 100644
--- a/.github/workflows/java-8-builds.yml
+++ b/.github/workflows/java-11-builds.yml
@@ -1,4 +1,4 @@
-name: Java 8 CI (MC 1.13-1.16)
+name: Java 11 CI (MC 1.13-1.16)
on:
push:
@@ -26,7 +26,7 @@ jobs:
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build Skript and run test scripts
- run: ./gradlew clean skriptTestJava8
+ run: ./gradlew clean skriptTestJava11
- name: Upload Nightly Build
uses: actions/upload-artifact@v4
if: success()
diff --git a/.github/workflows/junit-8-builds.yml b/.github/workflows/junit-11-builds.yml
similarity index 94%
rename from .github/workflows/junit-8-builds.yml
rename to .github/workflows/junit-11-builds.yml
index ec2fef19869..cdf75e4c43a 100644
--- a/.github/workflows/junit-8-builds.yml
+++ b/.github/workflows/junit-11-builds.yml
@@ -26,4 +26,4 @@ jobs:
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build Skript and run JUnit
- run: ./gradlew clean JUnitJava8
+ run: ./gradlew clean JUnitJava11
diff --git a/README.md b/README.md
index 2dba8104819..b4ab6c4e48f 100644
--- a/README.md
+++ b/README.md
@@ -16,11 +16,11 @@ 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.9+.
+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*.
Testing with all old patch versions is not feasible for us.
-Minecraft 1.8 and earlier are not, and will not be supported. New Minecraft
+Minecraft 1.12 and earlier are not, and will not be supported. New Minecraft
versions will be supported as soon as possible.
## Download
@@ -77,15 +77,15 @@ 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|skriptTestJava8|skriptTestJava17|skriptTestJava21)
+./gradlew (quickTest|skriptTest|skriptTestJava11|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.
-skriptTestJava8
(1.13-1.16) runs the tests on Java 8 supported versions.
+skriptTestJava11
(1.13-1.16) runs the tests on Java 11 supported versions.
skriptTest
runs the tests on all versions.
-That is, it runs skriptTestJava8, skriptTestJava17, and skriptTestJava21.
+That is, it runs skriptTestJava11, skriptTestJava17, and skriptTestJava21.
By running the tests, you agree to Mojang's End User License Agreement.
@@ -164,7 +164,7 @@ dependencies {
}
```
-An example of the version tag would be ```dev37c```.
+An example of the version tag would be ```2.8.5```.
> Note: If Gradle isn't able to resolve Skript's dependencies, just [disable the resolution of transitive dependencies](https://docs.gradle.org/current/userguide/resolution_rules.html#sec:disabling_resolution_transitive_dependencies) for Skript in your project.
diff --git a/build.gradle b/build.gradle
index 161d3dd3daf..d6a60fa9e37 100644
--- a/build.gradle
+++ b/build.gradle
@@ -70,7 +70,7 @@ task build(overwrite: true, type: ShadowJar) {
from sourceSets.main.output
}
-// Excludes the tests for the build task. Should be using junit, junitJava17, junitJava8, skriptTest, quickTest.
+// Excludes the tests for the build task. Should be using junit, junitJava17, junitJava11, skriptTest, quickTest.
// We do not want tests to run for building. That's time consuming and annoying. Especially in development.
test {
exclude '**/*'
@@ -224,7 +224,7 @@ void createTestTask(String name, String desc, String environments, int javaVersi
if (!gradle.taskGraph.hasTask(":tasks") && !gradle.startParameter.dryRun && modifiers.contains(Modifiers.PROFILE)) {
if (!project.hasProperty('profiler'))
throw new MissingPropertyException('Add parameter -Pprofiler=', 'profiler', String.class)
-
+
args += '-agentpath:' + project.property('profiler') + '=port=8849,nowait'
}
}
@@ -233,11 +233,11 @@ void createTestTask(String name, String desc, String environments, int javaVersi
def java21 = 21
def java17 = 17
-def java8 = 8
+def java11 = 11
def latestEnv = 'java21/paper-1.20.6.json'
def latestJava = java21
-def oldestJava = java8
+def oldestJava = java11
def latestJUnitEnv = 'java17/paper-1.20.4.json'
def latestJUnitJava = java17
@@ -260,14 +260,14 @@ 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('skriptTestJava8', 'Runs tests on all Java 8 environments.', environments + 'java8', java8, 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 skriptTestJava8, skriptTestJava17, skriptTestJava21
+ dependsOn skriptTestJava11, skriptTestJava17, skriptTestJava21
}
createTestTask('JUnitQuick', 'Runs JUnit tests on one environment being the latest supported Java and Minecraft.', environments + latestJUnitEnv, latestJUnitJava, 0, Modifiers.JUNIT)
@@ -275,10 +275,10 @@ createTestTask('JUnitQuick', 'Runs JUnit tests on one environment being the late
// However, we are currently using 5.0.1 (see https://github.com/SkriptLang/Skript/pull/6204#discussion_r1405302009)
//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('JUnitJava8', 'Runs JUnit tests on all Java 8 environments.', environments + 'java8', java8, 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 JUnitJava8, JUnitJava17//, JUnitJava21
+ dependsOn JUnitJava11, JUnitJava17//, JUnitJava21
}
// Build flavor configurations
@@ -394,7 +394,7 @@ javadoc {
exclude("ch/njol/skript/lang/function/ExprFunctionCall.java")
exclude("ch/njol/skript/hooks/**")
exclude("ch/njol/skript/test/**")
-
+
classpath = configurations.compileClasspath + sourceSets.main.output
options.encoding = 'UTF-8'
// currently our javadoc has a lot of errors, so we need to suppress the linter
diff --git a/code-conventions.md b/code-conventions.md
index 25c6d5c4417..3bcf17c6c9f 100644
--- a/code-conventions.md
+++ b/code-conventions.md
@@ -194,7 +194,7 @@ Your comments should look something like these:
## Language Features
### Compatibility
-[//]: # (To be updated after feature/2.9 for Java 17)
+[//]: # (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
* Versions up to and including Java 21 should work too
diff --git a/src/main/java/ch/njol/skript/effects/EffBan.java b/src/main/java/ch/njol/skript/effects/EffBan.java
index 1e674e23ded..3826fd7f372 100644
--- a/src/main/java/ch/njol/skript/effects/EffBan.java
+++ b/src/main/java/ch/njol/skript/effects/EffBan.java
@@ -26,7 +26,6 @@
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
-import org.eclipse.jdt.annotation.Nullable;
import ch.njol.skript.Skript;
import ch.njol.skript.doc.Description;
@@ -38,6 +37,7 @@
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.skript.util.Timespan;
import ch.njol.util.Kleenean;
+import org.jetbrains.annotations.Nullable;
@Name("Ban")
@Description({"Bans or unbans a player or an IP address.",
@@ -46,19 +46,23 @@
"We recommend that you test your scripts so that no accidental permanent bans are applied.",
"",
"Note that banning people does not kick them from the server.",
- "Consider using the kick effect after applying a ban."})
+ "You can optionally use 'and kick' or consider using the kick effect after applying a ban."})
@Examples({"unban player",
"ban \"127.0.0.1\"",
"IP-ban the player because \"he is an idiot\"",
- "ban player due to \"inappropriate language\" for 2 days"})
-@Since("1.4, 2.1.1 (ban reason), 2.5 (timespan)")
+ "ban player due to \"inappropriate language\" for 2 days",
+ "ban and kick player due to \"inappropriate language\" for 2 days"})
+@Since("1.4, 2.1.1 (ban reason), 2.5 (timespan), INSERT VERSION (kick)")
public class EffBan extends Effect {
static {
Skript.registerEffect(EffBan.class,
- "ban %strings/offlineplayers% [(by reason of|because [of]|on account of|due to) %-string%] [for %-timespan%]", "unban %strings/offlineplayers%",
- "ban %players% by IP [(by reason of|because [of]|on account of|due to) %-string%] [for %-timespan%]", "unban %players% by IP",
- "IP(-| )ban %players% [(by reason of|because [of]|on account of|due to) %-string%] [for %-timespan%]", "(IP(-| )unban|un[-]IP[-]ban) %players%");
+ "ban [kick:and kick] %strings/offlineplayers% [(by reason of|because [of]|on account of|due to) %-string%] [for %-timespan%]",
+ "unban %strings/offlineplayers%",
+ "ban [kick:and kick] %players% by IP [(by reason of|because [of]|on account of|due to) %-string%] [for %-timespan%]",
+ "unban %players% by IP",
+ "IP(-| )ban [kick:and kick] %players% [(by reason of|because [of]|on account of|due to) %-string%] [for %-timespan%]",
+ "(IP(-| )unban|un[-]IP[-]ban) %players%");
}
@SuppressWarnings("null")
@@ -70,6 +74,7 @@ public class EffBan extends Effect {
private boolean ban;
private boolean ipBan;
+ private boolean kick;
@SuppressWarnings({"null", "unchecked"})
@Override
@@ -79,6 +84,7 @@ public boolean init(final Expression>[] exprs, final int matchedPattern, final
expires = exprs.length > 1 ? (Expression) exprs[2] : null;
ban = matchedPattern % 2 == 0;
ipBan = matchedPattern >= 2;
+ kick = parseResult.hasTag("kick");
return true;
}
@@ -91,8 +97,9 @@ protected void execute(final Event e) {
final String source = "Skript ban effect";
for (final Object o : players.getArray(e)) {
if (o instanceof Player) {
+ Player player = (Player) o;
if (ipBan) {
- InetSocketAddress addr = ((Player) o).getAddress();
+ InetSocketAddress addr = player.getAddress();
if (addr == null)
return; // Can't ban unknown IP
final String ip = addr.getAddress().getHostAddress();
@@ -102,10 +109,12 @@ protected void execute(final Event e) {
Bukkit.getBanList(BanList.Type.IP).pardon(ip);
} else {
if (ban)
- Bukkit.getBanList(BanList.Type.NAME).addBan(((Player) o).getName(), reason, expires, source); // FIXME [UUID] ban UUID
+ Bukkit.getBanList(BanList.Type.NAME).addBan(player.getName(), reason, expires, source); // FIXME [UUID] ban UUID
else
- Bukkit.getBanList(BanList.Type.NAME).pardon(((Player) o).getName());
+ Bukkit.getBanList(BanList.Type.NAME).pardon(player.getName());
}
+ if (kick)
+ player.kickPlayer(reason);
} else if (o instanceof OfflinePlayer) {
String name = ((OfflinePlayer) o).getName();
if (name == null)
@@ -130,9 +139,13 @@ protected void execute(final Event e) {
}
@Override
- public String toString(final @Nullable Event e, final boolean debug) {
- return (ipBan ? "IP-" : "") + (ban ? "" : "un") + "ban " + players.toString(e, debug) +
- (reason != null ? " on account of " + reason.toString(e, debug) : "") + (expires != null ? " for " + expires.toString(e, debug) : "");
+ public String toString(final @Nullable Event event, final boolean debug) {
+ return (ipBan ? "IP-" : "") +
+ (this.ban ? "ban " : "unban ") +
+ (kick ? "and kick " : "") +
+ this.players.toString(event, debug) +
+ (this.reason != null ? " on account of " + this.reason.toString(event, debug) : "") +
+ (expires != null ? " for " + expires.toString(event, debug) : "");
}
}
diff --git a/src/test/skript/environments/java8/paper-1.13.2.json b/src/test/skript/environments/java11/paper-1.13.2.json
similarity index 100%
rename from src/test/skript/environments/java8/paper-1.13.2.json
rename to src/test/skript/environments/java11/paper-1.13.2.json
diff --git a/src/test/skript/environments/java8/paper-1.14.4.json b/src/test/skript/environments/java11/paper-1.14.4.json
similarity index 100%
rename from src/test/skript/environments/java8/paper-1.14.4.json
rename to src/test/skript/environments/java11/paper-1.14.4.json
diff --git a/src/test/skript/environments/java8/paper-1.15.2.json b/src/test/skript/environments/java11/paper-1.15.2.json
similarity index 100%
rename from src/test/skript/environments/java8/paper-1.15.2.json
rename to src/test/skript/environments/java11/paper-1.15.2.json
diff --git a/src/test/skript/environments/java8/paper-1.16.5.json b/src/test/skript/environments/java11/paper-1.16.5.json
similarity index 100%
rename from src/test/skript/environments/java8/paper-1.16.5.json
rename to src/test/skript/environments/java11/paper-1.16.5.json