diff --git a/src/main/java/org/examp/john/ChatLogger.java b/src/main/java/org/examp/john/ChatLogger.java index 20e6eb8..e71cbf2 100644 --- a/src/main/java/org/examp/john/ChatLogger.java +++ b/src/main/java/org/examp/john/ChatLogger.java @@ -48,7 +48,7 @@ public class ChatLogger { ); } - private static String formatPos(ServerPlayer player) { + static String formatPos(ServerPlayer player) { ServerLevel level = player.level(); // У ResourceKey дістаємо Identifier/ResourceLocation через .identifier(), diff --git a/src/main/java/org/examp/john/CommandLogger.java b/src/main/java/org/examp/john/CommandLogger.java new file mode 100644 index 0000000..63cf9e4 --- /dev/null +++ b/src/main/java/org/examp/john/CommandLogger.java @@ -0,0 +1,21 @@ +package org.examp.john; + +import net.minecraft.server.level.ServerPlayer; + +/** + * Логує команди, які виконують гравці, в консоль сервера. + * Формат: хто виконав ➔ яка команда ➔ координати гравця. + */ +public class CommandLogger { + + public static void logCommand(ServerPlayer player, String command) { + String normalized = command.startsWith("/") ? command : "/" + command; + + MSNexus.magicModLog.info( + "[CMD] {} ran: \"{}\" | pos: {}", + player.getName().getString(), + normalized, + ChatLogger.formatPos(player) + ); + } +} diff --git a/src/main/java/org/examp/john/mixin/CommandLogMixin.java b/src/main/java/org/examp/john/mixin/CommandLogMixin.java new file mode 100644 index 0000000..dc5e0f3 --- /dev/null +++ b/src/main/java/org/examp/john/mixin/CommandLogMixin.java @@ -0,0 +1,38 @@ +package org.examp.john.mixin; + +import com.mojang.brigadier.ParseResults; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.server.level.ServerPlayer; +import org.examp.john.CommandLogger; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * Логує виконання команд гравцями в консоль сервера. + * Хукає Commands.performCommand — спільну точку виконання всіх команд. + */ +@Mixin(Commands.class) +public class CommandLogMixin { + + @Inject( + method = "performCommand(Lcom/mojang/brigadier/ParseResults;Ljava/lang/String;)V", + at = @At("HEAD") + ) + private void msnexus$logExecutedCommand(ParseResults parseResults, String command, CallbackInfo ci) { + try { + CommandSourceStack source = parseResults.getContext().getSource(); + if (source == null) { + return; + } + ServerPlayer player = source.getPlayer(); + if (player != null) { + CommandLogger.logCommand(player, command); + } + } catch (Exception e) { + org.examp.john.MSNexus.magicModLog.warn("[CMD] Не вдалося залогувати команду: {}", e.getMessage()); + } + } +} diff --git a/src/main/java/org/examp/john/mixin/SpectatorTabMixin.java b/src/main/java/org/examp/john/mixin/SpectatorTabMixin.java new file mode 100644 index 0000000..2d52508 --- /dev/null +++ b/src/main/java/org/examp/john/mixin/SpectatorTabMixin.java @@ -0,0 +1,24 @@ +package org.examp.john.mixin; + +import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.GameType; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(ClientboundPlayerInfoUpdatePacket.Entry.class) +public class SpectatorTabMixin { + + @Redirect( + method = "(Lnet/minecraft/server/level/ServerPlayer;)V", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/level/ServerPlayer;gameMode()Lnet/minecraft/world/level/GameType;" + ) + ) + private static GameType msnexus$highlightSpectatorsInTab(ServerPlayer player) { + GameType gameMode = player.gameMode(); + return gameMode == GameType.SPECTATOR ? GameType.SURVIVAL : gameMode; + } +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 452a961..236da3d 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -7,24 +7,17 @@ "authors": [], "contact": {}, "license": "All-Rights-Reserved", - "environment": "*", + "environment": "server", "entrypoints": { "fabric-datagen": [ "org.examp.john.client.MSNexusDataGenerator" ], - "client": [ - "org.examp.john.client.MSNexusClient" - ], "main": [ "org.examp.john.MSNexus" ] }, "mixins": [ - "msnexus.mixins.json", - { - "config": "msnexus.client.mixins.json", - "environment": "client" - } + "msnexus.mixins.json" ], "depends": { "fabricloader": ">=${loader_version}", diff --git a/src/main/resources/msnexus.mixins.json b/src/main/resources/msnexus.mixins.json index eb1a5f0..fb727b4 100644 --- a/src/main/resources/msnexus.mixins.json +++ b/src/main/resources/msnexus.mixins.json @@ -4,6 +4,8 @@ "package": "org.examp.john.mixin", "compatibilityLevel": "JAVA_25", "mixins": [ + "CommandLogMixin", + "SpectatorTabMixin" ], "injectors": { "defaultRequire": 1