diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bbb023..0e5d1cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2111.1.0] + +### Changed +* Ported to Minecraft 1.21.11 + ## [2101.1.3] ### Added diff --git a/build.gradle b/build.gradle index c04dc67..d8f2d23 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.7-SNAPSHOT" apply false - id "me.modmuss50.mod-publish-plugin" version "0.5.1" + id "dev.architectury.loom" version "1.13-SNAPSHOT" apply false + id "me.modmuss50.mod-publish-plugin" version "1.1.0" } apply from: 'https://raw.githubusercontent.com/FTBTeam/mods-meta/main/gradle/changelog.gradle' diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/FTBRanksCommands.java b/common/src/main/java/dev/ftb/mods/ftbranks/FTBRanksCommands.java index 8505193..23901dd 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/FTBRanksCommands.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/FTBRanksCommands.java @@ -1,6 +1,5 @@ package dev.ftb.mods.ftbranks; -import com.mojang.authlib.GameProfile; import com.mojang.brigadier.Command; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.IntegerArgumentType; @@ -23,15 +22,18 @@ import net.minecraft.commands.arguments.GameProfileArgument; import net.minecraft.nbt.StringTag; import net.minecraft.network.chat.ClickEvent; -import net.minecraft.network.chat.ClickEvent.Action; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.HoverEvent; import net.minecraft.network.chat.Style; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.permissions.Permissions; +import net.minecraft.server.players.NameAndId; +import org.jspecify.annotations.Nullable; import java.io.IOException; import java.util.Collection; import java.util.Collections; +import java.util.Objects; import java.util.concurrent.CompletableFuture; public class FTBRanksCommands { @@ -39,11 +41,11 @@ public class FTBRanksCommands { (object) -> Component.literal("Unknown rank: " + object.toString()) ); - public static void register(CommandDispatcher dispatcher, CommandBuildContext commandBuildContext, Commands.CommandSelection selection) { + public static void register(CommandDispatcher dispatcher, CommandBuildContext ignoredContext, Commands.CommandSelection ignoredSelection) { // source.getServer() *can* return null: https://github.com/FTBTeam/FTB-Mods-Issues/issues/766 //noinspection ConstantValue dispatcher.register(Commands.literal("ftbranks") - .requires(source -> source.getServer() != null && source.getServer().isSingleplayer() || source.hasPermission(2)) + .requires(source -> source.getServer() != null && source.getServer().isSingleplayer() || source.permissions().hasPermission(Permissions.COMMANDS_GAMEMASTER)) .then(Commands.literal("reload") .executes(context -> reloadRanks(context.getSource())) ) @@ -140,16 +142,9 @@ private static CompletableFuture suggestRanks(SuggestionsBuilder bu return SharedSuggestionProvider.suggest(FTBRanksAPI.manager().getAllRanks().stream().map(Rank::getId), builder); } - private static String normalizeRankName(String name) { - return name.toLowerCase() - .replace("+", "_plus") - .replaceAll("[^a-z0-9_]", "_") - .replaceAll("_{2,}", "_"); - } - private static int reloadRanks(CommandSourceStack source) { try { - FTBRanksAPIImpl.manager.reload(); + Objects.requireNonNull(FTBRanksAPIImpl.manager).reload(); source.sendSuccess(() -> Component.literal("Ranks reloaded from disk!"), true); for (ServerPlayer p : source.getServer().getPlayerList().getPlayers()) { @@ -166,7 +161,7 @@ private static int reloadRanks(CommandSourceStack source) { private static int refreshReadme(CommandSourceStack source) { try { - FTBRanksAPIImpl.manager.refreshReadme(); + Objects.requireNonNull(FTBRanksAPIImpl.manager).refreshReadme(); } catch (IOException ex) { ex.printStackTrace(); } @@ -180,8 +175,8 @@ private static Component makeRankNameClicky(Rank rank) { return Component.literal(rank.getName()) .withStyle(isDef ? ChatFormatting.AQUA : ChatFormatting.YELLOW) .withStyle(Style.EMPTY - .withClickEvent(new ClickEvent(Action.RUN_COMMAND, "/ftbranks show_rank " + rank.getId())) - .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, isDef ? + .withClickEvent(new ClickEvent.RunCommand("/ftbranks show_rank " + rank.getId())) + .withHoverEvent(new HoverEvent.ShowText(isDef ? Component.literal("Players must be explicitly added to this rank\nwith '/ftbranks add " + rank.getId() + "'").withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC) : Component.literal("Rank condition: " + rank.getCondition().asString()).withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC)) ) @@ -191,7 +186,7 @@ private static Component makeRankNameClicky(Rank rank) { private static int listAllRanks(CommandSourceStack source) { source.sendSuccess(() -> Component.literal("Ranks:"), false); - for (Rank rank : FTBRanksAPIImpl.manager.getAllRanks()) { + for (Rank rank : Objects.requireNonNull(FTBRanksAPIImpl.manager).getAllRanks()) { source.sendSuccess(() -> Component.literal("- ").append(makeRankNameClicky(rank)), false); } @@ -211,28 +206,30 @@ private static int createRank(CommandSourceStack source, String name, int power) private static int deleteRank(CommandSourceStack source, String rankName) throws CommandSyntaxException { Rank rank = getRank(rankName); - FTBRanksAPI.manager().deleteRank(rank.getId()); - source.sendSuccess(() -> Component.literal("Rank '" + rank.getName() + "' deleted!"), false); + if (FTBRanksAPI.manager().deleteRank(rank.getId()) != null) { + source.sendSuccess(() -> Component.literal("Rank '" + rank.getName() + "' deleted!"), false); - return Command.SINGLE_SUCCESS; + return Command.SINGLE_SUCCESS; + } + return 0; } - private static int addRank(CommandSourceStack source, Collection players, String rankName) throws CommandSyntaxException { + private static int addRank(CommandSourceStack source, Collection players, String rankName) throws CommandSyntaxException { Rank rank = getRank(rankName); - for (GameProfile profile : players) { + for (NameAndId profile : players) { if (rank.add(profile)) { - source.sendSuccess(() -> Component.literal(String.format("Player %s added to rank '%s'!", profile.getName(), rank.getName())), false); + source.sendSuccess(() -> Component.literal(String.format("Player %s added to rank '%s'!", profile.name(), rank.getName())), false); } } return Command.SINGLE_SUCCESS; } - private static int removeRank(CommandSourceStack source, Collection players, String rankName) throws CommandSyntaxException { + private static int removeRank(CommandSourceStack source, Collection players, String rankName) throws CommandSyntaxException { Rank rank = getRank(rankName); - for (GameProfile profile : players) { + for (NameAndId profile : players) { if (rank.remove(profile)) { - source.sendSuccess(() -> Component.literal(String.format("Player %s removed from rank '%s'!", profile.getName(), rank.getName())), false); + source.sendSuccess(() -> Component.literal(String.format("Player %s removed from rank '%s'!", profile.name(), rank.getName())), false); } } @@ -240,9 +237,9 @@ private static int removeRank(CommandSourceStack source, Collection } private static int listRanksOf(CommandSourceStack source, ServerPlayer player) { - source.sendSuccess(() -> Component.literal(String.format("Ranks added to player '%s':", player.getGameProfile().getName())), false); + source.sendSuccess(() -> Component.literal(String.format("Ranks added to player '%s':", player.getGameProfile().name())), false); - for (Rank rank : FTBRanksAPIImpl.manager.getAllRanks()) { + for (Rank rank : Objects.requireNonNull(FTBRanksAPIImpl.manager).getAllRanks()) { if (rank.isActive(player)) { source.sendSuccess(() -> Component.literal("- ").append(makeRankNameClicky(rank)), false); } @@ -274,16 +271,16 @@ private static int listNodes(CommandSourceStack source, String rankName) throws } else { source.sendSuccess(() -> Component.literal(String.format("%d permission node(s) in rank '%s':", nodes.size(), rankName)).withStyle(ChatFormatting.GREEN), false); source.sendSuccess(() -> Component.literal("-".repeat(20)).withStyle(ChatFormatting.GREEN), false); - nodes.forEach(node -> { - source.sendSuccess(() -> Component.literal(String.format("%s = %s", node, rank.getPermission(node))).withStyle(ChatFormatting.YELLOW), false); - }); + nodes.forEach(node -> + source.sendSuccess(() -> Component.literal(String.format("%s = %s", node, rank.getPermission(node))).withStyle(ChatFormatting.YELLOW), false) + ); source.sendSuccess(() -> Component.literal("-".repeat(20)).withStyle(ChatFormatting.GREEN), false); } return Command.SINGLE_SUCCESS; } - private static int setNode(CommandSourceStack source, String rankName, String node, String value) throws CommandSyntaxException { + private static int setNode(CommandSourceStack source, String rankName, String node, @Nullable String value) throws CommandSyntaxException { Rank rank = getRank(rankName); try { diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/PlayerNameFormatting.java b/common/src/main/java/dev/ftb/mods/ftbranks/PlayerNameFormatting.java index e487f55..b91b0ab 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/PlayerNameFormatting.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/PlayerNameFormatting.java @@ -26,7 +26,7 @@ public static Component formatPlayerName(Player player, Component originalName) FTBRanks.LOGGER.error(s); return Component.literal("BrokenFormatting").withStyle(Style.EMPTY .withColor(ChatFormatting.RED) - .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal(s))) + .withHoverEvent(new HoverEvent.ShowText(Component.literal(s))) ); } } else { diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/api/FTBRanksAPI.java b/common/src/main/java/dev/ftb/mods/ftbranks/api/FTBRanksAPI.java index c80802c..6a17c39 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/api/FTBRanksAPI.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/api/FTBRanksAPI.java @@ -2,13 +2,15 @@ import net.minecraft.server.level.ServerPlayer; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; + +import java.util.Objects; /** * Top-level API object */ public abstract class FTBRanksAPI { + @Nullable private static FTBRanksAPI instance; /** @@ -16,15 +18,16 @@ public abstract class FTBRanksAPI { * @return the API */ public static FTBRanksAPI getInstance() { - return instance; + return Objects.requireNonNull(instance); } /** * Convenience method to get the Ranks Manager instance * @return the manager + * @throws NullPointerException if called before the Minecraft server has started */ public static RankManager manager() { - return instance.getManager(); + return getInstance().getManager(); } /** @@ -35,9 +38,8 @@ public static RankManager manager() { * @param node the node to check * @return the permission value, or {@link PermissionValue#MISSING} if the node is not found */ - @NotNull public static PermissionValue getPermissionValue(ServerPlayer player, String node) { - return instance.getManager().getPermissionValue(player, node); + return manager().getPermissionValue(player, node); } /** @@ -62,9 +64,6 @@ public static void setup(FTBRanksAPI theInstance) { instance = theInstance; } - /** - * Get the manager - * @return the manager - */ + @ApiStatus.Internal protected abstract RankManager getManager(); } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/api/PermissionValue.java b/common/src/main/java/dev/ftb/mods/ftbranks/api/PermissionValue.java index 680003e..da353d0 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/api/PermissionValue.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/api/PermissionValue.java @@ -1,6 +1,7 @@ package dev.ftb.mods.ftbranks.api; import net.minecraft.server.level.ServerPlayer; +import org.jspecify.annotations.Nullable; import java.util.Optional; import java.util.OptionalDouble; @@ -110,7 +111,8 @@ default OptionalDouble asDouble() { /** * See {@link FTBRanksAPI#parsePermissionValue(String)} */ - static PermissionValue parse(String str) { + @Nullable + static PermissionValue parse(@Nullable String str) { return FTBRanksAPI.getInstance().parsePermissionValue(str); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/api/Rank.java b/common/src/main/java/dev/ftb/mods/ftbranks/api/Rank.java index 03778c8..280b98d 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/api/Rank.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/api/Rank.java @@ -1,8 +1,7 @@ package dev.ftb.mods.ftbranks.api; -import com.mojang.authlib.GameProfile; import net.minecraft.server.level.ServerPlayer; -import org.jetbrains.annotations.NotNull; +import net.minecraft.server.players.NameAndId; import org.jetbrains.annotations.Nullable; import java.util.Collection; @@ -57,7 +56,6 @@ public interface Rank { * @param node the node name * @return the permission value */ - @NotNull PermissionValue getPermission(String node); /** @@ -92,24 +90,24 @@ default boolean isActive(ServerPlayer player) { * @return true if the player has been added, false otherwise */ default boolean isAdded(ServerPlayer player) { - return getManager().getAddedRanks(player.getGameProfile()).contains(this); + return getManager().getAddedRanks(player.nameAndId()).contains(this); } /** - * Add the given player game profile to this rank. + * Add the given player to this rank. * - * @param profile the game profile - * @return true if the profile was added, false it was already present + * @param nameAndId the player's name and ID + * @return true if the player was added, false it was already present */ - boolean add(GameProfile profile); + boolean add(NameAndId nameAndId); /** - * Remove the given player game profile from this rank. + * Remove the given player from this rank. * - * @param profile the game profile - * @return true if the profile was removed, false if it was not present + * @param nameAndId the player's name and ID + * @return true if the player was removed, false if it was not present */ - boolean remove(GameProfile profile); + boolean remove(NameAndId nameAndId); /** * Get all the permission node names which have been defined for this rank. diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/api/RankManager.java b/common/src/main/java/dev/ftb/mods/ftbranks/api/RankManager.java index b847caf..6cc9860 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/api/RankManager.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/api/RankManager.java @@ -1,11 +1,10 @@ package dev.ftb.mods.ftbranks.api; -import com.mojang.authlib.GameProfile; import net.minecraft.nbt.Tag; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import net.minecraft.server.players.NameAndId; +import org.jspecify.annotations.Nullable; import java.util.Collection; import java.util.List; @@ -32,18 +31,6 @@ public interface RankManager { */ Optional getRank(String id); - /** - * Create a new rank with the given ID, name & power. - * - * @param id the unique rank ID - * @param displayName rank display name - * @param power rank power - * @return the newly-created rank - * @deprecated use {@link #createRank(String, int, boolean)} - */ - @Deprecated - Rank createRank(String id, String displayName, int power); - /** * Create a new rank with the given name & power. A canonical rank ID is derived from the name, by * converting to lower case, then substituting the "+" symbol with "_plus" and all other non-alphanumeric characters @@ -52,7 +39,7 @@ public interface RankManager { * * @param displayName rank display name * @param power rank power - * @param forceCreate if true, any existing rank is replaced; if false, an exception is thrown if a rank exists + * @param forceCreate if true, any existing rank is replaced (and a warning is logged); if false, an exception is thrown if a rank exists * @return the newly-created rank * @throws RankException if {@code forceCreate} is false and a rank with the same canonical ID already exists */ @@ -68,16 +55,16 @@ public interface RankManager { Rank deleteRank(String id); /** - * Get all the ranks to which the given game profile has been specifically added. + * Get all the ranks to which the given player has been specifically added. * - * @param profile the game profile to check - * @return the ranks to which the profile has been added + * @param nameAndId the player's name and ID to check + * @return the ranks to which the player has been added */ - Set getAddedRanks(GameProfile profile); + Set getAddedRanks(NameAndId nameAndId); /** * Get a list of the ranks which currently apply to the given player. Note this is distinct from the result of - * {@link #getAddedRanks(GameProfile)}, since it can include any ranks which implicitly apply to the player. + * {@link #getAddedRanks(NameAndId)}, since it can include any ranks which implicitly apply to the player. * * @param player the player * @return a list of ranks @@ -109,7 +96,6 @@ default List getRanks(ServerPlayer player) { * @param node the node name * @return the permission value */ - @NotNull PermissionValue getPermissionValue(ServerPlayer player, String node); /** diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/api/event/PermissionNodeChangedEvent.java b/common/src/main/java/dev/ftb/mods/ftbranks/api/event/PermissionNodeChangedEvent.java index a43d2c3..6ab1737 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/api/event/PermissionNodeChangedEvent.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/api/event/PermissionNodeChangedEvent.java @@ -3,14 +3,16 @@ import dev.ftb.mods.ftbranks.api.PermissionValue; import dev.ftb.mods.ftbranks.api.Rank; import dev.ftb.mods.ftbranks.api.RankManager; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Fired when the value of a permission node in a rank changes, via the {@code /ftbranks node} command. */ public class PermissionNodeChangedEvent extends RankEvent { private final String node; + @Nullable private final PermissionValue oldValue; + @Nullable private final PermissionValue newValue; public PermissionNodeChangedEvent(RankManager manager, Rank rank, String node, @Nullable PermissionValue oldValue, @Nullable PermissionValue newValue) { @@ -28,6 +30,7 @@ public String getNode() { * Get the node's old value * @return the old value */ + @Nullable public PermissionValue getOldValue() { return oldValue; } @@ -36,6 +39,7 @@ public PermissionValue getOldValue() { * Get the node's new value * @return the new value */ + @Nullable public PermissionValue getNewValue() { return newValue; } diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/api/event/PlayerAddedToRankEvent.java b/common/src/main/java/dev/ftb/mods/ftbranks/api/event/PlayerAddedToRankEvent.java index 1b5e728..6b3ff40 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/api/event/PlayerAddedToRankEvent.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/api/event/PlayerAddedToRankEvent.java @@ -1,14 +1,14 @@ package dev.ftb.mods.ftbranks.api.event; -import com.mojang.authlib.GameProfile; import dev.ftb.mods.ftbranks.api.Rank; import dev.ftb.mods.ftbranks.api.RankManager; +import net.minecraft.server.players.NameAndId; /** * Fired when a player is added to a rank, with the {@code /ftbranks add} command. */ public class PlayerAddedToRankEvent extends RankEvent.Player { - public PlayerAddedToRankEvent(RankManager manager, Rank rank, GameProfile player) { + public PlayerAddedToRankEvent(RankManager manager, Rank rank, NameAndId player) { super(manager, rank, player); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/api/event/PlayerRemovedFromRankEvent.java b/common/src/main/java/dev/ftb/mods/ftbranks/api/event/PlayerRemovedFromRankEvent.java index 70e71dc..a3eb13f 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/api/event/PlayerRemovedFromRankEvent.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/api/event/PlayerRemovedFromRankEvent.java @@ -1,14 +1,14 @@ package dev.ftb.mods.ftbranks.api.event; -import com.mojang.authlib.GameProfile; import dev.ftb.mods.ftbranks.api.Rank; import dev.ftb.mods.ftbranks.impl.RankManagerImpl; +import net.minecraft.server.players.NameAndId; /** * Fired when a player is removed from a rank, with the {@code /ftbranks remove} command. */ public class PlayerRemovedFromRankEvent extends RankEvent.Player { - public PlayerRemovedFromRankEvent(RankManagerImpl manager, Rank rank, GameProfile player) { + public PlayerRemovedFromRankEvent(RankManagerImpl manager, Rank rank, NameAndId player) { super(manager, rank, player); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/api/event/RankEvent.java b/common/src/main/java/dev/ftb/mods/ftbranks/api/event/RankEvent.java index c25c3d0..e7f9837 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/api/event/RankEvent.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/api/event/RankEvent.java @@ -1,12 +1,11 @@ package dev.ftb.mods.ftbranks.api.event; -import com.mojang.authlib.GameProfile; import dev.architectury.event.Event; import dev.architectury.event.EventFactory; import dev.ftb.mods.ftbranks.api.Rank; import dev.ftb.mods.ftbranks.api.RankManager; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import net.minecraft.server.players.NameAndId; +import org.jspecify.annotations.Nullable; import java.util.function.Consumer; @@ -24,9 +23,10 @@ public class RankEvent { public static final Event> REGISTER_CONDITIONS = EventFactory.createConsumerLoop(); private final RankManager manager; + @Nullable private final Rank rank; - public RankEvent(RankManager manager, Rank rank) { + public RankEvent(RankManager manager, @Nullable Rank rank) { this.manager = manager; this.rank = rank; } @@ -35,7 +35,6 @@ public RankEvent(RankManager manager, Rank rank) { * Get the rank manager * @return the rank manager */ - @NotNull public RankManager getManager() { return manager; } @@ -53,19 +52,18 @@ public Rank getRank() { * Common superclass for rank events with a player involved */ public static class Player extends RankEvent { - private final GameProfile player; + private final NameAndId player; - public Player(RankManager manager, Rank rank, GameProfile player) { + public Player(RankManager manager, Rank rank, NameAndId player) { super(manager, rank); this.player = player; } /** - * Get the player's game profile. Not that the player is not necessarily online at this time. - * @return the player's game profile + * Get the player's name and ID. Note that the player is not necessarily online at this time. + * @return the player's name and ID */ - @NotNull - public GameProfile getPlayer() { + public NameAndId getPlayer() { return player; } } diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/api/event/package-info.java b/common/src/main/java/dev/ftb/mods/ftbranks/api/event/package-info.java new file mode 100644 index 0000000..08e11e4 --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftbranks/api/event/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftbranks.api.event; + +import org.jspecify.annotations.NullMarked; diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/api/package-info.java b/common/src/main/java/dev/ftb/mods/ftbranks/api/package-info.java new file mode 100644 index 0000000..7750171 --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftbranks/api/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftbranks.api; + +import org.jspecify.annotations.NullMarked; diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/core/mixin/CommandsMixin.java b/common/src/main/java/dev/ftb/mods/ftbranks/core/mixin/CommandsMixin.java index ef289e7..a465dde 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/core/mixin/CommandsMixin.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/core/mixin/CommandsMixin.java @@ -12,6 +12,6 @@ public class CommandsMixin { @Inject(method = "", at = @At("RETURN")) private void initFTBR(Commands.CommandSelection commandSelection, CommandBuildContext commandBuildContext, CallbackInfo ci) { - FTBRanksCommandManager.INSTANCE = new FTBRanksCommandManager((Commands) (Object) this); + FTBRanksCommandManager.init((Commands) (Object) this); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/impl/FTBRanksAPIImpl.java b/common/src/main/java/dev/ftb/mods/ftbranks/impl/FTBRanksAPIImpl.java index 6e39e68..242c984 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/impl/FTBRanksAPIImpl.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/impl/FTBRanksAPIImpl.java @@ -1,8 +1,8 @@ package dev.ftb.mods.ftbranks.impl; +import dev.ftb.mods.ftbranks.FTBRanks; import dev.ftb.mods.ftbranks.api.FTBRanksAPI; import dev.ftb.mods.ftbranks.api.PermissionValue; -import dev.ftb.mods.ftbranks.api.RankManager; import dev.ftb.mods.ftbranks.api.event.RankEvent; import dev.ftb.mods.ftbranks.api.event.RegisterConditionsEvent; import dev.ftb.mods.ftbranks.impl.condition.*; @@ -12,17 +12,23 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; import org.apache.commons.lang3.math.NumberUtils; +import org.jspecify.annotations.Nullable; + +import java.io.IOException; +import java.util.Objects; public class FTBRanksAPIImpl extends FTBRanksAPI { + @Nullable public static RankManagerImpl manager; @Override - protected RankManager getManager() { - return manager; + protected RankManagerImpl getManager() { + return Objects.requireNonNull(manager); } @Override - public PermissionValue parsePermissionValue(String str) { + @Nullable + public PermissionValue parsePermissionValue(@Nullable String str) { if (str == null) { return null; } else if (str.startsWith("\"") && str.endsWith("\"")) { @@ -42,19 +48,21 @@ public static void serverStarting(MinecraftServer server) { RankEvent.REGISTER_CONDITIONS.invoker().accept(new RegisterConditionsEvent((id, factory) -> manager.registerCondition(id, factory))); } - public static void serverStarted(MinecraftServer server) { - try { - manager.load(); - } catch (Exception ex) { - ex.printStackTrace(); + public static void serverStarted(MinecraftServer ignoredServer) { + if (manager != null) { + try { + manager.load(); + } catch (IOException ex) { + FTBRanks.LOGGER.error("failed to load ranks data: {} / {}", ex.getClass().getName(), ex.getMessage()); + } } } - public static void serverStopped(MinecraftServer server) { + public static void serverStopped(MinecraftServer ignoredServer) { manager = null; } - public static void worldSaved(ServerLevel event) { + public static void worldSaved(ServerLevel ignoredEvent) { if (manager != null) { manager.saveRanksNow(); manager.savePlayersNow(); @@ -62,7 +70,7 @@ public static void worldSaved(ServerLevel event) { } public static void registerConditions(RegisterConditionsEvent event) { - event.register("always_active", (rank, json) -> AlwaysActiveCondition.INSTANCE); + event.register("always_active", (rank, tag) -> AlwaysActiveCondition.INSTANCE); event.register("rank_added", RankAddedCondition::new); event.register("rank_applies", RankAppliesCondition::new); diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/impl/FTBRanksCommandManager.java b/common/src/main/java/dev/ftb/mods/ftbranks/impl/FTBRanksCommandManager.java index b921158..d09e817 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/impl/FTBRanksCommandManager.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/impl/FTBRanksCommandManager.java @@ -5,18 +5,21 @@ import dev.ftb.mods.ftbranks.FTBRanks; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Field; import java.util.HashMap; +import java.util.List; import java.util.Map; public class FTBRanksCommandManager { - public static FTBRanksCommandManager INSTANCE; + @Nullable + private static FTBRanksCommandManager INSTANCE; public final Map commandMap; public final Map, RankCommandPredicate> commandNodes; - public FTBRanksCommandManager(Commands commands) { + private FTBRanksCommandManager(Commands commands) { commandMap = new HashMap<>(); commandNodes = new HashMap<>(); @@ -32,7 +35,22 @@ public FTBRanksCommandManager(Commands commands) { FTBRanks.LOGGER.error("Reflection failed! Downgrading Java version to 8 might help"); } - FTBRanks.LOGGER.info("Loaded " + this.commandMap.size() + " command nodes"); + FTBRanks.LOGGER.info("Loaded {} command nodes", this.commandMap.size()); + } + + public static void init(Commands commands) { + INSTANCE = new FTBRanksCommandManager(commands); + } + + public static List allNodes() { + if (INSTANCE == null) { + return List.of("ERROR: command manager not initialised?)"); + } + return INSTANCE.commandMap.values().stream() + .map(RankCommandPredicate::getNodeName) + .distinct() + .sorted() + .toList(); } private void getCommandNodes(CommandDispatcher dispatcher, String perm, Field field, CommandNode node) throws Exception { diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/impl/PlayerRankData.java b/common/src/main/java/dev/ftb/mods/ftbranks/impl/PlayerRankData.java index bc8fa18..15799ab 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/impl/PlayerRankData.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/impl/PlayerRankData.java @@ -4,7 +4,6 @@ import dev.ftb.mods.ftbranks.api.PermissionValue; import dev.ftb.mods.ftbranks.api.Rank; import dev.ftb.mods.ftbranks.api.RankException; -import org.jetbrains.annotations.NotNull; import java.time.Instant; import java.time.format.DateTimeParseException; @@ -63,7 +62,6 @@ public int hashCode() { return Objects.hash(playerId); } - @NotNull public PermissionValue getPermission(String node) { return permissions.getOrDefault(node, PermissionValue.MISSING); } @@ -92,22 +90,22 @@ SNBTCompoundTag writeSNBT() { } static PlayerRankData fromSNBT(RankManagerImpl manager, UUID playerId, SNBTCompoundTag tag, Map tempRanks) { - PlayerRankData data = new PlayerRankData(manager, playerId, tag.getString("name")); + PlayerRankData data = new PlayerRankData(manager, playerId, tag.getStringOr("name", "")); - SNBTCompoundTag ranksTag = tag.getCompound("ranks"); - for (String rankKey : ranksTag.getAllKeys()) { + SNBTCompoundTag ranksTag = tag.getAsSnbtComponent("ranks"); + for (String rankKey : ranksTag.keySet()) { RankImpl rank = tempRanks.get(rankKey); if (rank != null) { try { - data.added.put(rank, Instant.parse(ranksTag.getString(rankKey))); + data.added.put(rank, Instant.parse(ranksTag.getStringOr(rankKey, ""))); } catch (DateTimeParseException e) { throw new RankException(e.getMessage()); } } } - SNBTCompoundTag permTag = tag.getCompound("permissions"); - for (String permKey : permTag.getAllKeys()) { + SNBTCompoundTag permTag = tag.getAsSnbtComponent("permissions"); + for (String permKey : permTag.keySet()) { while (permKey.endsWith(".*")) { permKey = permKey.substring(0, permKey.length() - 2); manager.markPlayerDataDirty(); @@ -119,4 +117,4 @@ static PlayerRankData fromSNBT(RankManagerImpl manager, UUID playerId, SNBTCompo return data; } -} \ No newline at end of file +} diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/impl/RankCommandPredicate.java b/common/src/main/java/dev/ftb/mods/ftbranks/impl/RankCommandPredicate.java index eb72f33..e09de52 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/impl/RankCommandPredicate.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/impl/RankCommandPredicate.java @@ -4,6 +4,7 @@ import dev.ftb.mods.ftbranks.api.FTBRanksAPI; import net.minecraft.commands.CommandSourceStack; import net.minecraft.server.level.ServerPlayer; +import org.jspecify.annotations.Nullable; import java.util.function.Predicate; import java.util.function.Supplier; @@ -12,6 +13,7 @@ public class RankCommandPredicate implements Predicate { private final Predicate original; private final String nodeName; + @Nullable private Supplier redirect; public RankCommandPredicate(CommandNode commandNode, String nodeName) { @@ -21,7 +23,7 @@ public RankCommandPredicate(CommandNode commandNode, String } public String getNodeName() { - return redirect == null || redirect.get() == null ? nodeName : redirect.get().getNodeName(); + return redirect == null ? nodeName : redirect.get().getNodeName(); } public void setRedirect(Supplier redirect) { @@ -30,7 +32,7 @@ public void setRedirect(Supplier redirect) { @Override public boolean test(CommandSourceStack source) { - if (source.getEntity() instanceof ServerPlayer sp && FTBRanksAPI.manager() != null) { + if (source.getEntity() instanceof ServerPlayer sp) { return FTBRanksAPI.getPermissionValue(sp, getNodeName()).asBoolean().orElseGet(() -> original.test(source)); } diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/impl/RankImpl.java b/common/src/main/java/dev/ftb/mods/ftbranks/impl/RankImpl.java index c4a88b3..2ce37c3 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/impl/RankImpl.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/impl/RankImpl.java @@ -1,13 +1,13 @@ package dev.ftb.mods.ftbranks.impl; -import com.mojang.authlib.GameProfile; import dev.ftb.mods.ftblibrary.snbt.SNBTCompoundTag; import dev.ftb.mods.ftbranks.PlayerNameFormatting; import dev.ftb.mods.ftbranks.api.*; import dev.ftb.mods.ftbranks.api.event.*; import dev.ftb.mods.ftbranks.impl.condition.AlwaysActiveCondition; import dev.ftb.mods.ftbranks.impl.condition.DefaultCondition; -import org.jetbrains.annotations.NotNull; +import net.minecraft.server.players.NameAndId; +import org.jspecify.annotations.Nullable; import java.util.*; @@ -20,10 +20,9 @@ public class RankImpl implements Rank, Comparable { private final String name; private final int power; private final RankFileSource source; - @NotNull private RankCondition condition; - public static RankImpl create(RankManagerImpl manager, String id, String name, int power, @NotNull RankCondition condition, RankFileSource source) { + public static RankImpl create(RankManagerImpl manager, String id, String name, int power, RankCondition condition, RankFileSource source) { return new RankImpl(manager, id, name, power, condition, source); } @@ -33,7 +32,7 @@ public static RankImpl create(RankManagerImpl manager, String id, String name, i return rank; } - private RankImpl(RankManagerImpl manager, String id, String name, int power, @NotNull RankCondition condition, RankFileSource source) { + private RankImpl(RankManagerImpl manager, String id, String name, int power, RankCondition condition, RankFileSource source) { this.manager = manager; this.id = id; this.name = name; @@ -78,7 +77,7 @@ public int getPower() { } @Override - public void setPermission(String node, PermissionValue value) { + public void setPermission(String node, @Nullable PermissionValue value) { if (node.equals("condition")) { throw new IllegalArgumentException("use '/ftbranks condition' to set conditions"); } @@ -99,13 +98,11 @@ public void setPermission(String node, PermissionValue value) { } @Override - @NotNull public PermissionValue getPermission(String node) { return permissions.getOrDefault(node, PermissionValue.MISSING); } @Override - @NotNull public RankCondition getCondition() { return condition; } @@ -120,9 +117,9 @@ public void setCondition(RankCondition newCondition) { } @Override - public boolean add(GameProfile profile) { - if (manager.getOrCreatePlayerData(profile).addRank(this)) { - RankEvent.ADD_PLAYER.invoker().accept(new PlayerAddedToRankEvent(manager, this, profile)); + public boolean add(NameAndId nameAndId) { + if (manager.getOrCreatePlayerData(nameAndId).addRank(this)) { + RankEvent.ADD_PLAYER.invoker().accept(new PlayerAddedToRankEvent(manager, this, nameAndId)); PlayerNameFormatting.refreshPlayerNames(); return true; } @@ -131,10 +128,10 @@ public boolean add(GameProfile profile) { } @Override - public boolean remove(GameProfile profile) { - if (manager.getOrCreatePlayerData(profile).removeRank(this)) { + public boolean remove(NameAndId nameAndId) { + if (manager.getOrCreatePlayerData(nameAndId).removeRank(this)) { manager.markPlayerDataDirty(); - RankEvent.REMOVE_PLAYER.invoker().accept(new PlayerRemovedFromRankEvent(manager,this, profile)); + RankEvent.REMOVE_PLAYER.invoker().accept(new PlayerRemovedFromRankEvent(manager,this, nameAndId)); PlayerNameFormatting.refreshPlayerNames(); return true; } @@ -155,14 +152,14 @@ public Collection getPermissions() { } public static RankImpl readSNBT(RankManagerImpl manager, String rankId, SNBTCompoundTag tag, RankFileSource source) throws RankException { - String displayName = tag.getString("name").isEmpty() ? rankId : tag.getString("name"); - RankImpl rank = create(manager, rankId, displayName, tag.getInt("power"), source); + String displayName = tag.getStringOr("name", rankId); + RankImpl rank = create(manager, rankId, displayName, tag.getIntOr("power", 0), source); // TODO: A default of 0 might not be ideal if (tag.contains("condition")) { rank.setCondition(manager.createCondition(rank, tag.get("condition"))); } - for (String key : tag.getAllKeys()) { + for (String key : tag.keySet()) { if (!SPECIAL_FIELDS.contains(key)) { while (key.endsWith(".*")) { key = key.substring(0, key.length() - 2); @@ -203,4 +200,4 @@ public SNBTCompoundTag writeSNBT() { public RankFileSource getSource() { return source; } -} \ No newline at end of file +} diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/impl/RankManagerImpl.java b/common/src/main/java/dev/ftb/mods/ftbranks/impl/RankManagerImpl.java index 9bc9289..cad1ecf 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/impl/RankManagerImpl.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/impl/RankManagerImpl.java @@ -1,9 +1,8 @@ package dev.ftb.mods.ftbranks.impl; -import com.mojang.authlib.GameProfile; +import dev.ftb.mods.ftblibrary.config.ConfigUtil; import dev.ftb.mods.ftblibrary.snbt.SNBT; import dev.ftb.mods.ftblibrary.snbt.SNBTCompoundTag; -import dev.ftb.mods.ftblibrary.snbt.config.ConfigUtil; import dev.ftb.mods.ftbranks.FTBRanks; import dev.ftb.mods.ftbranks.PlayerNameFormatting; import dev.ftb.mods.ftbranks.api.*; @@ -22,8 +21,8 @@ import net.minecraft.nbt.Tag; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.players.NameAndId; import net.minecraft.world.level.storage.LevelResource; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.IOException; @@ -33,6 +32,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; +import static dev.ftb.mods.ftbranks.FTBRanks.LOGGER; import static dev.ftb.mods.ftbranks.FTBRanks.MOD_ID; public class RankManagerImpl implements RankManager { @@ -44,13 +44,13 @@ public class RankManagerImpl implements RankManager { private final Path rankFile; private final Path playerFile; - private boolean shouldSaveRanks; + private boolean shouldSaveRanks; private boolean shouldSavePlayers; - private Map ranks; + private Map ranks = new HashMap<>(); private final List sortedRanks = new ArrayList<>(); private final Map conditions = new ConcurrentHashMap<>(); - private Map playerData; + private Map playerData = new HashMap<>(); public RankManagerImpl(MinecraftServer server) { this.server = server; @@ -78,17 +78,14 @@ public Optional getRank(String id) { return Optional.ofNullable(ranks.get(id)); } - @Override - public Rank createRank(String id, String displayName, int power) { - return createRank(displayName, power, false); - } - @Override public RankImpl createRank(String name, int power, boolean forceCreate) { String id = normalizeRankName(name); if (forceCreate) { - deleteRank(id); + if (deleteRank(id) != null) { + LOGGER.warn("forcibly overwriting existing rank {}", name); + } } else if (ranks.containsKey(id)) { throw new RankException("Rank '" + id + "' already exists"); } @@ -132,19 +129,19 @@ public RankImpl deleteRank(String id) { } @Override - public Set getAddedRanks(GameProfile profile) { - return getOrCreatePlayerData(profile).addedRanks(); + public Set getAddedRanks(NameAndId nameAndId) { + return getOrCreatePlayerData(nameAndId).addedRanks(); } @Override public RankCondition createCondition(Rank rank, @Nullable Tag tag) throws RankException { SNBTCompoundTag compoundTag = new SNBTCompoundTag(); if (tag instanceof StringTag) { - compoundTag.putString("type", tag.getAsString()); + compoundTag.putString("type", tag.asString().orElseThrow()); } else if (tag instanceof SNBTCompoundTag c) { compoundTag = c; } - String key = compoundTag.getString("type"); + String key = compoundTag.getStringOr("type", ""); if (!conditions.containsKey(key)) { throw new IllegalArgumentException("Can't create condition from tag: '" + tag + "'"); } @@ -152,7 +149,6 @@ public RankCondition createCondition(Rank rank, @Nullable Tag tag) throws RankEx } @Override - @NotNull public PermissionValue getPermissionValue(ServerPlayer player, String node) { if (node.isEmpty() || sortedRanks.isEmpty()) { return PermissionValue.MISSING; @@ -160,10 +156,9 @@ public PermissionValue getPermissionValue(ServerPlayer player, String node) { try { List list = sortedRanks.stream().filter(rank -> rank.isActive(player)).collect(Collectors.toList()); - return getPermissionValue(getOrCreatePlayerData(player.getGameProfile()), list, node); + return getPermissionValue(getOrCreatePlayerData(player.nameAndId()), list, node); } catch (Exception ex) { - FTBRanks.LOGGER.error("Error getting permission value for node " + node + "!"); - ex.printStackTrace(); + FTBRanks.LOGGER.error("Error getting permission value for node {}! {} / {}", node, ex.getClass().getName(), ex.getMessage()); } return PermissionValue.MISSING; @@ -195,7 +190,7 @@ private PermissionValue getPermissionValue(PlayerRankData data, List ranks return i == -1 ? PermissionValue.MISSING : getPermissionValue(data, ranks, node.substring(0, i)); } - public void reload() throws Exception { + public void reload() throws IOException { shouldSaveRanks = false; if (Files.notExists(rankFile)) { @@ -219,16 +214,12 @@ public void reload() throws Exception { } Map tempPlayerData = new LinkedHashMap<>(); - SNBTCompoundTag playerFileTag = SNBT.read(playerFile); - if (playerFileTag != null) { - for (String key : playerFileTag.getAllKeys()) { - SNBTCompoundTag o = playerFileTag.getCompound(key); - UUID id = UUID.fromString(key); - PlayerRankData data = PlayerRankData.fromSNBT(this, id, o, tempRanks); - tempPlayerData.put(id, data); - } - } else { - throw new RuntimeException("players.snbt failed to load! check your server log for errors"); + SNBTCompoundTag playerFileTag = SNBT.tryRead(playerFile); + for (String key : playerFileTag.keySet()) { + SNBTCompoundTag o = playerFileTag.getAsSnbtComponent(key); + UUID id = UUID.fromString(key); + PlayerRankData data = PlayerRankData.fromSNBT(this, id, o, tempRanks); + tempPlayerData.put(id, data); } ranks = new LinkedHashMap<>(tempRanks); @@ -240,29 +231,25 @@ public void reload() throws Exception { PlayerNameFormatting.refreshPlayerNames(); - FTBRanks.LOGGER.info("Loaded {} ranks", ranks.size()); + FTBRanks.LOGGER.info("Loaded {} ranks", ranks.size()); } - private void readRankFile(RankFileSource source, Map rankMap) { + private void readRankFile(RankFileSource source, Map rankMap) throws IOException { Path inputFile = source.getPath(server); - SNBTCompoundTag rankFileTag = SNBT.read(inputFile); - if (rankFileTag != null) { - int size = rankMap.size(); - for (String rankId : rankFileTag.getAllKeys()) { - try { - RankImpl rank = RankImpl.readSNBT(this, rankId, rankFileTag.getCompound(rankId), source); - if (rankMap.putIfAbsent(rank.getId(), rank) != null) { - FTBRanks.LOGGER.warn("Conflicting rank ID '{}' detected while reading {}, ignoring", rank.getId(), inputFile); - } - } catch (RankException e) { - FTBRanks.LOGGER.error("Failed to read rank ID '{}' from {}: {}", rankId, inputFile, e.getMessage()); + SNBTCompoundTag rankFileTag = SNBT.tryRead(inputFile); + int size = rankMap.size(); + for (String rankId : rankFileTag.keySet()) { + try { + RankImpl rank = RankImpl.readSNBT(this, rankId, rankFileTag.getAsSnbtComponent(rankId), source); + if (rankMap.putIfAbsent(rank.getId(), rank) != null) { + FTBRanks.LOGGER.warn("Conflicting rank ID '{}' detected while reading {}, ignoring", rank.getId(), inputFile); } + } catch (RankException e) { + FTBRanks.LOGGER.error("Failed to read rank ID '{}' from {}: {}", rankId, inputFile, e.getMessage()); } - if (rankMap.size() == size) { - FTBRanks.LOGGER.warn("No ranks found in {}!", inputFile); - } - } else { - throw new RuntimeException(inputFile + " failed to load! check your server log for errors"); + } + if (rankMap.size() == size) { + FTBRanks.LOGGER.warn("No ranks found in {}!", inputFile); } } @@ -285,22 +272,17 @@ private void createDefaultRanks() { } public void refreshReadme() throws IOException { - List lines = new ArrayList<>(); - lines.add("=== FTB Ranks ==="); - lines.add(""); - lines.add("Last README file update: " + new Date()); - lines.add("Wiki: https://www.notion.so/feedthebeast/FTB-Mod-Documentation-da2e359bad2449459d58d787edda3168"); - lines.add("To refresh this file, run /ftbranks refresh_readme"); - lines.add(""); - lines.add("= All available command nodes ="); - lines.add("command"); - - List commandList = FTBRanksCommandManager.INSTANCE.commandMap.values().stream() - .map(RankCommandPredicate::getNodeName) - .distinct() - .sorted() - .toList(); - lines.addAll(commandList); + List lines = new ArrayList<>(List.of( + "=== FTB Ranks ===", + "", + "Last README file update: " + new Date(), + "Wiki: https://docs.feed-the-beast.com/mod-docs/mods/suite/Ranks/", + "To refresh this file, run /ftbranks refresh_readme", + "", + "= All available command nodes =", + "command" + )); + lines.addAll(FTBRanksCommandManager.allNodes()); Files.write(directory.resolve("README.txt"), lines); } @@ -310,12 +292,12 @@ private void rebuildSortedRanks() { sortedRanks.addAll(ranks.values().stream().sorted().toList()); } - PlayerRankData getOrCreatePlayerData(GameProfile profile) { - PlayerRankData data = playerData.get(profile.getId()); + PlayerRankData getOrCreatePlayerData(NameAndId profile) { + PlayerRankData data = playerData.get(profile.id()); if (data == null) { - data = new PlayerRankData(this, profile.getId(), profile.getName()); - playerData.put(profile.getId(), data); + data = new PlayerRankData(this, profile.id(), profile.name()); + playerData.put(profile.id(), data); markRanksDirty(); } @@ -328,7 +310,7 @@ void registerCondition(String id, RankConditionFactory conditionFactory) { } } - void load() throws Exception { + void load() throws IOException { if (Files.notExists(directory)) { Files.createDirectories(directory); } @@ -348,8 +330,10 @@ void saveRanksNow() { .put(rank.getId(), rank.writeSNBT()); } map.forEach((source, tag) -> { - if (!SNBT.write(source.getPath(server), tag)) { - FTBRanks.LOGGER.warn("Failed to save {}}!", source.getPath(server)); + try { + SNBT.tryWrite(source.getPath(server), tag); + } catch (IOException e) { + FTBRanks.LOGGER.warn("Failed to save {}}! {} / {}", source.getPath(server), e.getClass().getName(), e.getMessage()); } }); shouldSaveRanks = false; @@ -363,8 +347,10 @@ void savePlayersNow() { playerTag.put(data.getPlayerId().toString(), data.writeSNBT()); } - if (!SNBT.write(playerFile, playerTag)) { - FTBRanks.LOGGER.warn("Failed to save players.snbt!"); + try { + SNBT.tryWrite(playerFile, playerTag); + } catch (IOException e) { + FTBRanks.LOGGER.warn("Failed to save players.snbt! {} / {}", e.getClass().getName(), e.getMessage()); } shouldSavePlayers = false; } @@ -372,20 +358,19 @@ void savePlayersNow() { static PermissionValue ofTag(SNBTCompoundTag tag, String key) { if (tag.isBoolean(key)) { - return BooleanPermissionValue.of(tag.getBoolean(key)); + return BooleanPermissionValue.of(tag.getBooleanOr(key, false)); // TODO: False default might not be ideal } Tag v = tag.get(key); - if (v == null || v instanceof EndTag) { - return PermissionValue.MISSING; - } else if (v instanceof NumericTag) { - return NumberPermissionValue.of(((NumericTag) v).getAsNumber()); - } else if (v instanceof StringTag) { - return StringPermissionValue.of(v.getAsString()); - } + return switch (v) { + case null -> PermissionValue.MISSING; + case EndTag ignored -> PermissionValue.MISSING; + case NumericTag n -> NumberPermissionValue.of(n.asNumber().orElseThrow()); + case StringTag s -> StringPermissionValue.of(s.asString().orElseThrow()); + default -> StringPermissionValue.of(v.toString()); + }; - return StringPermissionValue.of(v.toString()); } static SNBTCompoundTag writePermissions(Map map, SNBTCompoundTag res) { @@ -404,4 +389,4 @@ static SNBTCompoundTag writePermissions(Map map, SNBTCo }); return res; } -} \ No newline at end of file +} diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/DefaultCondition.java b/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/DefaultCondition.java index 8cd8d4e..90bae13 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/DefaultCondition.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/DefaultCondition.java @@ -4,13 +4,7 @@ import dev.ftb.mods.ftbranks.api.RankCondition; import net.minecraft.server.level.ServerPlayer; -public class DefaultCondition implements RankCondition.Simple { - public final Rank original; - - public DefaultCondition(Rank original) { - this.original = original; - } - +public record DefaultCondition(Rank original) implements RankCondition.Simple { @Override public String getType() { return "default"; diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/DimensionCondition.java b/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/DimensionCondition.java index 3a86958..797587a 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/DimensionCondition.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/DimensionCondition.java @@ -3,8 +3,8 @@ import dev.ftb.mods.ftblibrary.snbt.SNBTCompoundTag; import dev.ftb.mods.ftbranks.api.RankCondition; import net.minecraft.core.registries.Registries; +import net.minecraft.resources.Identifier; import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.Level; @@ -12,7 +12,7 @@ public class DimensionCondition implements RankCondition { private final ResourceKey dimension; public DimensionCondition(SNBTCompoundTag tag) { - dimension = ResourceKey.create(Registries.DIMENSION, ResourceLocation.parse(tag.getString("dimension"))); + dimension = ResourceKey.create(Registries.DIMENSION, Identifier.parse(tag.getStringOr("dimension", ""))); } @Override @@ -27,6 +27,6 @@ public boolean isRankActive(ServerPlayer player) { @Override public void save(SNBTCompoundTag tag) { - tag.putString("dimension", dimension.location().toString()); + tag.putString("dimension", dimension.identifier().toString()); } -} \ No newline at end of file +} diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/OPCondition.java b/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/OPCondition.java index 8b7ffd6..44efe81 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/OPCondition.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/OPCondition.java @@ -11,6 +11,6 @@ public String getType() { @Override public boolean isRankActive(ServerPlayer player) { - return player.server.getPlayerList().isOp(player.getGameProfile()); + return player.level().getServer().getPlayerList().isOp(player.nameAndId()); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/PlaytimeCondition.java b/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/PlaytimeCondition.java index 6a951b7..e968a67 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/PlaytimeCondition.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/PlaytimeCondition.java @@ -3,7 +3,7 @@ import dev.ftb.mods.ftblibrary.snbt.SNBTCompoundTag; import dev.ftb.mods.ftbranks.FTBRanks; import dev.ftb.mods.ftbranks.api.RankCondition; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerPlayer; import net.minecraft.stats.Stat; import net.minecraft.stats.Stats; @@ -18,15 +18,15 @@ public class PlaytimeCondition implements RankCondition { private final int time; private final int timeUnit; - private final Stat stat; + private final Stat stat; public PlaytimeCondition(SNBTCompoundTag tag) { - time = tag.getInt("time"); + time = tag.getIntOr("time", 0); if (!tag.contains("time_unit")) { FTBRanks.LOGGER.warn("missing 'time_unit' field in playtime condition - assuming 'ticks'"); } - switch (tag.getString("time_unit")) { + switch (tag.getStringOr("time_unit", "seconds")) { case "seconds" -> timeUnit = SECONDS; case "minutes" -> timeUnit = MINUTES; case "hours" -> timeUnit = HOURS; @@ -61,4 +61,4 @@ public void save(SNBTCompoundTag tag) { default -> tag.putString("time_unit", "ticks"); } } -} \ No newline at end of file +} diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/RankAddedCondition.java b/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/RankAddedCondition.java index e4b9a90..3c32020 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/RankAddedCondition.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/RankAddedCondition.java @@ -11,7 +11,7 @@ public class RankAddedCondition implements RankCondition { public RankAddedCondition(Rank r, SNBTCompoundTag tag) { original = r; - id = tag.getString("rank"); + id = tag.getStringOr("rank", ""); } @Override diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/SpawnCondition.java b/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/SpawnCondition.java index dba02ab..9ad05cb 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/SpawnCondition.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/SpawnCondition.java @@ -2,6 +2,8 @@ import dev.ftb.mods.ftbranks.api.RankCondition; import net.minecraft.core.BlockPos; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.dedicated.DedicatedServer; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.Mth; @@ -15,13 +17,17 @@ public String getType() { @Override public boolean isRankActive(ServerPlayer player) { - if (player.level() instanceof ServerLevel serverLevel && serverLevel.dimension() == Level.OVERWORLD && player.server.getSpawnProtectionRadius() > 0) { - BlockPos spawn = serverLevel.getSharedSpawnPos(); + if (player.level() instanceof ServerLevel serverLevel && serverLevel.dimension() == Level.OVERWORLD && getSpawnProtectionRadius(serverLevel.getServer()) > 0) { + BlockPos spawn = serverLevel.getRespawnData().pos(); int x = Mth.abs(Mth.floor(player.getX()) - spawn.getX()); int z = Mth.abs(Mth.floor(player.getZ()) - spawn.getZ()); - return Math.max(x, z) <= player.server.getSpawnProtectionRadius(); + return Math.max(x, z) <= getSpawnProtectionRadius(serverLevel.getServer()); } return false; } + + private static int getSpawnProtectionRadius(MinecraftServer server) { + return server instanceof DedicatedServer d ? d.spawnProtectionRadius() : 0; + } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/StatCondition.java b/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/StatCondition.java index 4e3184f..aa4b33e 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/StatCondition.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/StatCondition.java @@ -3,7 +3,7 @@ import dev.ftb.mods.ftblibrary.snbt.SNBTCompoundTag; import dev.ftb.mods.ftbranks.api.RankCondition; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerPlayer; import net.minecraft.stats.Stat; import net.minecraft.stats.Stats; @@ -18,21 +18,21 @@ public class StatCondition implements RankCondition { public static final int LESSER = 5; public static final int LESSER_OR_EQUAL = 6; - private final ResourceLocation statId; + private final Identifier statId; private final int value; private final int valueCheck; private final Stat stat; public StatCondition(SNBTCompoundTag tag) { - statId = ResourceLocation.parse(tag.getString("stat")); + statId = Identifier.parse(tag.getStringOr("stat", "")); stat = BuiltInRegistries.CUSTOM_STAT.getOptional(statId) .map(Stats.CUSTOM::get) .orElseThrow(() -> new NoSuchElementException(String.format("%s does not match any known stat", statId)) ); - value = tag.getInt("value"); + value = tag.getIntOr("value", 0); - switch (tag.getString("value_check")) { + switch (tag.getStringOr("value_check", "")) { case "not_equals", "not", "!=" -> valueCheck = NOT_EQUALS; case "greater", ">" -> valueCheck = GREATER; case "greater_or_equal", ">=" -> valueCheck = GREATER_OR_EQUAL; @@ -75,4 +75,4 @@ public void save(SNBTCompoundTag tag) { default -> tag.putString("value_check", "=="); } } -} \ No newline at end of file +} diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/package-info.java b/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/package-info.java new file mode 100644 index 0000000..19afe8e --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftbranks/impl/condition/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftbranks.impl.condition; + +import org.jspecify.annotations.NullMarked; diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/impl/decorate/TextComponentParser.java b/common/src/main/java/dev/ftb/mods/ftbranks/impl/decorate/TextComponentParser.java index 46a23d6..6d5457a 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/impl/decorate/TextComponentParser.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/impl/decorate/TextComponentParser.java @@ -38,20 +38,16 @@ public class TextComponentParser { CODE_TO_FORMATTING.put('r', ChatFormatting.RESET); } - public static MutableComponent parse(String text, @Nullable Function substitutes) { - return new TextComponentParser(text, substitutes).parse(); - } - private final String text; - private final Function substitutes; + private final Function substitutes; - private MutableComponent component; - private StringBuilder builder; - private Style style; + private TextComponentParser(String text, Function substitutes) { + this.text = text; + this.substitutes = substitutes; + } - private TextComponentParser(String txt, @Nullable Function sub) { - text = txt; - substitutes = sub; + public static MutableComponent parse(String text, Function substitutes) { + return new TextComponentParser(text, substitutes).parse(); } private MutableComponent parse() { @@ -63,7 +59,7 @@ private MutableComponent parse() { boolean hasSpecialCodes = false; for (char c1 : c) { - if (c1 == '{' || c1 == '&' || c1 == '\u00a7') { + if (c1 == '{' || c1 == '&' || c1 == '§') { hasSpecialCodes = true; break; } @@ -73,9 +69,9 @@ private MutableComponent parse() { return Component.literal(text); } - component = Component.literal(""); - style = Style.EMPTY; - builder = new StringBuilder(); + MutableComponent component = Component.literal(""); + Style style = Style.EMPTY; + StringBuilder builder = new StringBuilder(); boolean sub = false; for (int i = 0; i < c.length; i++) { @@ -87,21 +83,21 @@ private MutableComponent parse() { throw new IllegalArgumentException("Invalid formatting! Can't nest multiple substitutes!"); } - finishPart(); + finishPart(component, style, builder); sub = false; continue; } if (!escape) { - if (c[i] == '\u00a7') { + if (c[i] == '§') { c[i] = '&'; } if (c[i] == '&') { - finishPart(); + finishPart(component, style, builder); if (end) { - throw new IllegalArgumentException("Invalid formatting! Can't end string with & or \u00a7!"); + throw new IllegalArgumentException("Invalid formatting! Can't end string with & or §!"); } i++; @@ -109,24 +105,17 @@ private MutableComponent parse() { if (c[i] == '#') { char[] rrggbb = new char[7]; rrggbb[0] = '#'; - System.arraycopy(c, i + 1, rrggbb, 1, 6); - i += 6; style = style.withColor(TextColor.parseColor(new String(rrggbb)).result().orElse(TextColor.fromRgb(0xFFFFFF))); } else { ChatFormatting formatting = CODE_TO_FORMATTING.get(c[i]); - - if (formatting == null) { - throw new IllegalArgumentException("Illegal formatting! Unknown color code character: " + c[i] + "!"); - } - - style = style.applyFormat(formatting); + style = style.applyFormat(formatting); } continue; } else if (c[i] == '{') { - finishPart(); + finishPart(component, style, builder); if (end) { throw new IllegalArgumentException("Invalid formatting! Can't end string with {!"); @@ -141,32 +130,28 @@ private MutableComponent parse() { } } - finishPart(); + finishPart(component, style, builder); return component; } - private void finishPart() { + private void finishPart(MutableComponent component, Style style, StringBuilder builder) { String string = builder.toString(); builder.setLength(0); if (string.isEmpty()) { return; } else if (string.length() < 2 || string.charAt(0) != '{') { - MutableComponent component1 = Component.literal(string); - component1.setStyle(style); - component.append(component1); + component.append(Component.literal(string).setStyle(style)); return; } Component component1 = substitutes.apply(string.substring(1)); - if (component1 != null) { Style style0 = component1.getStyle(); - Style style1 = style; - style1.withHoverEvent(style0.getHoverEvent()); - style1.withClickEvent(style0.getClickEvent()); - style1.withInsertion(style0.getInsertion()); - component1 = Component.literal("").append(component1).withStyle(style1); + style.withHoverEvent(style0.getHoverEvent()) + .withClickEvent(style0.getClickEvent()) + .withInsertion(style0.getInsertion()); + component1 = Component.empty().append(component1).withStyle(style); } else { throw new IllegalArgumentException("Invalid formatting! Unknown substitute: " + string.substring(1)); } diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/impl/decorate/package-info.java b/common/src/main/java/dev/ftb/mods/ftbranks/impl/decorate/package-info.java new file mode 100644 index 0000000..c19ac00 --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftbranks/impl/decorate/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftbranks.impl.decorate; + +import org.jspecify.annotations.NullMarked; diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/impl/package-info.java b/common/src/main/java/dev/ftb/mods/ftbranks/impl/package-info.java new file mode 100644 index 0000000..646af22 --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftbranks/impl/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftbranks.impl; + +import org.jspecify.annotations.NullMarked; diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/impl/permission/BooleanPermissionValue.java b/common/src/main/java/dev/ftb/mods/ftbranks/impl/permission/BooleanPermissionValue.java index 006f4f2..2be26f6 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/impl/permission/BooleanPermissionValue.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/impl/permission/BooleanPermissionValue.java @@ -40,12 +40,7 @@ public String toString() { return value ? "true" : "false"; } - @Override - public boolean equals(Object o) { - return this == o; - } - - @Override + @Override public int hashCode() { return Boolean.hashCode(value); } diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/impl/permission/package-info.java b/common/src/main/java/dev/ftb/mods/ftbranks/impl/permission/package-info.java new file mode 100644 index 0000000..0b5163f --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftbranks/impl/permission/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftbranks.impl.permission; + +import org.jspecify.annotations.NullMarked; diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/package-info.java b/common/src/main/java/dev/ftb/mods/ftbranks/package-info.java new file mode 100644 index 0000000..af02a87 --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftbranks/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftbranks; + +import org.jspecify.annotations.NullMarked; diff --git a/fabric/build.gradle b/fabric/build.gradle index 6beccf5..fdf6f9e 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -26,7 +26,7 @@ dependencies { modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}" modApi "dev.architectury:architectury-fabric:${rootProject.architectury_version}" - modApi("dev.ftb.mods:ftb-library-fabric:${rootProject.ftb_library_version}") { transitive false } + modApi("dev.ftb.mods:ftb-library-fabric:${rootProject.ftb_library_version}") common(project(path: ":common", configuration: "namedElements")) { transitive false } shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } diff --git a/gradle.properties b/gradle.properties index 0484dd9..0f18a1b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,23 +4,21 @@ mod_id=ftbranks readable_name=FTB Ranks archives_base_name=ftb-ranks maven_group=dev.ftb.mods -mod_version=2101.1.3 +mod_version=2111.1.0 mod_author=FTB Team -minecraft_version=1.21.1 +minecraft_version=1.21.11 # Deps -forge_version=50.0.9 -neoforge_version=21.1.66 -neoforge_version_range=[21.1.0,) +neoforge_version=21.11.38-beta +neoforge_version_range=[21.11.0-beta,) neoforge_loader_version=4 -fabric_loader_version=0.15.11 -fabric_api_version=0.102.1+1.21.1 -fabric_api_version_range=>=0.102.1+1.21.1 -architectury_version=13.0.6 +fabric_loader_version=0.18.4 +fabric_api_version=0.140.2+1.21.11 +fabric_api_version_range=>=0.140.0 +architectury_version=19.0.1 -ftb_library_version=2101.1.12 +ftb_library_version=2111.1.0 curseforge_id_forge=314905 curseforge_id_fabric=472659 -curseforge_type=alpha diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4ce542e..4df663d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 9575821..7cb473d 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -32,7 +32,7 @@ dependencies { neoForge "net.neoforged:neoforge:${rootProject.neoforge_version}" modApi "dev.architectury:architectury-neoforge:${rootProject.architectury_version}" - modApi("dev.ftb.mods:ftb-library-neoforge:${rootProject.ftb_library_version}") { transitive false } + modApi("dev.ftb.mods:ftb-library-neoforge:${rootProject.ftb_library_version}") common(project(path: ":common", configuration: "namedElements")) { transitive false } shadowCommon(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive false } diff --git a/neoforge/src/main/java/dev/ftb/mods/ftbranks/neoforge/PermissionAPIWrapper.java b/neoforge/src/main/java/dev/ftb/mods/ftbranks/neoforge/PermissionAPIWrapper.java deleted file mode 100644 index 208fbaa..0000000 --- a/neoforge/src/main/java/dev/ftb/mods/ftbranks/neoforge/PermissionAPIWrapper.java +++ /dev/null @@ -1,44 +0,0 @@ -package dev.ftb.mods.ftbranks.neoforge; - -/** - * @author LatvianModder - */ -public class PermissionAPIWrapper /* implements IPermissionHandler */ { - /* Nah, im not doing this lol - private final IPermissionHandler original; - - public PermissionAPIWrapper(IPermissionHandler h) { - original = h; - } - - @Override - public void registerNode(String node, DefaultPermissionLevel level, String desc) { - original.registerNode(node, level, desc); - } - - @Override - public Collection getRegisteredNodes() { - return original.getRegisteredNodes(); - } - - @Override - public boolean hasPermission(GameProfile profile, String node, @Nullable IContext context) { - if (context != null && context.getPlayer() instanceof ServerPlayer) { - return FTBRanksAPI.getPermissionValue((ServerPlayer) context.getPlayer(), node).asBoolean().orElseGet(() -> original.hasPermission(profile, node, context)); - } else if (context != null && context.getWorld() != null && !context.getWorld().isClientSide()) { - ServerPlayer player = context.getWorld().getServer().getPlayerList().getPlayer(profile.getId()); - - if (player != null) { - return FTBRanksAPI.getPermissionValue(player, node).asBoolean().orElseGet(() -> original.hasPermission(profile, node, context)); - } - } - - return original.hasPermission(profile, node, context); - } - - @Override - public String getNodeDescription(String node) { - return original.getNodeDescription(node); - } - */ -} diff --git a/settings.gradle b/settings.gradle index 0beed7a..a094dd3 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,4 +11,4 @@ include("fabric") //include("forge") include("neoforge") -rootProject.name = 'FTB-Ranks-1.21' +rootProject.name = 'FTB-Ranks-1.21.11'