diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5ce0b22..18c1457 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,11 +18,11 @@ jobs: runs-on: ${{ matrix.os }} steps: - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: validate gradle wrapper uses: gradle/actions/wrapper-validation@v4 - name: setup jdk ${{ matrix.java }} - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: java-version: ${{ matrix.java }} distribution: 'adopt' diff --git a/README-en.md b/README-en.md index 4ce4879..944f246 100755 --- a/README-en.md +++ b/README-en.md @@ -17,6 +17,7 @@ Most other MC versions that are the same as the supported major versions but hav | Minecraft Version | Support Status | |-------------------|--------------------------------------------------------------------------| +| 1.21.10 | Supporting, developing actively | | 1.21.5 | Supporting, developing actively | | 1.21 | Supporting, developing actively | | 1.20.4 | Supporting, developing actively | @@ -296,6 +297,8 @@ Fix bug: lagging when spawn bot because mojang server is too slow :( This rule force any bot use offline uuid. +Due to difficulties in porting, it is just for `1.17.1-1.21.5`. Use alternatives in higher versions. [iss#10](https://github.com/OptiJava/OptCarpetAddition/issues/10) + - Default value: `false` - Acceptable value: `true` `false` - Categories: `Optimization` diff --git a/README.md b/README.md index d7b2c6c..56c9e35 100755 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ Language: [English](https://github.com/OptiJava/OptCarpetAddition/blob/master/RE | Minecraft 版本 | 支持状态 | |--------------|----------------------------| +| 1.21.10 | 支持,积极开发 | | 1.21.5 | 支持,积极开发 | | 1.21 | 支持,积极开发 | | 1.20.4 | 支持,积极开发 | @@ -297,6 +298,8 @@ DispenserBlockEntity dispenserBlockEntity = (DispenserBlockEntity)blockPointerIm 如果你的服务器连接mojang服务器的时间长,spawn假人的时候就会卡顿一会,此规则强制所有假人使用离线uuid,解决这一问题(但是也许引发新的问题 +由于移植困难,仅支持`1.17.1-1.21.5`版本,高版本请使用替代品 [iss#10](https://github.com/OptiJava/OptCarpetAddition/issues/10) + - Default value: `false` - Acceptable value: `true` `false` - Categories: `Optimization` diff --git a/build.gradle b/build.gradle index 34a8c48..754f1a1 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,7 @@ plugins { - id 'fabric-loom' version '1.10-SNAPSHOT' apply false +//旧版fabric loom 无法识别1.21.10 +// id 'fabric-loom' version '1.10-SNAPSHOT' apply false + id 'fabric-loom' version '1.11-SNAPSHOT' apply false id 'maven-publish' id 'com.replaymod.preprocess' version '20c7ec554a' } @@ -10,8 +12,10 @@ preprocess { def mc1204 = createNode('1.20.4' , 1_20_04, 'yarn') def mc1210 = createNode('1.21' , 1_21_00, 'yarn') def mc1215 = createNode('1.21.5' , 1_21_05, 'yarn') + def mc12110 = createNode('1.21.10', 1_21_10, 'yarn') mc117 .link(mc1204, null) mc1204.link(mc1210, null) mc1210.link(mc1215, null) + mc1215.link(mc12110, null) } diff --git a/gradle.properties b/gradle.properties index 2fc7ae7..87f8256 100755 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ systemProp.http.socketTimeout=60000 systemProp.https.socketTimeout=60000 # Fabric Configurations -loader_version=0.16.14 +loader_version=0.17.3 loader_requirement_version=>=0.15 # Mod Metadata diff --git a/src/main/java/io/github/optijava/opt_carpet_addition/OptCarpetAddition.java b/src/main/java/io/github/optijava/opt_carpet_addition/OptCarpetAddition.java index 05c1f48..32fa1e5 100644 --- a/src/main/java/io/github/optijava/opt_carpet_addition/OptCarpetAddition.java +++ b/src/main/java/io/github/optijava/opt_carpet_addition/OptCarpetAddition.java @@ -24,6 +24,7 @@ import org.apache.logging.log4j.Logger; import java.io.File; +import java.util.Map; import java.util.Objects; public class OptCarpetAddition implements CarpetExtension, ModInitializer { @@ -33,7 +34,7 @@ public class OptCarpetAddition implements CarpetExtension, ModInitializer { @Override public void onInitialize() { LOGGER.info("OptCarpetAddition is loading..."); - CarpetServer.manageExtension(new OptCarpetAddition()); + CarpetServer.manageExtension(this); ServerEntityWorldChangeEvents.AFTER_PLAYER_CHANGE_WORLD.register(new FixExperienceBug()); } @@ -54,19 +55,21 @@ public void onGameStarted() { //#else if (Objects.equals(rule.name, "forceFakePlayerGameMode") && !Objects.equals(OptCarpetSettings.forceFakePlayerGameMode, "false")) { //#endif - GameMode gameMode = GameMode.SURVIVAL; + GameMode gameMode; if (OptCarpetSettings.forceFakePlayerGameMode.equals("creative")) { gameMode = GameMode.CREATIVE; } else if (OptCarpetSettings.forceFakePlayerGameMode.equals("adventure")) { gameMode = GameMode.ADVENTURE; + } else { + gameMode = GameMode.SURVIVAL; } - for (ServerPlayerEntity player : serverCommandSource.getServer().getPlayerManager().getPlayerList()) { + serverCommandSource.getServer().getPlayerManager().getPlayerList().forEach(player -> { if (player instanceof EntityPlayerMPFake) { player.changeGameMode(gameMode); } - } + }); } //#if MC >= 11900 @@ -144,7 +147,7 @@ public void registerCommands(CommandDispatcher dispatcher) @Override public void onPlayerLoggedIn(ServerPlayerEntity player) { - if (player instanceof EntityPlayerMPFake && !(Objects.equals(OptCarpetSettings.forceFakePlayerGameMode, "false"))) { + if (!(Objects.equals(OptCarpetSettings.forceFakePlayerGameMode, "false")) && player instanceof EntityPlayerMPFake) { GameMode gameMode = GameMode.SURVIVAL; if (OptCarpetSettings.forceFakePlayerGameMode.equals("creative")) { @@ -174,4 +177,10 @@ public void onPlayerLoggedOut(ServerPlayerEntity player) { public void registerLoggers() { LoggerRegister.registry(); } + + @Override + public Map canHasTranslations(String lang) { + //add rule translator + return RuleTranslator.getTranslationFromResourcePath(lang); + } } diff --git a/src/main/java/io/github/optijava/opt_carpet_addition/OptCarpetSettings.java b/src/main/java/io/github/optijava/opt_carpet_addition/OptCarpetSettings.java index b607556..93b7f73 100644 --- a/src/main/java/io/github/optijava/opt_carpet_addition/OptCarpetSettings.java +++ b/src/main/java/io/github/optijava/opt_carpet_addition/OptCarpetSettings.java @@ -21,6 +21,7 @@ //$$ @SuppressWarnings("all") //#endif public class OptCarpetSettings { + public static final String OCA = "OCA"; public static final String FALSE = "false"; public static Path configDirectory = FabricLoader.getInstance().getConfigDir().resolve("opt-carpet-addition"); @@ -28,28 +29,28 @@ public class OptCarpetSettings { @Rule( desc = "Enables [/player xxx tp] to teleport to fake player", - category = RuleCategory.COMMAND, + category = {RuleCategory.COMMAND,OCA}, options = {"true", "false", "ops"} ) public static String commandTpToFakePlayer = FALSE; @Rule( desc = "Enables [/player xxx tp] to teleport to real player", - category = RuleCategory.COMMAND, + category = {RuleCategory.COMMAND,OCA}, options = {"true", "false", "ops"} ) public static String allowTpToRealPlayer = FALSE; @Rule( desc = "Enables [/player xxx tp] to teleport to fake player", - category = RuleCategory.COMMAND, + category = {RuleCategory.COMMAND,OCA}, options = {"true", "false", "ops"} ) public static String commandTpHereFakePlayer = FALSE; @Rule( desc = "Enables [/player xxx tp] to teleport to real player", - category = RuleCategory.COMMAND, + category = {RuleCategory.COMMAND,OCA}, options = {"true", "false", "ops"} ) public static String allowTpHereRealPlayer = FALSE; @@ -57,7 +58,7 @@ public class OptCarpetSettings { // Force fake player gamemode rule ========================================================= @Rule( desc = "Force fake player gamemode", - category = RuleCategory.FEATURE, + category = {RuleCategory.FEATURE,OCA}, options = {"survival", "creative", "adventure", "false"} ) public static String forceFakePlayerGameMode = FALSE; @@ -65,7 +66,7 @@ public class OptCarpetSettings { // Fix bugs ================================================================================ @Rule( desc = "Refresh xp level when player change world", - category = RuleCategory.BUGFIX + category = {RuleCategory.BUGFIX,OCA} ) public static boolean fixXpLevelBug = false; @@ -77,76 +78,76 @@ public class OptCarpetSettings { @Rule( desc = "Enable tp prefix blacklist", - category = RuleCategory.FEATURE + category = {RuleCategory.FEATURE,OCA} ) public static boolean enableTpPrefixBlacklist = false; @Rule( desc = "Enable tp prefix whitelist", - category = RuleCategory.FEATURE + category = {RuleCategory.FEATURE,OCA} ) public static boolean enableTpPrefixWhitelist = false; @Rule( desc = "Enable tp here prefix blacklist", - category = RuleCategory.FEATURE + category = {RuleCategory.FEATURE,OCA} ) public static boolean enableTpHerePrefixBlacklist = false; @Rule( desc = "Enable tp here prefix whitelist", - category = RuleCategory.FEATURE + category = {RuleCategory.FEATURE,OCA} ) public static boolean enableTpHerePrefixWhitelist = false; @Rule( desc = "Disable chicken lays eggs", - category = RuleCategory.FEATURE + category = {RuleCategory.FEATURE,OCA} ) public static boolean disabledLayEggs = false; @Rule( desc = "Disable enderman pickup block goal", - category = RuleCategory.FEATURE + category = {RuleCategory.FEATURE,OCA} ) public static boolean disabledEnderManPickupGoal = false; @Rule( desc = "Disable enderman place block goal", - category = RuleCategory.FEATURE + category = {RuleCategory.FEATURE,OCA} ) public static boolean disabledEnderManPlaceBlockGoal = false; @Rule( desc = "Disable zombified piglin spawn in nether portal", - category = {RuleCategory.OPTIMIZATION, RuleCategory.FEATURE} + category = {RuleCategory.OPTIMIZATION, RuleCategory.FEATURE,OCA} ) public static boolean disabledNetherPortalSpawn = false; @Rule( desc = "Disable entity tick(contains all entity and BlockEntity)", - category = {RuleCategory.EXPERIMENTAL} + category = {RuleCategory.EXPERIMENTAL,OCA} ) public static boolean disabledEntityTick = false; //#if MC < 11900 @Rule( desc = "Disable error stack when update suppression.", - category = {RuleCategory.BUGFIX} + category = {RuleCategory.BUGFIX,OCA} ) public static boolean disabledUpdateSuppressionErrorStackTrace = false; //#endif @Rule( desc = "Unescape chat message. \\u4e2d -> 中", - category = {RuleCategory.FEATURE, RuleCategory.CLIENT} + category = {RuleCategory.FEATURE, RuleCategory.CLIENT,OCA} ) public static boolean unescapeChatMessage = false; //#if MC < 11900 @Rule( desc = "Handle player connect in a new thread to reduce the lag.", - category = {RuleCategory.OPTIMIZATION, RuleCategory.EXPERIMENTAL} + category = {RuleCategory.OPTIMIZATION, RuleCategory.EXPERIMENTAL,OCA} ) public static boolean optimizePlayerConnect = false; //#endif @@ -154,48 +155,50 @@ public class OptCarpetSettings { //#if MC < 11900 @Rule( desc = "Handle player teleport in a new thread to reduce the lag.", - category = {RuleCategory.OPTIMIZATION, RuleCategory.EXPERIMENTAL} + category = {RuleCategory.OPTIMIZATION, RuleCategory.EXPERIMENTAL,OCA} ) public static boolean optimizeTeleport = false; //#endif @Rule( desc = "Print info log when players submit command", - category = {RuleCategory.COMMAND, RuleCategory.FEATURE} + category = {RuleCategory.COMMAND, RuleCategory.FEATURE,OCA} ) public static boolean commandLogger = false; //#if MC < 11900 @Rule( desc = "Dropper crash fix", - category = RuleCategory.BUGFIX + category = {RuleCategory.BUGFIX,OCA} ) public static boolean dropperCrashFix = false; //#endif - + + //#if MC < 12110 @Rule( desc = "Always spawn offline fake player to reduce lagging", - category = RuleCategory.OPTIMIZATION + category = {RuleCategory.OPTIMIZATION,OCA} ) public static boolean optimizeFakePlayerSpawn = false; - + //#endif + //#if MC < 12100 @Rule( desc = "Fix CCE Suppression crashes", - category = {RuleCategory.BUGFIX, RuleCategory.EXPERIMENTAL} + category = {RuleCategory.BUGFIX, RuleCategory.EXPERIMENTAL,OCA} ) public static boolean cceSuppressionCrashFix = false; //#endif @Rule( desc = "Remove every armour which has `curse of binding` enchantment when player dead in wall (keepInventory must be true).", - category = RuleCategory.FEATURE + category = {RuleCategory.FEATURE,OCA} ) public static boolean removeAllCurseOfBindingArmorWhenPlayerDeadInWall = false; @Rule( desc = "Modify item disappeared time, default value -1 (unit: tick)", - category = RuleCategory.FEATURE, + category = {RuleCategory.FEATURE,OCA}, options = {"-1", "6000"}, strict = false, validate = CustomItemDiscardTimeValidator.class @@ -205,26 +208,26 @@ public class OptCarpetSettings { //#if MC >= 12000 //$$ @Rule( //$$ desc = "Disallow redstone wire connects to open trapdoor(in version >= 1.20)", - //$$ category = RuleCategory.FEATURE + //$$ category = {RuleCategory.FEATURE,OCA} //$$ ) //$$ public static boolean disallowRedstoneWireConnectsToOpenTrapdoor = false; //#endif @Rule( desc = "Don't enable this rule unless you need blockUpdate logger! Enabling this rule may cause performance issues, so this rule was false by default. Before you set this rule to true, everyone can not use blockUpdate logger.", - category = {RuleCategory.FEATURE, RuleCategory.OPTIMIZATION} + category = {RuleCategory.FEATURE, RuleCategory.OPTIMIZATION,OCA} ) public static boolean allowBlockUpdateLogger = false; @Rule( desc = "Don't spawn bats!", - category = RuleCategory.FEATURE + category = {RuleCategory.FEATURE,OCA} ) public static boolean removeBats = false; @Rule( desc = "The rate limit of `/player xxx tp` command. Default: permit 1 request per 2 seconds per player.", - category = {RuleCategory.FEATURE, RuleCategory.COMMAND}, + category = {RuleCategory.FEATURE, RuleCategory.COMMAND,OCA}, validate = PlayerTpRateLimitTimeValidator.class, strict = false, options = {"2"} @@ -233,8 +236,39 @@ public class OptCarpetSettings { @Rule( desc = "If enabled, command logger will broadcast commands to those players.", - category = {RuleCategory.COMMAND, RuleCategory.FEATURE}, + category = {RuleCategory.COMMAND, RuleCategory.FEATURE,OCA}, options = {"true", "false", "ops"} ) public static String commandLoggerBroadcastToPlayer = FALSE; + + @Rule( + desc = "allow spectator tp to any player!", + category = {RuleCategory.FEATURE, RuleCategory.COMMAND,OCA}, + options = {"true", "false"} + ) + public static boolean allowSpectatorTpToAnyPlayer = false; + + @Rule( + desc = "enableLoggerCommand", + category = {RuleCategory.COMMAND , OCA} + ) + public static boolean enableLoggerCommand = true; + + @Rule( + desc = "enableCrashCommand", + category = {RuleCategory.COMMAND , OCA} + ) + public static boolean enableCrashCommand = true; + + @Rule( + desc = "enableListAdvanceCommand", + category = {RuleCategory.COMMAND , OCA} + ) + public static boolean enableListAdvanceCommand = true; + + @Rule( + desc = "enableTpmanagerCommand", + category = {RuleCategory.COMMAND , OCA} + ) + public static boolean enableTpmanagerCommand = true; } diff --git a/src/main/java/io/github/optijava/opt_carpet_addition/RuleTranslator.java b/src/main/java/io/github/optijava/opt_carpet_addition/RuleTranslator.java new file mode 100644 index 0000000..da31161 --- /dev/null +++ b/src/main/java/io/github/optijava/opt_carpet_addition/RuleTranslator.java @@ -0,0 +1,30 @@ +package io.github.optijava.opt_carpet_addition; + + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import org.apache.commons.io.IOUtils; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.Map; + +public class RuleTranslator { + public static Map getTranslationFromResourcePath(String lang) { + InputStream langFile = RuleTranslator.class.getClassLoader().getResourceAsStream("assets/opt-carpet-addition/lang/%s.json".formatted(lang)); + if (langFile == null) { + return Collections.emptyMap(); + } + String jsonData; + try { + jsonData = IOUtils.toString(langFile, StandardCharsets.UTF_8); + } catch (IOException e) { + return Collections.emptyMap(); + } + Gson gson = new GsonBuilder().setLenient().create(); + return gson.fromJson(jsonData, new TypeToken>() {}.getType()); + } +} diff --git a/src/main/java/io/github/optijava/opt_carpet_addition/commands/CommandLoggerCommand.java b/src/main/java/io/github/optijava/opt_carpet_addition/commands/CommandLoggerCommand.java index 0719f16..5a724a4 100644 --- a/src/main/java/io/github/optijava/opt_carpet_addition/commands/CommandLoggerCommand.java +++ b/src/main/java/io/github/optijava/opt_carpet_addition/commands/CommandLoggerCommand.java @@ -4,17 +4,23 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.context.CommandContext; import io.github.optijava.opt_carpet_addition.utils.CommandLogger; +import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; - -import static net.minecraft.server.command.CommandManager.literal; +import static io.github.optijava.opt_carpet_addition.OptCarpetSettings.enableLoggerCommand; public class CommandLoggerCommand { public static void registerCommand(CommandDispatcher dispatcher) { - LiteralArgumentBuilder argumentBuilder = literal("commandlogger") + LiteralArgumentBuilder argumentBuilder = CommandManager.literal("commandlogger") + //#if MC < 12004 + //$$.requires((player) -> carpet.settings.SettingsManager.canUseCommand(source, enableLoggerCommand)) + //#else + //$$.requires((player) -> carpet.utils.CommandHelper.canUseCommand(player, enableLoggerCommand)) + //#endif .then( - literal("reload") + CommandManager.literal("reload") .executes(CommandLoggerCommand::reload) ); + dispatcher.register(argumentBuilder); } diff --git a/src/main/java/io/github/optijava/opt_carpet_addition/commands/CrashCommand.java b/src/main/java/io/github/optijava/opt_carpet_addition/commands/CrashCommand.java index 6d19df9..8099bf2 100644 --- a/src/main/java/io/github/optijava/opt_carpet_addition/commands/CrashCommand.java +++ b/src/main/java/io/github/optijava/opt_carpet_addition/commands/CrashCommand.java @@ -6,6 +6,7 @@ import com.mojang.brigadier.context.CommandContext; import io.github.optijava.opt_carpet_addition.OptCarpetAddition; import net.minecraft.server.command.ServerCommandSource; +import static io.github.optijava.opt_carpet_addition.OptCarpetSettings.enableCrashCommand; import static net.minecraft.server.command.CommandManager.literal; @@ -17,7 +18,13 @@ private CrashCommand() { public static void registerCommand(CommandDispatcher dispatcher) { LiteralArgumentBuilder argumentBuilder = literal("crash") - .requires((serverCommandSource -> serverCommandSource.hasPermissionLevel(4))) + //#if MC < 12004 + //$$ .requires((serverCommandSource -> serverCommandSource.hasPermissionLevel(4))) + //$$.requires((player) -> carpet.settings.SettingsManager.canUseCommand(source, enableCrashCommand)) + //#else + //$$.requires((serverCommandSource -> serverCommandSource.hasPermissionLevel(4))) + //$$.requires((player) -> carpet.utils.CommandHelper.canUseCommand(player, enableCrashCommand)) + //#endif .executes(CrashCommand::prepare) .then( literal("confirm") @@ -40,12 +47,12 @@ public static int prepare(CommandContext context) { public static int confirm(CommandContext context) { if (!isPreparing) { - Messenger.m(context.getSource(), "r Nothing to abort."); + Messenger.m(context.getSource(), "r Nothing to confirm."); return 0; } OptCarpetAddition.LOGGER.fatal("[OCA Crash Command] Confirm Crash!"); - Runtime.getRuntime().halt(1); - return 1; +// Runtime.getRuntime().halt(1); + throw new Error("[OCA Crash Command] Confirm Crash!"); } public static int abort(CommandContext context) { diff --git a/src/main/java/io/github/optijava/opt_carpet_addition/commands/ListAdvanceCommand.java b/src/main/java/io/github/optijava/opt_carpet_addition/commands/ListAdvanceCommand.java index d356e17..5ed78ac 100644 --- a/src/main/java/io/github/optijava/opt_carpet_addition/commands/ListAdvanceCommand.java +++ b/src/main/java/io/github/optijava/opt_carpet_addition/commands/ListAdvanceCommand.java @@ -8,6 +8,7 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; +import static io.github.optijava.opt_carpet_addition.OptCarpetSettings.enableListAdvanceCommand; import static net.minecraft.server.command.CommandManager.literal; @@ -15,6 +16,11 @@ public class ListAdvanceCommand { public static void registerCommand(CommandDispatcher dispatcher) { LiteralArgumentBuilder argumentBuilder = literal("list") + //#if MC < 12004 + //$$.requires((player) -> carpet.settings.SettingsManager.canUseCommand(source, enableListAdvanceCommand)) + //#else + //$$.requires((player) -> carpet.utils.CommandHelper.canUseCommand(player, enableListAdvanceCommand)) + //#endif .then(literal("-advance").executes(ListAdvanceCommand::listAdvance)); dispatcher.register(argumentBuilder); } @@ -24,13 +30,17 @@ private static int listAdvance(CommandContext context) { MinecraftServer minecraftServer = context.getSource().getServer(); StringBuilder sb = new StringBuilder(); sb.append("\n"); - for (ServerPlayerEntity s : minecraftServer.getPlayerManager().getPlayerList()) { - //#if MC >= 12004 + minecraftServer.getPlayerManager().getPlayerList().forEach(s -> { + //#if MC >= 12110 + //$$ sb.append(s.getName().getString()).append(" ").append(s.getGameMode().getId()).append(" ").append(s.networkHandler.getLatency()).append("ms ").append(s.getIp()).append(" ").append(s.getGameProfile().id().toString()).append("\n"); + //#endif + //#if MC >= 12004 && MC < 12110 //$$ sb.append(s.getName().getString()).append(" ").append(s.interactionManager.getGameMode().getName()).append(" ").append(s.networkHandler.getLatency()).append("ms ").append(s.getIp()).append(" ").append(s.getGameProfile().getId().toString()).append("\n"); - //#else + //#endif + //#if MC < 12004 sb.append(s.getName().getString()).append(" ").append(s.interactionManager.getGameMode().getName()).append(" ").append(s.pingMilliseconds).append("ms ").append(s.getIp()).append(" ").append(s.getGameProfile().getId().toString()).append("\n"); //#endif - } + }); // OptCarpetAddition.LOGGER.info(sb.toString()); Messenger.m(context.getSource(), sb.toString()); } catch (Exception e) { diff --git a/src/main/java/io/github/optijava/opt_carpet_addition/commands/PlayerTpCommand.java b/src/main/java/io/github/optijava/opt_carpet_addition/commands/PlayerTpCommand.java index 1374246..9c16d20 100644 --- a/src/main/java/io/github/optijava/opt_carpet_addition/commands/PlayerTpCommand.java +++ b/src/main/java/io/github/optijava/opt_carpet_addition/commands/PlayerTpCommand.java @@ -11,9 +11,14 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import io.github.optijava.opt_carpet_addition.OptCarpetAddition; import io.github.optijava.opt_carpet_addition.OptCarpetSettings; +import io.github.optijava.opt_carpet_addition.utils.McUtils; import net.minecraft.server.MinecraftServer; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; +//#if MC >= 12110 +//$$ import net.minecraft.server.PlayerConfigEntry; +//#endif +import net.minecraft.world.GameMode; import java.util.HashMap; import java.util.Map; @@ -30,6 +35,7 @@ public class PlayerTpCommand { private PlayerTpCommand() {} private static final String COMMAND_PREFIX = "player"; + private static final MinecraftServer server = CarpetServer.minecraft_server; public static void registerCommands(CommandDispatcher dispatcher) { LiteralArgumentBuilder argumentBuilder = literal(COMMAND_PREFIX) @@ -68,8 +74,6 @@ private static int teleport(CommandContext context) { return 0; } - final MinecraftServer server = context.getSource().getServer(); - if (context.getSource().equals(server.getCommandSource())) { Messenger.m(context.getSource(), "r Console can't tp to player."); OptCarpetAddition.LOGGER.warn("Console can't tp to player"); @@ -81,42 +85,60 @@ private static int teleport(CommandContext context) { } try { + //#if MC >= 17001 final String commandSourcePlayerName = Objects.requireNonNull(context.getSource().getPlayer()).getGameProfile().getName(); + //#else + //$$ final String commandSourcePlayerName = Objects.requireNonNull(context.getSource().getPlayerOrThrow()).getName().getString(); + //#endif if (server.getPlayerManager().getPlayer(target) instanceof EntityPlayerMPFake) { switch (OptCarpetSettings.commandTpToFakePlayer) { - case "true" -> executeTp(commandSourcePlayerName, context, server); + case "true" -> executeTp(commandSourcePlayerName, context); case "ops" -> { - if ((server.getPlayerManager().isOperator(context.getSource().getPlayer().getGameProfile()))) { - executeTp(commandSourcePlayerName, context, server); + if (McUtils.isOp(context.getSource().getPlayer().getGameProfile())) { + executeTp(commandSourcePlayerName, context); } else { - Messenger.m(context.getSource(), "r You have no permission to teleport to fake player.You aren't op."); + if (OptCarpetSettings.allowSpectatorTpToAnyPlayer && context.getSource().getPlayer().interactionManager.getGameMode().equals(GameMode.SPECTATOR)){ + executeTp(commandSourcePlayerName, context); + } else { + Messenger.m(context.getSource(), "r You have no permission to teleport to fake player.You aren't op."); + } } } - case OptCarpetSettings.FALSE -> + case OptCarpetSettings.FALSE -> { + if (OptCarpetSettings.allowSpectatorTpToAnyPlayer && context.getSource().getPlayer().interactionManager.getGameMode().equals(GameMode.SPECTATOR)){ + executeTp(commandSourcePlayerName, context); + } else { Messenger.m(context.getSource(), "r Anybody can't teleport to fake player."); + } + } } } else { switch (OptCarpetSettings.allowTpToRealPlayer) { - case "true" -> - server.getCommandManager().getDispatcher().execute(server.getCommandManager().getDispatcher().parse("tp " + commandSourcePlayerName + " " + target, server.getCommandSource())); + case "true" -> tp(commandSourcePlayerName, target); case "ops" -> { - if ((server.getPlayerManager().isOperator(context.getSource().getPlayer().getGameProfile()))) { - server.getCommandManager().getDispatcher().execute(server.getCommandManager().getDispatcher().parse("tp " + commandSourcePlayerName + " " + target, server.getCommandSource())); + if (McUtils.isOp(context.getSource().getPlayer().getGameProfile())) { + tp(commandSourcePlayerName, target); } else { - Messenger.m(context.getSource(), "r You have no permission to teleport to real player.You aren't op."); + if (OptCarpetSettings.allowSpectatorTpToAnyPlayer && context.getSource().getPlayer().interactionManager.getGameMode().equals(GameMode.SPECTATOR)) { + executeTp(commandSourcePlayerName, context); + } else { + Messenger.m(context.getSource(), "r You have no permission to teleport to real player.You aren't op."); + } } } - case OptCarpetSettings.FALSE -> - Messenger.m(context.getSource(), "r Anybody can't teleport to real player."); + case OptCarpetSettings.FALSE -> { + if (OptCarpetSettings.allowSpectatorTpToAnyPlayer && context.getSource().getPlayer().interactionManager.getGameMode().equals(GameMode.SPECTATOR)) { + executeTp(commandSourcePlayerName, context); + } else { + Messenger.m(context.getSource(), "r Anybody can't teleport to real player."); + } + } } - } - - } catch (CommandSyntaxException e) { Messenger.m(context.getSource(), "r Maybe player name is not correct."); OptCarpetAddition.LOGGER.error("Unknown error occurred when execute command.", e); @@ -133,33 +155,36 @@ private static int teleportHere(CommandContext context) { String target = StringArgumentType.getString(context, COMMAND_PREFIX); - if (CarpetServer.minecraft_server.getPlayerManager().getPlayer(target) == null) { + if (server.getPlayerManager().getPlayer(target) == null) { Messenger.m(context.getSource(), "r No such player"); return 0; } - final MinecraftServer server = context.getSource().getServer(); - if (context.getSource().equals(server.getCommandSource())) { Messenger.m(context.getSource(), "r Console can't tp here player."); OptCarpetAddition.LOGGER.warn("Console can't tp here player"); return 0; } + if (StringArgumentType.getString(context, COMMAND_PREFIX).isEmpty() || target == null) { Messenger.m(context.getSource(), "r Invalid player name."); return 0; } try { + //#if MC >= 17001 final String commandSourcePlayerName = Objects.requireNonNull(context.getSource().getPlayer()).getGameProfile().getName(); + //#else + //$$ final String commandSourcePlayerName = Objects.requireNonNull(context.getSource().getPlayerOrThrow()).getName().getString(); + //#endif if (server.getPlayerManager().getPlayer(target) instanceof EntityPlayerMPFake) { switch (OptCarpetSettings.commandTpHereFakePlayer) { - case "true" -> executeTpHere(commandSourcePlayerName, context, server); + case "true" -> executeTpHere(commandSourcePlayerName, context); case "ops" -> { - if ((server.getPlayerManager().isOperator(context.getSource().getPlayer().getGameProfile()))) { - executeTpHere(commandSourcePlayerName, context, server); + if (McUtils.isOp(context.getSource().getPlayer().getGameProfile())) { + executeTpHere(commandSourcePlayerName, context); } else { Messenger.m(context.getSource(), "r You have no permission to teleport here fake player.You aren't op."); } @@ -170,11 +195,10 @@ private static int teleportHere(CommandContext context) { } else { switch (OptCarpetSettings.allowTpHereRealPlayer) { - case "true" -> - server.getCommandManager().getDispatcher().execute(server.getCommandManager().getDispatcher().parse("tp " + target + " " + commandSourcePlayerName, server.getCommandSource())); + case "true" -> tp(target, commandSourcePlayerName); case "ops" -> { - if ((server.getPlayerManager().isOperator(context.getSource().getPlayer().getGameProfile()))) { - server.getCommandManager().getDispatcher().execute(server.getCommandManager().getDispatcher().parse("tp " + target + " " + commandSourcePlayerName, server.getCommandSource())); + if (McUtils.isOp(context.getSource().getPlayer().getGameProfile())) { + tp(target, commandSourcePlayerName); } else { Messenger.m(context.getSource(), "r You have no permission to teleport here real player.You aren't op."); } @@ -192,16 +216,16 @@ private static int teleportHere(CommandContext context) { return 1; } - private static void executeTp(String commandSourcePlayerName, CommandContext context, MinecraftServer server) { + private static void executeTp(String commandSourcePlayerName, CommandContext context) { String target = StringArgumentType.getString(context, COMMAND_PREFIX); try { if (OptCarpetSettings.enableTpPrefixWhitelist && checkTpWhitelist(StringArgumentType.getString(context, COMMAND_PREFIX))) { - server.getCommandManager().getDispatcher().execute(server.getCommandManager().getDispatcher().parse("tp " + commandSourcePlayerName + " " + target, server.getCommandSource())); + tp(commandSourcePlayerName, target); } else if (OptCarpetSettings.enableTpPrefixBlacklist && checkTpBlacklist(StringArgumentType.getString(context, COMMAND_PREFIX))) { - server.getCommandManager().getDispatcher().execute(server.getCommandManager().getDispatcher().parse("tp " + commandSourcePlayerName + " " + target, server.getCommandSource())); + tp(commandSourcePlayerName, target); } else if (!OptCarpetSettings.enableTpPrefixBlacklist && !OptCarpetSettings.enableTpPrefixWhitelist) { - server.getCommandManager().getDispatcher().execute(server.getCommandManager().getDispatcher().parse("tp " + commandSourcePlayerName + " " + target, server.getCommandSource())); + tp(commandSourcePlayerName, target); } else { Messenger.m(context.getSource(), "r You can't tp to this player because of tp limit."); } @@ -211,16 +235,16 @@ private static void executeTp(String commandSourcePlayerName, CommandContext context, MinecraftServer server) { + private static void executeTpHere(String commandSourcePlayerName, CommandContext context) { String target = StringArgumentType.getString(context, COMMAND_PREFIX); try { if (OptCarpetSettings.enableTpHerePrefixWhitelist && checkTpHereWhitelist(StringArgumentType.getString(context, COMMAND_PREFIX))) { - server.getCommandManager().getDispatcher().execute(server.getCommandManager().getDispatcher().parse("tp " + target + " " + commandSourcePlayerName, server.getCommandSource())); + tp(target, commandSourcePlayerName); } else if (OptCarpetSettings.enableTpHerePrefixBlacklist && checkTpHereBlacklist(StringArgumentType.getString(context, COMMAND_PREFIX))) { - server.getCommandManager().getDispatcher().execute(server.getCommandManager().getDispatcher().parse("tp " + target + " " + commandSourcePlayerName, server.getCommandSource())); + tp(target, commandSourcePlayerName); } else if (!OptCarpetSettings.enableTpHerePrefixBlacklist && !OptCarpetSettings.enableTpHerePrefixWhitelist) { - server.getCommandManager().getDispatcher().execute(server.getCommandManager().getDispatcher().parse("tp " + target + " " + commandSourcePlayerName, server.getCommandSource())); + tp(target, commandSourcePlayerName); } else { Messenger.m(context.getSource(), "r You can't tp here this player because of tp limit."); } @@ -231,38 +255,22 @@ private static void executeTpHere(String commandSourcePlayerName, CommandContext } private static boolean checkTpBlacklist(String name) { - for (String s : OptCarpetSettings.tpLimitConfigBean.TpBlacklist) { - if (name.startsWith(s)) { - return false; - } - } - return true; + return OptCarpetSettings.tpLimitConfigBean.TpBlacklist.stream().noneMatch(name::startsWith); } private static boolean checkTpWhitelist(String name) { - for (String s : OptCarpetSettings.tpLimitConfigBean.TpWhitelist) { - if (name.startsWith(s)) { - return true; - } - } - return false; + return OptCarpetSettings.tpLimitConfigBean.TpWhitelist.stream().anyMatch(name::startsWith); } private static boolean checkTpHereBlacklist(String name) { - for (String s : OptCarpetSettings.tpLimitConfigBean.TphereBlacklist) { - if (name.startsWith(s)) { - return false; - } - } - return true; + return OptCarpetSettings.tpLimitConfigBean.TphereBlacklist.stream().noneMatch(name::startsWith); } private static boolean checkTpHereWhitelist(String name) { - for (String s : OptCarpetSettings.tpLimitConfigBean.TphereWhitelist) { - if (name.startsWith(s)) { - return true; - } - } - return false; + return OptCarpetSettings.tpLimitConfigBean.TphereWhitelist.stream().anyMatch(name::startsWith); + } + + private static void tp(String target, String commandSourcePlayerName) throws CommandSyntaxException { + server.getCommandManager().getDispatcher().execute(server.getCommandManager().getDispatcher().parse("tp " + target + " " + commandSourcePlayerName, server.getCommandSource())); } } \ No newline at end of file diff --git a/src/main/java/io/github/optijava/opt_carpet_addition/commands/TpLimitCommand.java b/src/main/java/io/github/optijava/opt_carpet_addition/commands/TpLimitCommand.java index 3cfe993..724f60b 100644 --- a/src/main/java/io/github/optijava/opt_carpet_addition/commands/TpLimitCommand.java +++ b/src/main/java/io/github/optijava/opt_carpet_addition/commands/TpLimitCommand.java @@ -12,6 +12,8 @@ import static net.minecraft.server.command.CommandManager.argument; import static net.minecraft.server.command.CommandManager.literal; +import static io.github.optijava.opt_carpet_addition.OptCarpetSettings.enableTpmanagerCommand; + public class TpLimitCommand { private TpLimitCommand() { @@ -22,6 +24,11 @@ public static void registerCommand(CommandDispatcher dispat LiteralArgumentBuilder argument = literal("tpmanager") + //#if MC < 12004 + //$$.requires((player) -> carpet.settings.SettingsManager.canUseCommand(source, enableTpmanagerCommand)) + //#else + //$$.requires((player) -> carpet.utils.CommandHelper.canUseCommand(player, enableTpmanagerCommand)) + //#endif .then( literal("reload") .executes(TpLimit::reload) diff --git a/src/main/java/io/github/optijava/opt_carpet_addition/logger/disk/DiskHUDLogger.java b/src/main/java/io/github/optijava/opt_carpet_addition/logger/disk/DiskHUDLogger.java index f45a9a2..4963999 100644 --- a/src/main/java/io/github/optijava/opt_carpet_addition/logger/disk/DiskHUDLogger.java +++ b/src/main/java/io/github/optijava/opt_carpet_addition/logger/disk/DiskHUDLogger.java @@ -6,6 +6,7 @@ import net.minecraft.server.MinecraftServer; //#if MC >= 11900 //$$ import net.minecraft.text.Text; +//$$ import carpet.utils.Messenger; //#else import net.minecraft.text.BaseText; import net.minecraft.text.LiteralText; @@ -19,6 +20,7 @@ public class DiskHUDLogger extends AbstractHUDLogger { public static final DiskHUDLogger INSTANCE; + private static final long TO_GB = 1024L*1024L*1024L; static { try { @@ -44,18 +46,18 @@ public void updateHUD(MinecraftServer server) { //#if MC >= 11900 //$$ for (File f : File.listRoots()) { //$$ if (f.getPath().equals("/")) { - //$$ list.add(Text.of("%s %sGB/%sGB %n".formatted("RootFileSystem", (f.getTotalSpace() - f.getFreeSpace()) / 1024 / 1024 / 1024, f.getTotalSpace() / 1024 / 1024 / 1024))); + //$$ list.add(Text.of(Messenger.c("g %s %sGB/%sGB".formatted("RootFileSystem", (f.getTotalSpace() - f.getFreeSpace()) / TO_GB, f.getTotalSpace() / TO_GB)))); //$$ } else { - //$$ list.add(Text.of("%s %sGB/%sGB %n".formatted(f.getPath(), (f.getTotalSpace() - f.getFreeSpace()) / 1024 / 1024 / 1024, f.getTotalSpace() / 1024 / 1024 / 1024))); + //$$ list.add(Text.of(Messenger.c("g %s %sGB/%sGB".formatted(f.getPath(), (f.getTotalSpace() - f.getFreeSpace()) / TO_GB, f.getTotalSpace() / TO_GB)))); //$$ } //$$ } //$$ LoggerRegistry.getLogger("disk").log(() -> list.toArray(new Text[0])); //#else for (File f : File.listRoots()) { if (f.getPath().equals("/")) { - list.add(new LiteralText("%s %sGB/%sGB %n".formatted("RootFileSystem", (f.getTotalSpace() - f.getFreeSpace()) / 1024 / 1024 / 1024, f.getTotalSpace() / 1024 / 1024 / 1024))); + list.add(new LiteralText("%s %sGB/%sGB".formatted("RootFileSystem", (f.getTotalSpace() - f.getFreeSpace()) / TO_GB, f.getTotalSpace() / TO_GB))); } else { - list.add(new LiteralText("%s %sGB/%sGB %n".formatted(f.getPath(), (f.getTotalSpace() - f.getFreeSpace()) / 1024 / 1024 / 1024, f.getTotalSpace() / 1024 / 1024 / 1024))); + list.add(new LiteralText("%s %sGB/%sGB".formatted(f.getPath(), (f.getTotalSpace() - f.getFreeSpace()) / TO_GB, f.getTotalSpace() / TO_GB))); } } LoggerRegistry.getLogger("disk").log(() -> list.toArray(new BaseText[0])); diff --git a/src/main/java/io/github/optijava/opt_carpet_addition/mixins/rule/commandLogger/CommandManager_Mixin.java b/src/main/java/io/github/optijava/opt_carpet_addition/mixins/rule/commandLogger/CommandManager_Mixin.java index b12b10d..1f6fefb 100644 --- a/src/main/java/io/github/optijava/opt_carpet_addition/mixins/rule/commandLogger/CommandManager_Mixin.java +++ b/src/main/java/io/github/optijava/opt_carpet_addition/mixins/rule/commandLogger/CommandManager_Mixin.java @@ -7,21 +7,21 @@ //#if MC >= 12000 //$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; //#endif + import carpet.CarpetServer; import carpet.utils.Messenger; import io.github.optijava.opt_carpet_addition.OptCarpetSettings; +import io.github.optijava.opt_carpet_addition.utils.McUtils; import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.server.network.ServerPlayerEntity; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -//#if MC <= 12001 import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -//#endif + @Mixin(CommandManager.class) public class CommandManager_Mixin { @@ -52,11 +52,9 @@ public void injectExecute(ServerCommandSource commandSource, String command, Cal return; } - for (String var1 : OptCarpetSettings.commandLoggerConfigBean.LogCommandPrefixWhitelist) { - if (command.startsWith(var1)) { - logCommand(command, commandSource); - return; - } + if (OptCarpetSettings.commandLoggerConfigBean.LogCommandPrefixWhitelist.stream().anyMatch(command::startsWith)) { + logCommand(command, commandSource); + return; } if (OptCarpetSettings.commandLoggerConfigBean.LogCommandWhitelist.isEmpty() && OptCarpetSettings.commandLoggerConfigBean.LogCommandPrefixWhitelist.isEmpty()) { @@ -65,15 +63,8 @@ public void injectExecute(ServerCommandSource commandSource, String command, Cal return; } - if (OptCarpetSettings.commandLoggerConfigBean.LogCommandPrefixBlacklist.isEmpty() && OptCarpetSettings.commandLoggerConfigBean.LogCommandBlacklist.contains(command)) { - return; - } - - for (String var2 : OptCarpetSettings.commandLoggerConfigBean.LogCommandPrefixBlacklist) { - if (command.startsWith(var2)) { - return; - } - } + if (OptCarpetSettings.commandLoggerConfigBean.LogCommandPrefixBlacklist.isEmpty() && OptCarpetSettings.commandLoggerConfigBean.LogCommandBlacklist.contains(command)) return; + if (OptCarpetSettings.commandLoggerConfigBean.LogCommandPrefixBlacklist.stream().anyMatch(command::startsWith)) return; logCommand(command, commandSource); } } else if (OptCarpetSettings.commandLoggerConfigBean.logAllCommand && OptCarpetSettings.commandLogger) { @@ -87,21 +78,21 @@ private void logCommand(String command, ServerCommandSource commandSource){ if (OptCarpetSettings.commandLoggerBroadcastToPlayer.equals("true")) { Messenger.print_server_message(CarpetServer.minecraft_server, Messenger.c( - "gi [", - "li " + commandSource.getName(), - "gi : " + command + "]" - )); + "gi [", + "li " + commandSource.getName(), + "gi : " + command + "]" + )); } else if (OptCarpetSettings.commandLoggerBroadcastToPlayer.equals("ops")) { - for (ServerPlayerEntity serverPlayerEntity : CarpetServer.minecraft_server.getPlayerManager().getPlayerList()) { - if (!CarpetServer.minecraft_server.getPlayerManager().isOperator(serverPlayerEntity.getGameProfile())) { - continue; - } - Messenger.m(serverPlayerEntity, Messenger.c( - "gi [", + CarpetServer.minecraft_server.getPlayerManager().getPlayerList().forEach(serverPlayerEntity -> { + if (McUtils.isOp(serverPlayerEntity.getGameProfile())) { + Messenger.m(serverPlayerEntity, Messenger.c( + "gi [", "li " + commandSource.getName(), "gi : " + command + "]" )); - } + } + + }); } } } diff --git a/src/main/java/io/github/optijava/opt_carpet_addition/mixins/rule/optimizeFakePlayerSpawn/EntityPlayerMPFake_Mixin.java b/src/main/java/io/github/optijava/opt_carpet_addition/mixins/rule/optimizeFakePlayerSpawn/EntityPlayerMPFake_Mixin.java index c9e7e45..8779a2f 100644 --- a/src/main/java/io/github/optijava/opt_carpet_addition/mixins/rule/optimizeFakePlayerSpawn/EntityPlayerMPFake_Mixin.java +++ b/src/main/java/io/github/optijava/opt_carpet_addition/mixins/rule/optimizeFakePlayerSpawn/EntityPlayerMPFake_Mixin.java @@ -5,6 +5,11 @@ import io.github.optijava.opt_carpet_addition.OptCarpetSettings; //#if MC >= 11900 //$$ import net.minecraft.util.Uuids; +//#endif +//#if MC >= 12110 +//$$ import net.minecraft.server.ServerConfigHandler; +//$$ import net.minecraft.server.MinecraftServer; +//$$ import java.util.UUID; //#else import net.minecraft.entity.player.PlayerEntity; //#endif @@ -17,7 +22,7 @@ @Mixin(EntityPlayerMPFake.class) public abstract class EntityPlayerMPFake_Mixin { - + //#if MC < 12110 @Redirect( method = "createFake", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/UserCache;findByName(Ljava/lang/String;)Ljava/util/Optional;") @@ -33,4 +38,5 @@ private static Optional redirectCreateFake(UserCache instance, Stri return instance.findByName(playerName); } } + //#endif } diff --git a/src/main/java/io/github/optijava/opt_carpet_addition/mixins/rule/optimizeFakePlayerSpawn/PlayerCommand_Mixin.java b/src/main/java/io/github/optijava/opt_carpet_addition/mixins/rule/optimizeFakePlayerSpawn/PlayerCommand_Mixin.java index 38e0b65..e7b3694 100644 --- a/src/main/java/io/github/optijava/opt_carpet_addition/mixins/rule/optimizeFakePlayerSpawn/PlayerCommand_Mixin.java +++ b/src/main/java/io/github/optijava/opt_carpet_addition/mixins/rule/optimizeFakePlayerSpawn/PlayerCommand_Mixin.java @@ -5,6 +5,16 @@ import io.github.optijava.opt_carpet_addition.OptCarpetSettings; //#if MC >= 11900 //$$ import net.minecraft.util.Uuids; +//#endif +//#if MC >= 12110 +//$$ import net.minecraft.server.ServerConfigHandler; +//$$ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +//$$ import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +//$$ import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +//$$ import io.github.optijava.opt_carpet_addition.OptCarpetSettings; +//$$ import net.minecraft.server.PlayerConfigEntry; +//$$ import net.minecraft.util.NameToIdCache; +//$$ import java.util.UUID; //#else import net.minecraft.entity.player.PlayerEntity; //#endif @@ -17,7 +27,7 @@ @Mixin(PlayerCommand.class) public abstract class PlayerCommand_Mixin { - + //#if MC < 12110 @Redirect( method = "cantSpawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/UserCache;findByName(Ljava/lang/String;)Ljava/util/Optional;") @@ -33,4 +43,5 @@ private static Optional redirectFindByName(UserCache instance, Stri return instance.findByName(playerName); } } + //#endif } diff --git a/src/main/java/io/github/optijava/opt_carpet_addition/utils/McUtils.java b/src/main/java/io/github/optijava/opt_carpet_addition/utils/McUtils.java new file mode 100644 index 0000000..a63f421 --- /dev/null +++ b/src/main/java/io/github/optijava/opt_carpet_addition/utils/McUtils.java @@ -0,0 +1,21 @@ +package io.github.optijava.opt_carpet_addition.utils; + +import carpet.CarpetServer; +import com.mojang.authlib.GameProfile; +import net.minecraft.server.MinecraftServer; +//#if MC >= 12110 +//$$ import net.minecraft.server.PlayerConfigEntry; +//#endif + + +public class McUtils { + private static final MinecraftServer server = CarpetServer.minecraft_server; + + public static boolean isOp(GameProfile gameProfile) { + //#if MC < 12110 + return server.getPlayerManager().isOperator(gameProfile); + //#else + //$$ return server.getPlayerManager().isOperator(server.getPlayerManager().getPlayer(gameProfile.id()).getPlayerConfigEntry()); + //#endif + } +} diff --git a/src/main/resources/assets/opt-carpet-addition/lang/zh_cn.json b/src/main/resources/assets/opt-carpet-addition/lang/zh_cn.json new file mode 100644 index 0000000..ee47e98 --- /dev/null +++ b/src/main/resources/assets/opt-carpet-addition/lang/zh_cn.json @@ -0,0 +1,73 @@ +{ + "carpet.rule.commandTpToFakePlayer.name": "传送到假人命令", + "carpet.rule.commandTpToFakePlayer.desc": "启用命令 [/player xxx tp] 将玩家传送到假人", + "carpet.rule.allowTpToRealPlayer.name": "传送到真实玩家命令", + "carpet.rule.allowTpToRealPlayer.desc": "启用命令 [/player xxx tp] 将玩家传送到真实玩家", + "carpet.rule.commandTpHereFakePlayer.name": "传送假人到自己命令", + "carpet.rule.commandTpHereFakePlayer.desc": "启用命令 [/player xxx tp] 将假人传送到自己", + "carpet.rule.allowTpHereRealPlayer.name": "传送真实玩家到自己命令", + "carpet.rule.allowTpHereRealPlayer.desc": "启用命令 [/player xxx tp] 将真实玩家传送到自己", + "carpet.rule.forceFakePlayerGameMode.name": "强制假人游戏模式", + "carpet.rule.forceFakePlayerGameMode.desc": "强制设置假人的游戏模式(生存/创造/冒险/关闭)", + "carpet.rule.fixXpLevelBug.name": "刷新经验等级漏洞修复", + "carpet.rule.fixXpLevelBug.desc": "当玩家切换世界时刷新经验等级", + "carpet.rule.enableTpPrefixBlacklist.name": "启用传送前缀黑名单", + "carpet.rule.enableTpPrefixBlacklist.desc": "启用传送命令前缀黑名单", + "carpet.rule.enableTpPrefixWhitelist.name": "启用传送前缀白名单", + "carpet.rule.enableTpPrefixWhitelist.desc": "启用传送命令前缀白名单", + "carpet.rule.enableTpHerePrefixBlacklist.name": "启用传送到自己前缀黑名单", + "carpet.rule.enableTpHerePrefixBlacklist.desc": "启用传送到自己命令前缀黑名单", + "carpet.rule.enableTpHerePrefixWhitelist.name": "启用传送到自己前缀白名单", + "carpet.rule.enableTpHerePrefixWhitelist.desc": "启用传送到自己命令前缀白名单", + "carpet.rule.disabledLayEggs.name": "禁用鸡产蛋", + "carpet.rule.disabledLayEggs.desc": "禁用鸡下蛋", + "carpet.rule.disabledEnderManPickupGoal.name": "禁用末影人拾取方块目标", + "carpet.rule.disabledEnderManPickupGoal.desc": "禁用末影人拾取方块的目标行为", + "carpet.rule.disabledEnderManPlaceBlockGoal.name": "禁用末影人放置方块目标", + "carpet.rule.disabledEnderManPlaceBlockGoal.desc": "禁用末影人放置方块的目标行为", + "carpet.rule.disabledNetherPortalSpawn.name": "禁用下界传送门生成僵尸猪灵", + "carpet.rule.disabledNetherPortalSpawn.desc": "禁用通过下界传送门生成僵尸猪灵", + "carpet.rule.disabledEntityTick.name": "禁用实体与方块实体刷新", + "carpet.rule.disabledEntityTick.desc": "禁用所有实体和方块实体的 tick", + "carpet.rule.disabledUpdateSuppressionErrorStackTrace.name": "禁用更新抑制错误堆栈", + "carpet.rule.disabledUpdateSuppressionErrorStackTrace.desc": "禁用更新抑制时产生的错误堆栈", + "carpet.rule.unescapeChatMessage.name": "解码聊天消息", + "carpet.rule.unescapeChatMessage.desc": "解码聊天消息中的 Unicode 字符,例如 \\u4e2d -> 中", + "carpet.rule.optimizePlayerConnect.name": "优化玩家连接", + "carpet.rule.optimizePlayerConnect.desc": "在新线程处理玩家连接以减少延迟", + "carpet.rule.optimizeTeleport.name": "优化玩家传送", + "carpet.rule.optimizeTeleport.desc": "在新线程处理玩家传送以减少延迟", + "carpet.rule.commandLogger.name": "命令日志记录器", + "carpet.rule.commandLogger.desc": "打印玩家提交的命令信息日志", + "carpet.rule.dropperCrashFix.name": "投掷器崩溃修复", + "carpet.rule.dropperCrashFix.desc": "修复投掷器崩溃问题", + "carpet.rule.optimizeFakePlayerSpawn.name": "优化假人生成", + "carpet.rule.optimizeFakePlayerSpawn.desc": "始终生成离线假人以减少延迟", + "carpet.rule.cceSuppressionCrashFix.name": "修复CCE抑制崩溃", + "carpet.rule.cceSuppressionCrashFix.desc": "修复因方块实体更新导致的 CCE 崩溃", + "carpet.rule.removeAllCurseOfBindingArmorWhenPlayerDeadInWall.name": "死亡时移除所有绑定诅咒盔甲", + "carpet.rule.removeAllCurseOfBindingArmorWhenPlayerDeadInWall.desc": "玩家死于墙内时移除所有带‘绑定诅咒’的盔甲(保留物品需开启 keepInventory)", + "carpet.rule.customItemDiscardTime.name": "自定义物品消失时间", + "carpet.rule.customItemDiscardTime.desc": "修改物品消失时间,默认值 -1(单位:tick)", + "carpet.rule.allowBlockUpdateLogger.name": "允许方块更新记录器", + "carpet.rule.allowBlockUpdateLogger.desc": "不推荐启用此规则,否则可能影响性能。启用后所有人都无法使用方块更新记录器", + "carpet.rule.removeBats.name": "移除蝙蝠", + "carpet.rule.removeBats.desc": "禁用蝙蝠生成", + "carpet.rule.playerTpRateLimitTime.name": "传送命令速率限制", + "carpet.rule.playerTpRateLimitTime.desc": "设置 `/player xxx tp` 命令的速率限制,默认每玩家每 2 秒允许 1 次请求", + "carpet.rule.commandLoggerBroadcastToPlayer.name": "命令日志广播", + "carpet.rule.commandLoggerBroadcastToPlayer.desc": "启用后命令日志将广播给指定玩家", + "carpet.rule.disallowRedstoneWireConnectsToOpenTrapdoor.name": "禁止红石线连接到打开的活板门", + "carpet.rule.disallowRedstoneWireConnectsToOpenTrapdoor.desc": "禁止红石线连接到打开的活板门(适用于 Minecraft 1.20 及以上版本)", + "carpet.rule.allowSpectatorTpToAnyPlayer.name": "允许旁观者传送到任意玩家", + "carpet.rule.allowSpectatorTpToAnyPlayer.desc": "允许旁观者使用传送命令传送到任意玩家", + "carpet.rule.enableLoggerCommand.name": "启用命令日志记录", + "carpet.rule.enableLoggerCommand.desc": "启用命令日志记录功能", + "carpet.rule.enableCrashCommand.name": "启用崩溃命令", + "carpet.rule.enableCrashCommand.desc": "启用可以触发崩溃的命令", + "carpet.rule.enableListAdvanceCommand.name": "启用高级列表命令", + "carpet.rule.enableListAdvanceCommand.desc": "启用高级列表功能命令", + "carpet.rule.enableTpmanagerCommand.name": "启用传送管理命令", + "carpet.rule.enableTpmanagerCommand.desc": "启用传送管理相关命令" +} + diff --git a/versions/1.21.10/gradle.properties b/versions/1.21.10/gradle.properties new file mode 100644 index 0000000..323de52 --- /dev/null +++ b/versions/1.21.10/gradle.properties @@ -0,0 +1,17 @@ +# Fabric Properties + # check these on https://fabricmc.net/versions.html?&version=1.20.1 + minecraft_version=1.21.10 + yarn_mappings=1.21.10+build.2 + +# Fabric Mod Metadata + minecraft_requirement_version=1.21.x + carpet_requirement_version=>=1.4.147 + +# Build Information + # The target mc versions for the mod during mod publishing, separated with \n + game_versions=1.21.10 + +# Dependencies + fabric_version=0.136.0+1.21.10 + carpet_core_version=7113642 + diff --git a/versions/1.21.10/opt-carpet-addition.accesswidener b/versions/1.21.10/opt-carpet-addition.accesswidener new file mode 100644 index 0000000..a73320e --- /dev/null +++ b/versions/1.21.10/opt-carpet-addition.accesswidener @@ -0,0 +1,16 @@ +accessWidener v1 named +accessible class net/minecraft/entity/mob/EndermanEntity$PickUpBlockGoal +accessible class net/minecraft/entity/mob/EndermanEntity$PlaceBlockGoal +mutable field net/minecraft/network/packet/c2s/play/ChatMessageC2SPacket chatMessage Ljava/lang/String; +accessible field net/minecraft/network/packet/c2s/play/ChatMessageC2SPacket chatMessage Ljava/lang/String; +accessible field net/minecraft/server/network/ServerLoginNetworkHandler server Lnet/minecraft/server/MinecraftServer; +accessible method net/minecraft/entity/Entity unsetRemoved ()V +accessible method net/minecraft/server/network/ServerPlayerEntity worldChanged (Lnet/minecraft/server/world/ServerWorld;)V +accessible class net/minecraft/world/block/ChainRestrictedNeighborUpdater$Entry +accessible class net/minecraft/world/block/ChainRestrictedNeighborUpdater$SimpleEntry +accessible class net/minecraft/world/block/ChainRestrictedNeighborUpdater$StateReplacementEntry +accessible class net/minecraft/world/block/ChainRestrictedNeighborUpdater$StatefulEntry +accessible class net/minecraft/world/block/ChainRestrictedNeighborUpdater$SixWayEntry +accessible field net/minecraft/world/block/ChainRestrictedNeighborUpdater$SixWayEntry sourceBlock Lnet/minecraft/block/Block; +accessible field net/minecraft/world/block/ChainRestrictedNeighborUpdater$SixWayEntry pos Lnet/minecraft/util/math/BlockPos; +accessible field net/minecraft/server/network/ServerPlayerEntity server Lnet/minecraft/server/MinecraftServer; \ No newline at end of file