From 846b60627f75ed2a86e1534e85bfea7100001bde Mon Sep 17 00:00:00 2001 From: Tim203 Date: Sun, 26 Feb 2023 01:12:18 +0100 Subject: [PATCH 01/12] Made various changes to the build action --- .github/workflows/build.yml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b67afb27..016d0bfd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,25 +15,30 @@ jobs: with: java-version: 8 distribution: temurin - cache: gradle - name: Build uses: gradle/gradle-build-action@v2 with: arguments: build + cache-read-only: ${{ github.ref_name != 'master' && github.ref_name != 'development' }} - name: Publish to Maven Repository - if: ${{ job.status == 'success' && github.repository == 'GeyserMC/Floodgate' }} + if: ${{ github.repository == 'GeyserMC/Floodgate' }} uses: gradle/gradle-build-action@v2 env: ORG_GRADLE_PROJECT_geysermcUsername: ${{ vars.DEPLOY_USER }} ORG_GRADLE_PROJECT_geysermcPassword: ${{ secrets.DEPLOY_PASS }} with: arguments: publish + cache-read-only: ${{ github.ref_name != 'master' && github.ref_name != 'development' }} - name: Publish to Downloads API - if: ${{ github.ref_name == 'master' && job.status == 'success' && github.repository == 'GeyserMC/Floodgate' }} + if: ${{ github.ref_name == 'master' && github.repository == 'GeyserMC/Floodgate' }} shell: bash + env: + DOWNLOADS_USERNAME: ${{ vars.DOWNLOADS_USERNAME }} + DOWNLOADS_PRIVATE_KEY: ${{ secrets.DOWNLOADS_PRIVATE_KEY }} + DOWNLOADS_SERVER_IP: ${{ secrets.DOWNLOADS_SERVER_IP }} run: | # Save the private key to a file echo "$DOWNLOADS_PRIVATE_KEY" > id_ecdsa @@ -49,11 +54,10 @@ jobs: ssh -o StrictHostKeyChecking=no -i id_ecdsa $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP rm ~/files/floodgate-parent-*.jar ~/files/floodgate-api.jar ~/files/floodgate-core.jar # Run the build script - ssh -o StrictHostKeyChecking=no -i id_ecdsa $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP ./handleBuild.sh floodgate $version $GITHUB_RUN_ID $GITHUB_SHA + ssh -o StrictHostKeyChecking=no -i id_ecdsa $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP ./handleBuild.sh floodgate $version $GITHUB_RUN_NUMBER $GITHUB_SHA - name: Notify Discord - if: ${{ github.repository == 'GeyserMC/Floodgate' }} + if: ${{ (success() || failure()) && github.repository == 'GeyserMC/Floodgate' }} uses: Tim203/actions-git-discord-webhook@main with: webhook_url: ${{ secrets.DISCORD_WEBHOOK }} - status: ${{ job.status }} From e4a20802990c82f2711250f617d17d3c7a9660f3 Mon Sep 17 00:00:00 2001 From: Tim203 Date: Sun, 26 Feb 2023 01:18:34 +0100 Subject: [PATCH 02/12] Update maven deploy location --- .../src/main/kotlin/floodgate.publish-conventions.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build-logic/src/main/kotlin/floodgate.publish-conventions.gradle.kts b/build-logic/src/main/kotlin/floodgate.publish-conventions.gradle.kts index 39e180ae..0f7b7618 100644 --- a/build-logic/src/main/kotlin/floodgate.publish-conventions.gradle.kts +++ b/build-logic/src/main/kotlin/floodgate.publish-conventions.gradle.kts @@ -10,6 +10,6 @@ indra { } } - publishSnapshotsTo("geysermc", "https://repo.opencollab.dev/artifactory/maven-snapshots") - publishReleasesTo("geysermc", "https://repo.opencollab.dev/artifactory/maven-releases") + publishSnapshotsTo("geysermc", "https://repo.opencollab.dev/maven-snapshots") + publishReleasesTo("geysermc", "https://repo.opencollab.dev/maven-releases") } \ No newline at end of file From 9512528b352f3ed8cbca19f94bb4670c95851c1c Mon Sep 17 00:00:00 2001 From: Tim203 Date: Mon, 27 Feb 2023 00:40:36 +0100 Subject: [PATCH 03/12] Relocate MySQL database extension dependencies --- database/mysql/build.gradle.kts | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/database/mysql/build.gradle.kts b/database/mysql/build.gradle.kts index 3b6f25a3..3975a2e0 100644 --- a/database/mysql/build.gradle.kts +++ b/database/mysql/build.gradle.kts @@ -1,12 +1,17 @@ -val mysqlClientVersion = "8.0.30" -val hikariVersion = "4.0.3" - dependencies { - provided(projects.core) - implementation("mysql", "mysql-connector-java", mysqlClientVersion) - implementation("com.zaxxer", "HikariCP", hikariVersion) + provided(projects.core) + + // update HikariCP when we move to Java 11+ + implementation("com.zaxxer", "HikariCP", "4.0.3") + + implementation("com.mysql", "mysql-connector-j", "8.0.32") { + exclude("com.google.protobuf", "protobuf-java") + } } description = "The Floodgate database extension for MySQL" -relocate("org.mariadb") +// relocate everything from mysql-connector-j and HikariCP +relocate("com.mysql") +relocate("com.zaxxer.hikari") +relocate("org.slf4j") From 2230f2a6d3b01f2547933d3caa4626678ad5c602 Mon Sep 17 00:00:00 2001 From: Konicai <71294714+Konicai@users.noreply.github.com> Date: Sun, 26 Feb 2023 18:48:49 -0500 Subject: [PATCH 04/12] Shutdown metrics on platform shutdown (#386) * Shutdown metrics on platorm shutdown * Listen to event instead of hardcoding it * Annotate Metrics as a Listener * Use temporary bStats fork to properly shutdown bStats * Use bstats-base dependency (instead of the whole project I guess?) * Formatting change --------- Co-authored-by: Tim203 --- build-logic/src/main/kotlin/Versions.kt | 2 +- core/build.gradle.kts | 4 +++- .../main/java/org/geysermc/floodgate/util/Metrics.java | 9 +++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/build-logic/src/main/kotlin/Versions.kt b/build-logic/src/main/kotlin/Versions.kt index 7fa0c6d3..b501b9e2 100644 --- a/build-logic/src/main/kotlin/Versions.kt +++ b/build-logic/src/main/kotlin/Versions.kt @@ -34,7 +34,7 @@ object Versions { const val nettyVersion = "4.1.49.Final" const val snakeyamlVersion = "1.28" const val cloudVersion = "1.5.0" - const val bstatsVersion = "3.0.1" + const val bstatsVersion = "d2fbbd6823" const val javaWebsocketVersion = "1.5.2" diff --git a/core/build.gradle.kts b/core/build.gradle.kts index d7d48737..46b43de2 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -15,7 +15,9 @@ dependencies { api("org.java-websocket", "Java-WebSocket", Versions.javaWebsocketVersion) api("cloud.commandframework", "cloud-core", Versions.cloudVersion) api("org.yaml", "snakeyaml", Versions.snakeyamlVersion) - api("org.bstats", "bstats-base", Versions.bstatsVersion) + + //todo use official dependency once https://github.com/Bastian/bstats-metrics/pull/118 is merged + api("com.github.Konicai.bstats-metrics", "bstats-base", Versions.bstatsVersion) } // present on all platforms diff --git a/core/src/main/java/org/geysermc/floodgate/util/Metrics.java b/core/src/main/java/org/geysermc/floodgate/util/Metrics.java index 4ef585b7..7e388940 100644 --- a/core/src/main/java/org/geysermc/floodgate/util/Metrics.java +++ b/core/src/main/java/org/geysermc/floodgate/util/Metrics.java @@ -38,12 +38,16 @@ import org.bstats.charts.DrilldownPie; import org.bstats.charts.SimplePie; import org.bstats.charts.SingleLineChart; import org.bstats.json.JsonObjectBuilder; +import org.geysermc.event.Listener; +import org.geysermc.event.subscribe.Subscribe; import org.geysermc.floodgate.api.FloodgateApi; import org.geysermc.floodgate.api.logger.FloodgateLogger; import org.geysermc.floodgate.config.FloodgateConfig; import org.geysermc.floodgate.config.FloodgateConfig.MetricsConfig; +import org.geysermc.floodgate.event.lifecycle.ShutdownEvent; import org.geysermc.floodgate.platform.util.PlatformUtils; +@Listener @AutoBind public final class Metrics { private final MetricsBase metricsBase; @@ -145,4 +149,9 @@ public final class Metrics { builder.appendField("osVersion", System.getProperty("os.version")); builder.appendField("coreCount", Runtime.getRuntime().availableProcessors()); } + + @Subscribe + public void onShutdown(ShutdownEvent ignored) { + metricsBase.shutdown(); + } } From d572ec97fd6dbb4187a4cd8b89712029d4127a90 Mon Sep 17 00:00:00 2001 From: Tim203 Date: Wed, 1 Mar 2023 13:33:22 +0100 Subject: [PATCH 05/12] Store forms in a synchronized map --- .../geysermc/floodgate/pluginmessage/channel/FormChannel.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/geysermc/floodgate/pluginmessage/channel/FormChannel.java b/core/src/main/java/org/geysermc/floodgate/pluginmessage/channel/FormChannel.java index b12ec325..1da89bc1 100644 --- a/core/src/main/java/org/geysermc/floodgate/pluginmessage/channel/FormChannel.java +++ b/core/src/main/java/org/geysermc/floodgate/pluginmessage/channel/FormChannel.java @@ -28,6 +28,7 @@ package org.geysermc.floodgate.pluginmessage.channel; import com.google.common.base.Charsets; import com.google.inject.Inject; import it.unimi.dsi.fastutil.shorts.Short2ObjectMap; +import it.unimi.dsi.fastutil.shorts.Short2ObjectMaps; import it.unimi.dsi.fastutil.shorts.Short2ObjectOpenHashMap; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; @@ -41,7 +42,8 @@ import org.geysermc.floodgate.pluginmessage.PluginMessageChannel; public class FormChannel implements PluginMessageChannel { private final FormDefinitions formDefinitions = FormDefinitions.instance(); - private final Short2ObjectMap
storedForms = new Short2ObjectOpenHashMap<>(); + private final Short2ObjectMap storedForms = + Short2ObjectMaps.synchronize(new Short2ObjectOpenHashMap<>()); private final AtomicInteger nextFormId = new AtomicInteger(0); @Inject private PluginMessageUtils pluginMessageUtils; From 8b002e2b9f3cb780e19f3d6034bbecc00e678047 Mon Sep 17 00:00:00 2001 From: Tim203 Date: Wed, 1 Mar 2023 20:23:28 +0100 Subject: [PATCH 06/12] Attempt to fix publishing to the Downloads API --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 016d0bfd..f171fdbe 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -51,7 +51,7 @@ jobs: scp -B -o StrictHostKeyChecking=no -i id_ecdsa **/build/libs/floodgate-*.jar $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP:~/files/ # Remove un-needed artifacts - ssh -o StrictHostKeyChecking=no -i id_ecdsa $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP rm ~/files/floodgate-parent-*.jar ~/files/floodgate-api.jar ~/files/floodgate-core.jar + ssh -o StrictHostKeyChecking=no -i id_ecdsa $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP rm ./files/floodgate-parent-*.jar ./files/floodgate-api.jar ./files/floodgate-core.jar # Run the build script ssh -o StrictHostKeyChecking=no -i id_ecdsa $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP ./handleBuild.sh floodgate $version $GITHUB_RUN_NUMBER $GITHUB_SHA From 089b9a7e90c0771e5fddb0fddcb794455b20e1bb Mon Sep 17 00:00:00 2001 From: Tim203 Date: Wed, 1 Mar 2023 20:27:12 +0100 Subject: [PATCH 07/12] Another attempt --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f171fdbe..b580f4c4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -51,7 +51,7 @@ jobs: scp -B -o StrictHostKeyChecking=no -i id_ecdsa **/build/libs/floodgate-*.jar $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP:~/files/ # Remove un-needed artifacts - ssh -o StrictHostKeyChecking=no -i id_ecdsa $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP rm ./files/floodgate-parent-*.jar ./files/floodgate-api.jar ./files/floodgate-core.jar + ssh -o StrictHostKeyChecking=no -i id_ecdsa $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP rm ./files/floodgate-api.jar ./files/floodgate-core.jar # Run the build script ssh -o StrictHostKeyChecking=no -i id_ecdsa $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP ./handleBuild.sh floodgate $version $GITHUB_RUN_NUMBER $GITHUB_SHA From 65e4de4e7a63984b5a6bbd0f422599746c9d9224 Mon Sep 17 00:00:00 2001 From: rtm516 Date: Sun, 19 Mar 2023 17:12:31 +0000 Subject: [PATCH 08/12] Update downloads api publishing steps --- .github/workflows/build.yml | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b580f4c4..bf63cb0b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -43,18 +43,25 @@ jobs: # Save the private key to a file echo "$DOWNLOADS_PRIVATE_KEY" > id_ecdsa chmod 600 id_ecdsa + + # Set the project + project=floodgate # Get the version from gradle.properties version=$(cat gradle.properties | grep -o "version=[0-9\\.]*" | cut -d"=" -f2) + + # Create the build folder + ssh -o StrictHostKeyChecking=no -i id_ecdsa $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP mkdir -p "~/uploads/$project/$GITHUB_RUN_NUMBER/" # Copy over artifacts - scp -B -o StrictHostKeyChecking=no -i id_ecdsa **/build/libs/floodgate-*.jar $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP:~/files/ + rsync -P -e "ssh -o StrictHostKeyChecking=no -i id_ecdsa" **/build/libs/floodgate-*.jar $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP:~/uploads/$project/$GITHUB_RUN_NUMBER/ # Remove un-needed artifacts - ssh -o StrictHostKeyChecking=no -i id_ecdsa $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP rm ./files/floodgate-api.jar ./files/floodgate-core.jar + ssh -o StrictHostKeyChecking=no -i id_ecdsa $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP rm ./uploads/$project/$GITHUB_RUN_NUMBER/floodgate-api.jar ./uploads/$project/$GITHUB_RUN_NUMBER/floodgate-core.jar - # Run the build script - ssh -o StrictHostKeyChecking=no -i id_ecdsa $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP ./handleBuild.sh floodgate $version $GITHUB_RUN_NUMBER $GITHUB_SHA + # Push the metadata + echo "{\"project\": \"$project\", \"version\": \"$version\", \"id\": $GITHUB_RUN_NUMBER, \"commit\": \"$GITHUB_SHA\"}" > metadata.json + rsync -P -e "ssh -o StrictHostKeyChecking=no -i id_ecdsa" metadata.json $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP:~/uploads/$project/$GITHUB_RUN_NUMBER/ - name: Notify Discord if: ${{ (success() || failure()) && github.repository == 'GeyserMC/Floodgate' }} From f0a20aa967007bf2b60528d3522b0c21379e445d Mon Sep 17 00:00:00 2001 From: Tim203 Date: Tue, 28 Mar 2023 14:41:41 +0200 Subject: [PATCH 09/12] Support changes introduced in a recent BungeeCord commit --- bungee/build.gradle.kts | 2 +- .../inject/bungee/BungeeInjector.java | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/bungee/build.gradle.kts b/bungee/build.gradle.kts index 316e91ed..f0e93a8a 100644 --- a/bungee/build.gradle.kts +++ b/bungee/build.gradle.kts @@ -1,4 +1,4 @@ -var bungeeCommit = "ff5727c" +var bungeeCommit = "dfd847f" var gsonVersion = "2.8.0" var guavaVersion = "21.0" diff --git a/bungee/src/main/java/org/geysermc/floodgate/inject/bungee/BungeeInjector.java b/bungee/src/main/java/org/geysermc/floodgate/inject/bungee/BungeeInjector.java index e6a3e964..ac39d4d0 100644 --- a/bungee/src/main/java/org/geysermc/floodgate/inject/bungee/BungeeInjector.java +++ b/bungee/src/main/java/org/geysermc/floodgate/inject/bungee/BungeeInjector.java @@ -35,6 +35,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import net.md_5.bungee.netty.PipelineUtils; import net.md_5.bungee.protocol.MinecraftEncoder; +import net.md_5.bungee.protocol.Varint21LengthFieldExtraBufPrepender; import net.md_5.bungee.protocol.Varint21LengthFieldPrepender; import org.geysermc.floodgate.api.logger.FloodgateLogger; import org.geysermc.floodgate.inject.CommonPlatformInjector; @@ -52,6 +53,16 @@ public final class BungeeInjector extends CommonPlatformInjector { public void inject() { // Can everyone just switch to Velocity please :) + // Newer Bungee versions have a separate prepender for backend and client connections + Field serverFramePrepender = + ReflectionUtils.getField(PipelineUtils.class, "serverFramePrepender"); + if (serverFramePrepender != null) { + BungeeCustomServerPrepender customServerPrepender = new BungeeCustomServerPrepender( + this, ReflectionUtils.castedStaticValue(serverFramePrepender) + ); + BungeeReflectionUtils.setFieldValue(null, serverFramePrepender, customServerPrepender); + } + Field framePrepender = ReflectionUtils.getField(PipelineUtils.class, "framePrepender"); // Required in order to inject into both Geyser <-> proxy AND proxy <-> server @@ -119,6 +130,22 @@ public final class BungeeInjector extends CommonPlatformInjector { } } + @RequiredArgsConstructor + private static final class BungeeCustomServerPrepender + extends Varint21LengthFieldExtraBufPrepender { + private final BungeeInjector injector; + private final Varint21LengthFieldExtraBufPrepender original; + + @Override + public void handlerAdded(ChannelHandlerContext ctx) throws Exception { + original.handlerAdded(ctx); + // The Minecraft encoder being in the pipeline isn't present until later + + // Proxy <-> Server + ctx.pipeline().addLast(BUNGEE_INIT, new BungeeProxyToServerInjectInitializer(injector)); + } + } + @RequiredArgsConstructor private static final class BungeeClientToProxyInjectInitializer extends ChannelInboundHandlerAdapter { From 3c0e30bff78a73a547017957732f3f1438f3b369 Mon Sep 17 00:00:00 2001 From: Tim203 Date: Fri, 31 Mar 2023 13:14:37 -0400 Subject: [PATCH 10/12] Folia support Co-Authored-By: Camotoy <20743703+Camotoy@users.noreply.github.com> --- build-logic/src/main/kotlin/Versions.kt | 2 +- settings.gradle.kts | 10 +--- spigot/build.gradle.kts | 15 +++++- .../module/SpigotPlatformModule.java | 2 +- .../pluginmessage/SpigotSkinApplier.java | 11 ++-- .../geysermc/floodgate/util/ClassNames.java | 6 +++ .../floodgate/util/SpigotCommandUtil.java | 10 ++-- .../util/SpigotVersionSpecificMethods.java | 53 ++++++++++++++----- spigot/src/main/resources/plugin.yml | 3 +- 9 files changed, 73 insertions(+), 39 deletions(-) diff --git a/build-logic/src/main/kotlin/Versions.kt b/build-logic/src/main/kotlin/Versions.kt index b501b9e2..a7d5d0ff 100644 --- a/build-logic/src/main/kotlin/Versions.kt +++ b/build-logic/src/main/kotlin/Versions.kt @@ -28,7 +28,7 @@ object Versions { const val cumulusVersion = "1.1.1" const val eventsVersion = "1.0-SNAPSHOT" const val configUtilsVersion = "1.0-SNAPSHOT" - const val spigotVersion = "1.13-R0.1-SNAPSHOT" + const val spigotVersion = "1.19.4-R0.1-SNAPSHOT" const val fastutilVersion = "8.5.3" const val guiceVersion = "5.1.0" const val nettyVersion = "4.1.49.Final" diff --git a/settings.gradle.kts b/settings.gradle.kts index 30992cbc..eee1e4e4 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -4,7 +4,7 @@ enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { -// mavenLocal() + mavenLocal() // Geyser, Cumulus etc. maven("https://repo.opencollab.dev/maven-releases") { @@ -21,13 +21,7 @@ dependencyResolutionManagement { // maven("https://repo.papermc.io/repository/maven-snapshots") { // mavenContent { snapshotsOnly() } // } - maven("https://repo.papermc.io/repository/maven-public") { - content { - includeGroupByRegex( - "(io\\.papermc\\..*|com\\.destroystokyo\\..*|com\\.velocitypowered)" - ) - } - } + maven("https://repo.papermc.io/repository/maven-public") // Spigot maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots") { mavenContent { snapshotsOnly() } diff --git a/spigot/build.gradle.kts b/spigot/build.gradle.kts index 8bd8b9c0..2a819ac0 100644 --- a/spigot/build.gradle.kts +++ b/spigot/build.gradle.kts @@ -2,12 +2,26 @@ var authlibVersion = "1.5.21" var guavaVersion = "21.0" var gsonVersion = "2.8.5" +indra { + javaVersions { + // For Folia + target(8) + minimumToolchain(17) + } +} + dependencies { api(projects.core) implementation("cloud.commandframework", "cloud-bukkit", Versions.cloudVersion) // hack to make pre 1.12 work implementation("com.google.guava", "guava", guavaVersion) + + compileOnlyApi("dev.folia", "folia-api", Versions.spigotVersion) { + attributes { + attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 17) + } + } } relocate("com.google.inject") @@ -21,7 +35,6 @@ relocate("com.google.guava") relocate("it.unimi") // these dependencies are already present on the platform -provided("com.destroystokyo.paper", "paper-api", Versions.spigotVersion) provided("com.mojang", "authlib", authlibVersion) provided("io.netty", "netty-transport", Versions.nettyVersion) provided("io.netty", "netty-codec", Versions.nettyVersion) diff --git a/spigot/src/main/java/org/geysermc/floodgate/module/SpigotPlatformModule.java b/spigot/src/main/java/org/geysermc/floodgate/module/SpigotPlatformModule.java index 0649280e..1c03dc95 100644 --- a/spigot/src/main/java/org/geysermc/floodgate/module/SpigotPlatformModule.java +++ b/spigot/src/main/java/org/geysermc/floodgate/module/SpigotPlatformModule.java @@ -86,7 +86,7 @@ public final class SpigotPlatformModule extends AbstractModule { SpigotVersionSpecificMethods versionSpecificMethods, LanguageManager languageManager) { return new SpigotCommandUtil( - languageManager, plugin.getServer(), api, versionSpecificMethods, plugin); + languageManager, plugin.getServer(), api, versionSpecificMethods); } @Provides diff --git a/spigot/src/main/java/org/geysermc/floodgate/pluginmessage/SpigotSkinApplier.java b/spigot/src/main/java/org/geysermc/floodgate/pluginmessage/SpigotSkinApplier.java index fa599f40..4caa6f00 100644 --- a/spigot/src/main/java/org/geysermc/floodgate/pluginmessage/SpigotSkinApplier.java +++ b/spigot/src/main/java/org/geysermc/floodgate/pluginmessage/SpigotSkinApplier.java @@ -33,7 +33,6 @@ import com.mojang.authlib.properties.PropertyMap; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.checkerframework.checker.nullness.qual.NonNull; -import org.geysermc.floodgate.SpigotPlugin; import org.geysermc.floodgate.api.event.skin.SkinApplyEvent; import org.geysermc.floodgate.api.event.skin.SkinApplyEvent.SkinData; import org.geysermc.floodgate.api.player.FloodgatePlayer; @@ -48,7 +47,6 @@ import org.geysermc.floodgate.util.SpigotVersionSpecificMethods; @Singleton public final class SpigotSkinApplier implements SkinApplier { @Inject private SpigotVersionSpecificMethods versionSpecificMethods; - @Inject private SpigotPlugin plugin; @Inject private EventBus eventBus; @Override @@ -62,8 +60,7 @@ public final class SpigotSkinApplier implements SkinApplier { // player is probably not logged in yet if (player == null) { if (firstTry) { - Bukkit.getScheduler().runTaskLater( - plugin, + versionSpecificMethods.schedule( () -> applySkin0(floodgatePlayer, skinData, false), 10 * 20 ); @@ -94,12 +91,10 @@ public final class SpigotSkinApplier implements SkinApplier { replaceSkin(properties, event.newSkin()); - // By running as a task, we don't run into async issues - plugin.getServer().getScheduler().runTask(plugin, () -> { + versionSpecificMethods.maybeSchedule(() -> { for (Player p : Bukkit.getOnlinePlayers()) { if (!p.equals(player) && p.canSee(player)) { - versionSpecificMethods.hidePlayer(p, player); - versionSpecificMethods.showPlayer(p, player); + versionSpecificMethods.hideAndShowPlayer(p, player); } } }); diff --git a/spigot/src/main/java/org/geysermc/floodgate/util/ClassNames.java b/spigot/src/main/java/org/geysermc/floodgate/util/ClassNames.java index 1ca5105a..d4ec2b16 100644 --- a/spigot/src/main/java/org/geysermc/floodgate/util/ClassNames.java +++ b/spigot/src/main/java/org/geysermc/floodgate/util/ClassNames.java @@ -78,6 +78,8 @@ public class ClassNames { public static final Field BUNGEE; + public static final boolean IS_FOLIA; + static { String version = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; SPIGOT_MAPPING_PREFIX = "net.minecraft.server." + version; @@ -223,6 +225,10 @@ public class ClassNames { PAPER_VELOCITY_SUPPORT = null; } } + + IS_FOLIA = ReflectionUtils.getClass( + "io.papermc.paper.threadedregions.scheduler.EntityScheduler" + ) != null; } private static T checkNotNull(@CheckForNull T toCheck, @CheckForNull String objectName) { diff --git a/spigot/src/main/java/org/geysermc/floodgate/util/SpigotCommandUtil.java b/spigot/src/main/java/org/geysermc/floodgate/util/SpigotCommandUtil.java index da3d65bc..4950309d 100644 --- a/spigot/src/main/java/org/geysermc/floodgate/util/SpigotCommandUtil.java +++ b/spigot/src/main/java/org/geysermc/floodgate/util/SpigotCommandUtil.java @@ -27,11 +27,9 @@ package org.geysermc.floodgate.util; import java.util.Collection; import java.util.UUID; -import org.bukkit.Bukkit; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.plugin.java.JavaPlugin; import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.floodgate.api.FloodgateApi; import org.geysermc.floodgate.platform.command.CommandUtil; @@ -42,19 +40,17 @@ import org.geysermc.floodgate.player.UserAudience.PlayerAudience; public final class SpigotCommandUtil extends CommandUtil { private final Server server; private final SpigotVersionSpecificMethods versionSpecificMethods; - private final JavaPlugin plugin; private UserAudience console; public SpigotCommandUtil( LanguageManager manager, Server server, FloodgateApi api, - SpigotVersionSpecificMethods versionSpecificMethods, - JavaPlugin plugin) { + SpigotVersionSpecificMethods versionSpecificMethods + ) { super(manager, api); this.server = server; this.versionSpecificMethods = versionSpecificMethods; - this.plugin = plugin; } @Override @@ -120,7 +116,7 @@ public final class SpigotCommandUtil extends CommandUtil { public void kickPlayer(Object player, String message) { // can also be console if (player instanceof Player) { - Bukkit.getScheduler().runTask(plugin, () -> ((Player) player).kickPlayer(message)); + versionSpecificMethods.schedule(() -> ((Player) player).kickPlayer(message), 0); } } diff --git a/spigot/src/main/java/org/geysermc/floodgate/util/SpigotVersionSpecificMethods.java b/spigot/src/main/java/org/geysermc/floodgate/util/SpigotVersionSpecificMethods.java index f8e67616..e0dfcb2d 100644 --- a/spigot/src/main/java/org/geysermc/floodgate/util/SpigotVersionSpecificMethods.java +++ b/spigot/src/main/java/org/geysermc/floodgate/util/SpigotVersionSpecificMethods.java @@ -25,16 +25,21 @@ package org.geysermc.floodgate.util; +import java.lang.reflect.Method; +import java.util.concurrent.TimeUnit; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import org.geysermc.floodgate.SpigotPlugin; public final class SpigotVersionSpecificMethods { - private static final boolean NEW_GET_LOCALE; + private static final Method GET_SPIGOT; + private static final Method OLD_GET_LOCALE; private static final boolean NEW_VISIBILITY; static { - NEW_GET_LOCALE = ReflectionUtils.getMethod(Player.class, "getLocale") != null; + GET_SPIGOT = ReflectionUtils.getMethod(Player.class, "spigot"); + OLD_GET_LOCALE = ReflectionUtils.getMethod(Player.Spigot.class, "getLocale"); + NEW_VISIBILITY = null != ReflectionUtils.getMethod( Player.class, "hidePlayer", Plugin.class, Player.class @@ -48,27 +53,51 @@ public final class SpigotVersionSpecificMethods { } public String getLocale(Player player) { - if (NEW_GET_LOCALE) { + if (OLD_GET_LOCALE == null) { return player.getLocale(); } - return player.spigot().getLocale(); + Object spigot = ReflectionUtils.invoke(player, GET_SPIGOT); + return ReflectionUtils.castedInvoke(spigot, OLD_GET_LOCALE); + } + + public void hideAndShowPlayer(Player on, Player target) { + // In Folia we don't have to schedule this as there is no concept of a single main thread. + // Instead, we have to schedule the task per player. + if (ClassNames.IS_FOLIA) { + on.getScheduler().execute(plugin, () -> hideAndShowPlayer0(on, target), null, 0); + return; + } + hideAndShowPlayer0(on, target); + } + + public void schedule(Runnable runnable, long delay) { + if (ClassNames.IS_FOLIA) { + plugin.getServer().getAsyncScheduler().runDelayed( + plugin, $ -> runnable.run(), delay * 50, TimeUnit.MILLISECONDS + ); + return; + } + plugin.getServer().getScheduler().runTaskLater(plugin, runnable, delay); } @SuppressWarnings("deprecation") - public void hidePlayer(Player hideFor, Player playerToHide) { + private void hideAndShowPlayer0(Player source, Player target) { if (NEW_VISIBILITY) { - hideFor.hidePlayer(plugin, playerToHide); + source.hidePlayer(plugin, target); + source.showPlayer(plugin, target); return; } - hideFor.hidePlayer(playerToHide); + source.hidePlayer(target); + source.showPlayer(target); } - @SuppressWarnings("deprecation") - public void showPlayer(Player showFor, Player playerToShow) { - if (NEW_VISIBILITY) { - showFor.showPlayer(plugin, playerToShow); + public void maybeSchedule(Runnable runnable) { + // In Folia we don't have to schedule this as there is no concept of a single main thread. + // Instead, we have to schedule the task per player. + if (ClassNames.IS_FOLIA) { + runnable.run(); return; } - showFor.showPlayer(playerToShow); + plugin.getServer().getScheduler().runTask(plugin, runnable); } } diff --git a/spigot/src/main/resources/plugin.yml b/spigot/src/main/resources/plugin.yml index c9a5d232..0c9fe9f1 100644 --- a/spigot/src/main/resources/plugin.yml +++ b/spigot/src/main/resources/plugin.yml @@ -4,4 +4,5 @@ version: ${version} author: ${author} website: ${url} main: org.geysermc.floodgate.SpigotPlugin -api-version: 1.13 \ No newline at end of file +api-version: 1.13 +folia-supported: true \ No newline at end of file From 104cbdd51bf511a152395d212c6ceb4eda12c1d9 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Fri, 31 Mar 2023 13:28:18 -0400 Subject: [PATCH 11/12] Use Java 17 to compile --- .github/workflows/build.yml | 2 +- .github/workflows/pullrequest.yml | 4 ++-- Jenkinsfile | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bf63cb0b..a53a65eb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/setup-java@v3 with: - java-version: 8 + java-version: 17 distribution: temurin - name: Build diff --git a/.github/workflows/pullrequest.yml b/.github/workflows/pullrequest.yml index 4edc17e3..016ad98d 100644 --- a/.github/workflows/pullrequest.yml +++ b/.github/workflows/pullrequest.yml @@ -10,11 +10,11 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set up JDK 1.8 + - name: Set up JDK 17 uses: actions/setup-java@v2 with: distribution: 'temurin' - java-version: '8' + java-version: '17' cache: 'gradle' - name: Build with Maven diff --git a/Jenkinsfile b/Jenkinsfile index 58099d91..f9dbc474 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -2,7 +2,7 @@ pipeline { agent any tools { gradle 'Gradle 7' - jdk 'Java 8' + jdk 'Java 17' } options { buildDiscarder(logRotator(artifactNumToKeepStr: '5')) From 2702bc3e832318c8fdcb4d73416151ce36968eed Mon Sep 17 00:00:00 2001 From: byteful <80184082+byteful@users.noreply.github.com> Date: Fri, 31 Mar 2023 15:44:17 -0500 Subject: [PATCH 12/12] Check IS_FOLIA silently (#400) --- .../src/main/java/org/geysermc/floodgate/util/ClassNames.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spigot/src/main/java/org/geysermc/floodgate/util/ClassNames.java b/spigot/src/main/java/org/geysermc/floodgate/util/ClassNames.java index d4ec2b16..364eb7e7 100644 --- a/spigot/src/main/java/org/geysermc/floodgate/util/ClassNames.java +++ b/spigot/src/main/java/org/geysermc/floodgate/util/ClassNames.java @@ -226,7 +226,7 @@ public class ClassNames { } } - IS_FOLIA = ReflectionUtils.getClass( + IS_FOLIA = ReflectionUtils.getClassSilently( "io.papermc.paper.threadedregions.scheduler.EntityScheduler" ) != null; }