diff --git a/src/main/java/de/winniepat/parrotmod/Parrotmod.java b/src/main/java/de/winniepat/parrotmod/Parrotmod.java index 82632a6..9f0f5e1 100644 --- a/src/main/java/de/winniepat/parrotmod/Parrotmod.java +++ b/src/main/java/de/winniepat/parrotmod/Parrotmod.java @@ -1,5 +1,6 @@ package de.winniepat.parrotmod; +import de.winniepat.parrotmod.command.CommandManager; import de.winniepat.parrotmod.config.ConfigManager; import de.winniepat.parrotmod.discord.DiscordRPCManager; import net.fabricmc.api.ModInitializer; @@ -19,6 +20,7 @@ public class Parrotmod implements ModInitializer { public void onInitialize() { ConfigManager.load(); DiscordRPCManager.init(); + CommandManager.init(); ClientLifecycleEvents.CLIENT_STOPPING.register(client -> DiscordRPCManager.shutdown()); diff --git a/src/main/java/de/winniepat/parrotmod/command/Command.java b/src/main/java/de/winniepat/parrotmod/command/Command.java new file mode 100644 index 0000000..f54eea4 --- /dev/null +++ b/src/main/java/de/winniepat/parrotmod/command/Command.java @@ -0,0 +1,9 @@ +package de.winniepat.parrotmod.command; + +import com.mojang.brigadier.CommandDispatcher; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.minecraft.commands.CommandBuildContext; + +public interface Command { + void register(CommandDispatcher dispatcher, CommandBuildContext registryAccess); +} diff --git a/src/main/java/de/winniepat/parrotmod/command/CommandManager.java b/src/main/java/de/winniepat/parrotmod/command/CommandManager.java new file mode 100644 index 0000000..0e63f03 --- /dev/null +++ b/src/main/java/de/winniepat/parrotmod/command/CommandManager.java @@ -0,0 +1,19 @@ +package de.winniepat.parrotmod.command; + +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import java.util.ArrayList; +import java.util.List; + +public class CommandManager { + private static final List COMMANDS = new ArrayList<>(); + + public static void init() { + COMMANDS.add(new ParrotModCommand()); + + ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> { + for (Command command : COMMANDS) { + command.register(dispatcher, registryAccess); + } + }); + } +} diff --git a/src/main/java/de/winniepat/parrotmod/command/ParrotModCommand.java b/src/main/java/de/winniepat/parrotmod/command/ParrotModCommand.java new file mode 100644 index 0000000..916f9e1 --- /dev/null +++ b/src/main/java/de/winniepat/parrotmod/command/ParrotModCommand.java @@ -0,0 +1,39 @@ +package de.winniepat.parrotmod.command; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import de.winniepat.parrotmod.command.subcommands.InfoCommand; +import de.winniepat.parrotmod.command.subcommands.ServerCommand; +import de.winniepat.parrotmod.command.subcommands.SettingsCommand; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.minecraft.commands.CommandBuildContext; +import net.minecraft.network.chat.Component; + +import java.util.ArrayList; +import java.util.List; + +public class ParrotModCommand implements Command { + private final List subCommands = new ArrayList<>(); + + public ParrotModCommand() { + subCommands.add(new SettingsCommand()); + subCommands.add(new InfoCommand()); + subCommands.add(new ServerCommand()); + } + + @Override + public void register(CommandDispatcher dispatcher, CommandBuildContext registryAccess) { + LiteralArgumentBuilder builder = LiteralArgumentBuilder.literal("parrotmod"); + + for (SubCommand subCommand : subCommands) { + subCommand.build(builder, registryAccess); + } + + builder.executes(context -> { + context.getSource().sendFeedback(Component.literal("ParrotMod is active! Use /parrotmod settings to open the configuration.")); + return 1; + }); + + dispatcher.register(builder); + } +} diff --git a/src/main/java/de/winniepat/parrotmod/command/SubCommand.java b/src/main/java/de/winniepat/parrotmod/command/SubCommand.java new file mode 100644 index 0000000..39aafa5 --- /dev/null +++ b/src/main/java/de/winniepat/parrotmod/command/SubCommand.java @@ -0,0 +1,9 @@ +package de.winniepat.parrotmod.command; + +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.minecraft.commands.CommandBuildContext; + +public interface SubCommand { + void build(LiteralArgumentBuilder builder, CommandBuildContext registryAccess); +} diff --git a/src/main/java/de/winniepat/parrotmod/command/subcommands/InfoCommand.java b/src/main/java/de/winniepat/parrotmod/command/subcommands/InfoCommand.java new file mode 100644 index 0000000..1b3a0d1 --- /dev/null +++ b/src/main/java/de/winniepat/parrotmod/command/subcommands/InfoCommand.java @@ -0,0 +1,19 @@ +package de.winniepat.parrotmod.command.subcommands; + +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import de.winniepat.parrotmod.command.SubCommand; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.minecraft.commands.CommandBuildContext; +import net.minecraft.network.chat.Component; + +public class InfoCommand implements SubCommand { + @Override + public void build(LiteralArgumentBuilder builder, CommandBuildContext registryAccess) { + builder.then(LiteralArgumentBuilder.literal("info") + .executes(context -> { + context.getSource().sendFeedback(Component.literal("ParrotMod - A utility mod for Minecraft.")); + return 1; + }) + ); + } +} diff --git a/src/main/java/de/winniepat/parrotmod/command/subcommands/ServerCommand.java b/src/main/java/de/winniepat/parrotmod/command/subcommands/ServerCommand.java new file mode 100644 index 0000000..c7629fd --- /dev/null +++ b/src/main/java/de/winniepat/parrotmod/command/subcommands/ServerCommand.java @@ -0,0 +1,56 @@ +package de.winniepat.parrotmod.command.subcommands; + +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import de.winniepat.parrotmod.command.SubCommand; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ServerData; +import net.minecraft.client.multiplayer.resolver.ServerAddress; +import net.minecraft.commands.CommandBuildContext; +import net.minecraft.network.chat.Component; +import net.minecraft.server.ServerInfo; +import net.minecraft.world.Difficulty; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.attribute.EnvironmentAttribute; +import net.minecraft.world.attribute.EnvironmentAttributes; +import net.minecraft.world.level.dimension.DimensionType; + +public class ServerCommand implements SubCommand { + @Override + public void build(LiteralArgumentBuilder builder, CommandBuildContext registryAccess) { + builder.then(LiteralArgumentBuilder.literal("server") + .executes(context -> { + Minecraft mc = Minecraft.getInstance(); + ServerData serverData = mc.getCurrentServer(); + + if (serverData != null) { + context.getSource().sendFeedback(Component.literal("IP: " + serverData.ip)); + context.getSource().sendFeedback(Component.literal("Port: " + getPort(serverData))); + context.getSource().sendFeedback(Component.literal("Motd:")); + context.getSource().sendFeedback(Component.literal(serverData.motd.getString())); + context.getSource().sendFeedback(Component.literal("Version: " + serverData.version.getString())); + context.getSource().sendFeedback(Component.literal("Protocol Version" + serverData.protocol)); + + String difficulty = mc.level.getDifficulty().getDisplayName().getString(); + Difficulty diff = new DifficultyInstance( + mc.level.getDifficulty(), + mc.level.getGameTime(), + mc.level.getChunk(mc.player.blockPosition()).getInhabitedTime(), + DimensionType.MOON_BRIGHTNESS_PER_PHASE[mc.level.environmentAttributes().getValue(EnvironmentAttributes.MOON_PHASE, mc.player.blockPosition()).index()] + ).getDifficulty(); + + context.getSource().sendFeedback(Component.literal("Difficulty: " + difficulty + " (Local: " + diff.getDisplayName().getString() + ")")); + context.getSource().sendFeedback(Component.literal("Day: " + mc.level.getGameTime() / 24000L)); + } + return 1; + }) + ); + } + + public int getPort(ServerData serverData) { + String rawAddress = serverData.ip; + ServerAddress address = ServerAddress.parseString(rawAddress); + + return address.getPort(); + } +} diff --git a/src/main/java/de/winniepat/parrotmod/command/subcommands/SettingsCommand.java b/src/main/java/de/winniepat/parrotmod/command/subcommands/SettingsCommand.java new file mode 100644 index 0000000..32806c7 --- /dev/null +++ b/src/main/java/de/winniepat/parrotmod/command/subcommands/SettingsCommand.java @@ -0,0 +1,20 @@ +package de.winniepat.parrotmod.command.subcommands; + +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import de.winniepat.parrotmod.command.SubCommand; +import de.winniepat.parrotmod.ui.SettingsFragment; +import icyllis.modernui.mc.MuiModApi; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.minecraft.commands.CommandBuildContext; + +public class SettingsCommand implements SubCommand { + @Override + public void build(LiteralArgumentBuilder builder, CommandBuildContext registryAccess) { + builder.then(LiteralArgumentBuilder.literal("settings") + .executes(context -> { + MuiModApi.get().openScreen(new SettingsFragment()); + return 1; + }) + ); + } +} diff --git a/src/main/resources/assets/parrotmod/icon.png b/src/main/resources/assets/parrotmod/icon.png new file mode 100644 index 0000000..e96745e Binary files /dev/null and b/src/main/resources/assets/parrotmod/icon.png differ diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 676948c..d9e6f7c 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -7,7 +7,7 @@ "authors": [], "contact": {}, "license": "All-Rights-Reserved", - "icon": "assets/parrotmod/textures/gui/sprites/icon.png", + "icon": "assets/parrotmod/icon.png", "environment": "*", "entrypoints": { "main": [