diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fcfb3ae..8e2302e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,7 +12,7 @@ jobs: strategy: matrix: - java-version: [8, 11, 17] + java-version: [ 17 ] steps: - name: Checkout repository @@ -44,3 +44,9 @@ jobs: with: name: AzLink-Legacy path: universal-legacy/build/libs/AzLink-Legacy-*.jar + + - name: Upload AzLink-Fabric.jar + uses: actions/upload-artifact@v3 + with: + name: AzLink-Fabric + path: fabric/build/libs/AzLink-Fabric-*.jar diff --git a/README.md b/README.md index 676802c..019b526 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ This plugin currently supports the following platforms: * [Sponge](https://www.spongepowered.org/) * [Velocity](https://velocitypowered.com/) * [Nukkit](https://cloudburstmc.org/articles/) +* [FabricMC](https://fabricmc.net/) ## Setup diff --git a/build.gradle b/build.gradle index 8efeed6..faab46f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ allprojects { group 'com.azuriom' - version '1.2.1' + version '1.3.0' } subprojects { diff --git a/bukkit/src/main/java/com/azuriom/azlink/bukkit/integrations/AuthMeIntegration.java b/bukkit/src/main/java/com/azuriom/azlink/bukkit/integrations/AuthMeIntegration.java index 5cb8a24..a02ccc2 100644 --- a/bukkit/src/main/java/com/azuriom/azlink/bukkit/integrations/AuthMeIntegration.java +++ b/bukkit/src/main/java/com/azuriom/azlink/bukkit/integrations/AuthMeIntegration.java @@ -32,7 +32,7 @@ public AuthMeIntegration(AzLinkBukkitPlugin plugin) { this.plugin.getLoggerAdapter().info("AuthMe integration enabled."); - this.plugin.getServer().getScheduler().runTask(this.plugin, () -> { + this.plugin.getPlugin().getScheduler().executeSync(() -> { try { Field field = AuthMeApi.class.getDeclaredField("dataSource"); field.setAccessible(true); diff --git a/bungee/src/main/java/com/azuriom/azlink/bungee/BungeeSchedulerAdapter.java b/bungee/src/main/java/com/azuriom/azlink/bungee/BungeeSchedulerAdapter.java index ed0ac72..3b69a20 100644 --- a/bungee/src/main/java/com/azuriom/azlink/bungee/BungeeSchedulerAdapter.java +++ b/bungee/src/main/java/com/azuriom/azlink/bungee/BungeeSchedulerAdapter.java @@ -38,7 +38,7 @@ public Executor asyncExecutor() { } @Override - public CancellableTask executeAsyncLater(Runnable runnable, long delay, TimeUnit unit) { + public CancellableTask scheduleAsyncLater(Runnable runnable, long delay, TimeUnit unit) { ScheduledTask task = this.plugin.getProxy() .getScheduler() .schedule(this.plugin, runnable, delay, unit); @@ -47,7 +47,7 @@ public CancellableTask executeAsyncLater(Runnable runnable, long delay, TimeUnit } @Override - public CancellableTask executeAsyncRepeating(Runnable runnable, long delay, long interval, TimeUnit unit) { + public CancellableTask scheduleAsyncRepeating(Runnable runnable, long delay, long interval, TimeUnit unit) { ScheduledTask task = this.plugin.getProxy() .getScheduler() .schedule(this.plugin, runnable, delay, interval, unit); diff --git a/common/src/main/java/com/azuriom/azlink/common/AzLinkPlugin.java b/common/src/main/java/com/azuriom/azlink/common/AzLinkPlugin.java index d24d72e..533d74b 100644 --- a/common/src/main/java/com/azuriom/azlink/common/AzLinkPlugin.java +++ b/common/src/main/java/com/azuriom/azlink/common/AzLinkPlugin.java @@ -81,7 +81,7 @@ public void init() { long startDelay = Duration.between(LocalDateTime.now(), start).toMillis(); long repeatDelay = TimeUnit.MINUTES.toMillis(1); - getScheduler().executeAsyncRepeating(this.fetcherTask, startDelay, repeatDelay, TimeUnit.MILLISECONDS); + getScheduler().scheduleAsyncRepeating(this.fetcherTask, startDelay, repeatDelay, TimeUnit.MILLISECONDS); if (!this.config.isValid()) { getLogger().warn("Invalid configuration, please use '/azlink' to setup the plugin."); diff --git a/common/src/main/java/com/azuriom/azlink/common/command/AzLinkCommand.java b/common/src/main/java/com/azuriom/azlink/common/command/AzLinkCommand.java index d7dccff..ee3d7be 100644 --- a/common/src/main/java/com/azuriom/azlink/common/command/AzLinkCommand.java +++ b/common/src/main/java/com/azuriom/azlink/common/command/AzLinkCommand.java @@ -16,7 +16,7 @@ public class AzLinkCommand { private static final List COMPLETIONS = Arrays.asList("status", "setup", "fetch", "money", "port"); private static final List MONEY_ACTIONS = Arrays.asList("add", "remove", "set"); - private final AzLinkPlugin plugin; + protected final AzLinkPlugin plugin; public AzLinkCommand(AzLinkPlugin plugin) { this.plugin = plugin; diff --git a/common/src/main/java/com/azuriom/azlink/common/platform/PlatformType.java b/common/src/main/java/com/azuriom/azlink/common/platform/PlatformType.java index b648e2a..401ab5b 100644 --- a/common/src/main/java/com/azuriom/azlink/common/platform/PlatformType.java +++ b/common/src/main/java/com/azuriom/azlink/common/platform/PlatformType.java @@ -6,6 +6,7 @@ public enum PlatformType { BUNGEE("BungeeCord"), SPONGE("Sponge"), VELOCITY("Velocity"), + FABRIC("Fabric"), NUKKIT("Nukkit"); private final String name; diff --git a/common/src/main/java/com/azuriom/azlink/common/scheduler/JavaSchedulerAdapter.java b/common/src/main/java/com/azuriom/azlink/common/scheduler/JavaSchedulerAdapter.java index 8592d44..64da2cc 100644 --- a/common/src/main/java/com/azuriom/azlink/common/scheduler/JavaSchedulerAdapter.java +++ b/common/src/main/java/com/azuriom/azlink/common/scheduler/JavaSchedulerAdapter.java @@ -12,10 +12,16 @@ public class JavaSchedulerAdapter implements SchedulerAdapter { private final Executor syncExecutor; private final Executor asyncExecutor; + public JavaSchedulerAdapter(Executor syncExecutor) { + this(createScheduler(), syncExecutor); + } + public JavaSchedulerAdapter(Executor syncExecutor, Executor asyncExecutor) { - this(Executors.newSingleThreadScheduledExecutor(new ThreadFactoryBuilder() - .name("azlink-scheduler") - .daemon()), syncExecutor, asyncExecutor); + this(createScheduler(), syncExecutor, asyncExecutor); + } + + public JavaSchedulerAdapter(ScheduledExecutorService scheduler, Executor syncExecutor) { + this(scheduler, syncExecutor, scheduler); } public JavaSchedulerAdapter(ScheduledExecutorService scheduler, Executor syncExecutor, Executor asyncExecutor) { @@ -35,12 +41,12 @@ public Executor asyncExecutor() { } @Override - public CancellableTask executeAsyncLater(Runnable runnable, long delay, TimeUnit unit) { + public CancellableTask scheduleAsyncLater(Runnable runnable, long delay, TimeUnit unit) { return new CancellableFuture(this.scheduler.schedule(runnable, delay, unit)); } @Override - public CancellableTask executeAsyncRepeating(Runnable runnable, long delay, long interval, TimeUnit unit) { + public CancellableTask scheduleAsyncRepeating(Runnable runnable, long delay, long interval, TimeUnit unit) { return new CancellableFuture(this.scheduler.scheduleAtFixedRate(runnable, delay, interval, unit)); } @@ -51,6 +57,12 @@ public void shutdown() throws Exception { this.scheduler.awaitTermination(5, TimeUnit.SECONDS); } + private static ScheduledExecutorService createScheduler() { + return Executors.newSingleThreadScheduledExecutor(new ThreadFactoryBuilder() + .name("azlink-scheduler") + .daemon()); + } + private static class CancellableFuture implements CancellableTask { private final Future future; diff --git a/common/src/main/java/com/azuriom/azlink/common/scheduler/SchedulerAdapter.java b/common/src/main/java/com/azuriom/azlink/common/scheduler/SchedulerAdapter.java index 8964ce5..e6688cd 100644 --- a/common/src/main/java/com/azuriom/azlink/common/scheduler/SchedulerAdapter.java +++ b/common/src/main/java/com/azuriom/azlink/common/scheduler/SchedulerAdapter.java @@ -17,9 +17,9 @@ default void executeAsync(Runnable runnable) { Executor asyncExecutor(); - CancellableTask executeAsyncLater(Runnable runnable, long delay, TimeUnit unit); + CancellableTask scheduleAsyncLater(Runnable runnable, long delay, TimeUnit unit); - CancellableTask executeAsyncRepeating(Runnable runnable, long delay, long interval, TimeUnit unit); + CancellableTask scheduleAsyncRepeating(Runnable runnable, long delay, long interval, TimeUnit unit); default void shutdown() throws Exception { diff --git a/fabric/build.gradle b/fabric/build.gradle new file mode 100644 index 0000000..767fd83 --- /dev/null +++ b/fabric/build.gradle @@ -0,0 +1,57 @@ +plugins { + id 'fabric-loom' version '1.1-SNAPSHOT' + id 'com.github.johnrengelman.shadow' version '8.1.1' +} + +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 + +ext { + minecraft_version = '1.20' + yarn_mappings = '1.20+build.1' + loader_version = '0.14.21' + fabric_version = '0.83.0+1.20' +} + +repositories { + maven { url 'https://repo.spongepowered.org/repository/maven-public/' } +} + +dependencies { + implementation project(':azlink-common') + implementation 'net.kyori:adventure-api:4.12.0' + implementation 'net.kyori:adventure-text-serializer-gson:4.12.0' + implementation 'net.kyori:adventure-text-serializer-legacy:4.12.0' + minecraft "com.mojang:minecraft:${project.ext.minecraft_version}" + mappings "net.fabricmc:yarn:${project.ext.yarn_mappings}:v2" + modImplementation "net.fabricmc:fabric-loader:${project.ext.loader_version}" + modImplementation "net.fabricmc.fabric-api:fabric-api:${project.ext.fabric_version}" +} + +processResources { + filesMatching('**/*.json') { + expand 'version': project.version + } +} + +shadowJar { + dependencies { + exclude 'net.fabricmc:.*' + include dependency('com.azuriom:.*') + include dependency('net.kyori:.*') + } + + relocate 'net.kyori', 'com.azuriom.azlink.libs' +} + +remapJar { + dependsOn tasks.shadowJar + mustRunAfter tasks.shadowJar + inputFile = shadowJar.archiveFile + addNestedDependencies = true + archiveFileName = "AzLink-Fabric-${project.version}-${project.ext.minecraft_version}.jar" +} + +artifacts { + archives remapJar +} diff --git a/fabric/src/main/java/com/azuriom/azlink/fabric/AzLinkFabricMod.java b/fabric/src/main/java/com/azuriom/azlink/fabric/AzLinkFabricMod.java new file mode 100644 index 0000000..771b153 --- /dev/null +++ b/fabric/src/main/java/com/azuriom/azlink/fabric/AzLinkFabricMod.java @@ -0,0 +1,152 @@ +package com.azuriom.azlink.fabric; + +import com.azuriom.azlink.common.AzLinkPlatform; +import com.azuriom.azlink.common.AzLinkPlugin; +import com.azuriom.azlink.common.command.CommandSender; +import com.azuriom.azlink.common.data.WorldData; +import com.azuriom.azlink.common.logger.LoggerAdapter; +import com.azuriom.azlink.common.logger.Slf4jLoggerAdapter; +import com.azuriom.azlink.common.platform.PlatformInfo; +import com.azuriom.azlink.common.platform.PlatformType; +import com.azuriom.azlink.common.scheduler.JavaSchedulerAdapter; +import com.azuriom.azlink.common.scheduler.SchedulerAdapter; +import com.azuriom.azlink.common.tasks.TpsTask; +import com.azuriom.azlink.fabric.command.FabricCommandExecutor; +import com.azuriom.azlink.fabric.command.FabricPlayer; +import com.google.common.collect.Iterables; +import com.google.common.collect.Streams; +import net.fabricmc.api.DedicatedServerModInitializer; +import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; +import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.loader.api.ModContainer; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.command.ServerCommandSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.nio.file.Path; +import java.util.Optional; +import java.util.stream.Stream; + +public final class AzLinkFabricMod implements AzLinkPlatform, DedicatedServerModInitializer { + + private static final Logger LOGGER = LoggerFactory.getLogger("azlink"); + + private final LoggerAdapter logger = new Slf4jLoggerAdapter(LOGGER); + private final TpsTask tpsTask = new TpsTask(); + + private final ModContainer modContainer; + private final AzLinkPlugin plugin; + private SchedulerAdapter scheduler; + + public AzLinkFabricMod() { + this.modContainer = FabricLoader.getInstance() + .getModContainer("azlink") + .orElseThrow(() -> new RuntimeException("Unable to get the mod container.")); + this.plugin = new AzLinkPlugin(this); + } + + @Override + public void onInitializeServer() { + var command = new FabricCommandExecutor<>(this.plugin); + + ServerLifecycleEvents.SERVER_STARTING.register(this::onServerStart); + ServerLifecycleEvents.SERVER_STOPPING.register(this::onServerStop); + ServerTickEvents.START_SERVER_TICK.register(s -> this.tpsTask.run()); + + CommandRegistrationCallback.EVENT + .register((dispatcher, registry, env) -> command.register(dispatcher)); + } + + public void onServerStart(MinecraftServer server) { + this.scheduler = this.initScheduler(); + this.plugin.init(); + } + + public void onServerStop(MinecraftServer server) { + if (this.plugin != null) { + this.plugin.shutdown(); + } + } + + @Override + public AzLinkPlugin getPlugin() { + return this.plugin; + } + + @Override + public LoggerAdapter getLoggerAdapter() { + return this.logger; + } + + @Override + public SchedulerAdapter getSchedulerAdapter() { + return this.scheduler; + } + + @Override + public PlatformType getPlatformType() { + return PlatformType.FABRIC; + } + + @Override + public PlatformInfo getPlatformInfo() { + return FabricLoader.getInstance() + .getModContainer("fabric") + .map(ModContainer::getMetadata) + .map(m -> new PlatformInfo(m.getName(), m.getVersion().getFriendlyString())) + .orElse(new PlatformInfo("unknown", "unknown")); + } + + @Override + public String getPluginVersion() { + return this.modContainer.getMetadata().getVersion().getFriendlyString(); + } + + @Override + public Path getDataDirectory() { + return FabricLoader.getInstance().getConfigDir().resolve("AzLink"); + } + + @Override + public Optional getWorldData() { + int loadedChunks = Streams.stream(getServer().getWorlds()) + .mapToInt(w -> w.getChunkManager().getLoadedChunkCount()) + .sum(); + int entities = Streams.stream(getServer().getWorlds()) + .mapToInt(w -> Iterables.size(w.iterateEntities())) + .sum(); + + return Optional.of(new WorldData(this.tpsTask.getTps(), loadedChunks, entities)); + } + + @Override + public Stream getOnlinePlayers() { + return getServer().getPlayerManager() + .getPlayerList() + .stream() + .map(FabricPlayer::new); + } + + @Override + public void dispatchConsoleCommand(String command) { + ServerCommandSource source = getServer().getCommandSource(); + getServer().getCommandManager().executeWithPrefix(source, command); + } + + @Override + public int getMaxPlayers() { + return getServer().getMaxPlayerCount(); + } + + private SchedulerAdapter initScheduler() { + return new JavaSchedulerAdapter(getServer()::executeSync); + } + + @SuppressWarnings("deprecation") + private MinecraftServer getServer() { + return (MinecraftServer) FabricLoader.getInstance().getGameInstance(); + } +} diff --git a/fabric/src/main/java/com/azuriom/azlink/fabric/command/FabricCommandExecutor.java b/fabric/src/main/java/com/azuriom/azlink/fabric/command/FabricCommandExecutor.java new file mode 100644 index 0000000..567c0ca --- /dev/null +++ b/fabric/src/main/java/com/azuriom/azlink/fabric/command/FabricCommandExecutor.java @@ -0,0 +1,72 @@ +package com.azuriom.azlink.fabric.command; + +import com.azuriom.azlink.common.AzLinkPlugin; +import com.azuriom.azlink.common.command.AzLinkCommand; +import com.mojang.brigadier.Command; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.builder.RequiredArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.suggestion.SuggestionProvider; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import net.minecraft.server.command.ServerCommandSource; + +import java.util.concurrent.CompletableFuture; + +public class FabricCommandExecutor + extends AzLinkCommand implements Command, SuggestionProvider { + + public FabricCommandExecutor(AzLinkPlugin plugin) { + super(plugin); + } + + @Override + public int run(CommandContext context) { + try { + String args = getArguments(context); + FabricCommandSource source = new FabricCommandSource(context.getSource()); + + this.execute(source, args.split(" ", -1)); + } catch (Exception e) { + this.plugin.getLogger().error("An error occurred while executing command", e); + } + + return Command.SINGLE_SUCCESS; + } + + @Override + public CompletableFuture getSuggestions(CommandContext context, SuggestionsBuilder builder) { + try { + String args = getArguments(context); + FabricCommandSource source = new FabricCommandSource(context.getSource()); + + this.tabComplete(source, args.split(" ", -1)).forEach(builder::suggest); + } catch (Exception e) { + this.plugin.getLogger().error("An error occurred while getting suggestions", e); + } + + return builder.buildFuture(); + } + + public void register(CommandDispatcher dispatcher) { + LiteralArgumentBuilder command = LiteralArgumentBuilder.literal("azlink") + .then(RequiredArgumentBuilder + .argument("args", StringArgumentType.greedyString()) + .executes(this) + .suggests(this) + ) + .executes(this); + + dispatcher.register(command); + } + + private String getArguments(CommandContext context) { + try { + return context.getArgument("args", String.class); + } catch (IllegalArgumentException e) { + return ""; + } + } +} diff --git a/fabric/src/main/java/com/azuriom/azlink/fabric/command/FabricCommandSource.java b/fabric/src/main/java/com/azuriom/azlink/fabric/command/FabricCommandSource.java new file mode 100644 index 0000000..9c316b5 --- /dev/null +++ b/fabric/src/main/java/com/azuriom/azlink/fabric/command/FabricCommandSource.java @@ -0,0 +1,40 @@ +package com.azuriom.azlink.fabric.command; + +import com.azuriom.azlink.common.command.CommandSender; +import net.minecraft.entity.Entity; +import net.minecraft.server.command.ServerCommandSource; + +import java.util.UUID; + +public class FabricCommandSource implements CommandSender { + + private final ServerCommandSource source; + + public FabricCommandSource(ServerCommandSource source) { + this.source = source; + } + + @Override + public String getName() { + return this.source.getName(); + } + + @Override + public UUID getUuid() { + Entity entity = this.source.getEntity(); + + return entity != null + ? entity.getUuid() + : UUID.nameUUIDFromBytes(this.source.getName().getBytes()); + } + + @Override + public void sendMessage(String message) { + this.source.sendMessage(TextAdapter.toText(message)); + } + + @Override + public boolean hasPermission(String permission) { + return this.source.hasPermissionLevel(3); + } +} diff --git a/fabric/src/main/java/com/azuriom/azlink/fabric/command/FabricPlayer.java b/fabric/src/main/java/com/azuriom/azlink/fabric/command/FabricPlayer.java new file mode 100644 index 0000000..a92b9df --- /dev/null +++ b/fabric/src/main/java/com/azuriom/azlink/fabric/command/FabricPlayer.java @@ -0,0 +1,35 @@ +package com.azuriom.azlink.fabric.command; + +import com.azuriom.azlink.common.command.CommandSender; +import net.minecraft.server.network.ServerPlayerEntity; + +import java.util.UUID; + +public class FabricPlayer implements CommandSender { + + private final ServerPlayerEntity player; + + public FabricPlayer(ServerPlayerEntity player) { + this.player = player; + } + + @Override + public String getName() { + return this.player.getName().getString(); + } + + @Override + public UUID getUuid() { + return this.player.getUuid(); + } + + @Override + public void sendMessage(String message) { + this.player.sendMessage(TextAdapter.toText(message)); + } + + @Override + public boolean hasPermission(String permission) { + return this.player.hasPermissionLevel(3); + } +} diff --git a/fabric/src/main/java/com/azuriom/azlink/fabric/command/TextAdapter.java b/fabric/src/main/java/com/azuriom/azlink/fabric/command/TextAdapter.java new file mode 100644 index 0000000..064472b --- /dev/null +++ b/fabric/src/main/java/com/azuriom/azlink/fabric/command/TextAdapter.java @@ -0,0 +1,25 @@ +package com.azuriom.azlink.fabric.command; + +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import net.minecraft.text.Text; + +public final class TextAdapter { + + private static final LegacyComponentSerializer LEGACY_SERIALIZER = LegacyComponentSerializer.builder() + .character('&') + .extractUrls() + .build(); + + private TextAdapter() { + throw new UnsupportedOperationException(); + } + + public static Text toText(String message) { + TextComponent component = LEGACY_SERIALIZER.deserialize(message); + String json = GsonComponentSerializer.gson().serialize(component); + + return Text.Serializer.fromJson(json); + } +} diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..9195451 --- /dev/null +++ b/fabric/src/main/resources/fabric.mod.json @@ -0,0 +1,27 @@ +{ + "schemaVersion": 1, + "id": "azlink", + "version": "${version}", + "name": "AzLink", + "description": "The mod to link your Azuriom website with your Fabric server.", + "authors": [ + "Azuriom" + ], + "contact": { + "homepage": "https://azuriom.com/", + "sources": "https://github.com/Azuriom/AzLink" + }, + "license": "MIT", + "environment": "server", + "entrypoints": { + "server": [ + "com.azuriom.azlink.fabric.AzLinkFabricMod" + ] + }, + "mixins": [], + "depends": { + "fabricloader": ">=0.14.11", + "fabric-api": "*", + "minecraft": "~1.20" + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..4687f10 --- /dev/null +++ b/gradle.properties @@ -0,0 +1 @@ +org.gradle.jvmargs=-Xmx2G diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180..249e583 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ae04661..fae0804 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 3da45c1..a69d9cb 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright ? 2015-2021 the original authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -32,10 +32,10 @@ # Busybox and similar reduced shells will NOT work, because this script # requires all of these POSIX shell features: # * functions; -# * expansions ?$var?, ?${var}?, ?${var:-default}?, ?${var+SET}?, -# ?${var#prefix}?, ?${var%suffix}?, and ?$( cmd )?; -# * compound commands having a testable exit status, especially ?case?; -# * various built-in commands including ?command?, ?set?, and ?ulimit?. +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». # # Important for patching: # @@ -205,6 +205,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat index 107acd3..f127cfd 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,7 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +75,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/settings.gradle b/settings.gradle index cb114c3..1463179 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,6 +1,30 @@ +pluginManagement { + repositories { + maven { + name = 'Fabric' + url = 'https://maven.fabricmc.net/' + } + mavenCentral() + gradlePluginPortal() + } +} + rootProject.name = 'azlink' -['common', 'bukkit', 'bungee', 'sponge', 'sponge-legacy', 'velocity', 'nukkit', 'universal', 'universal-legacy'].each { +def modules = [ + 'common', + 'bukkit', + 'bungee', + 'sponge', + 'sponge-legacy', + 'velocity', + 'nukkit', + 'fabric', + 'universal', + 'universal-legacy', +] + +modules.each { include ":azlink-${it}" project(":azlink-${it}").projectDir = file(it) } diff --git a/sponge-legacy/build.gradle b/sponge-legacy/build.gradle index da8cbba..01a0f7f 100644 --- a/sponge-legacy/build.gradle +++ b/sponge-legacy/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'net.kyori.blossom' version '1.3.0' + id 'net.kyori.blossom' version '1.3.1' } repositories { diff --git a/universal-legacy/build.gradle b/universal-legacy/build.gradle index aed45d5..d7468a9 100644 --- a/universal-legacy/build.gradle +++ b/universal-legacy/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'com.github.johnrengelman.shadow' version '7.1.2' + id 'com.github.johnrengelman.shadow' version '8.1.1' } dependencies { diff --git a/universal/build.gradle b/universal/build.gradle index b87dc91..b79d924 100644 --- a/universal/build.gradle +++ b/universal/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'com.github.johnrengelman.shadow' version '7.1.2' + id 'com.github.johnrengelman.shadow' version '8.1.1' } dependencies { diff --git a/velocity/build.gradle b/velocity/build.gradle index 7335636..61fdb45 100644 --- a/velocity/build.gradle +++ b/velocity/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'net.kyori.blossom' version '1.3.0' + id 'net.kyori.blossom' version '1.3.1' } repositories { diff --git a/velocity/src/main/java/com/azuriom/azlink/velocity/VelocitySchedulerAdapter.java b/velocity/src/main/java/com/azuriom/azlink/velocity/VelocitySchedulerAdapter.java index 3842e59..42d036c 100644 --- a/velocity/src/main/java/com/azuriom/azlink/velocity/VelocitySchedulerAdapter.java +++ b/velocity/src/main/java/com/azuriom/azlink/velocity/VelocitySchedulerAdapter.java @@ -38,7 +38,7 @@ public Executor asyncExecutor() { } @Override - public CancellableTask executeAsyncLater(Runnable runnable, long delay, TimeUnit unit) { + public CancellableTask scheduleAsyncLater(Runnable runnable, long delay, TimeUnit unit) { ScheduledTask task = this.plugin.getProxy().getScheduler() .buildTask(this.plugin, runnable) .delay(delay, unit) @@ -48,7 +48,7 @@ public CancellableTask executeAsyncLater(Runnable runnable, long delay, TimeUnit } @Override - public CancellableTask executeAsyncRepeating(Runnable runnable, long delay, long interval, TimeUnit unit) { + public CancellableTask scheduleAsyncRepeating(Runnable runnable, long delay, long interval, TimeUnit unit) { ScheduledTask task = this.plugin.getProxy().getScheduler() .buildTask(this.plugin, runnable) .delay(delay, unit)