diff --git a/src/main/java/semmiedev/disc_jockey/DiscjockeyCommand.java b/src/main/java/semmiedev/disc_jockey/DiscjockeyCommand.java index 862d6a1..1c527c6 100644 --- a/src/main/java/semmiedev/disc_jockey/DiscjockeyCommand.java +++ b/src/main/java/semmiedev/disc_jockey/DiscjockeyCommand.java @@ -5,19 +5,32 @@ import com.mojang.brigadier.arguments.FloatArgumentType; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.context.CommandContext; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.minecraft.block.enums.Instrument; import net.minecraft.client.MinecraftClient; import net.minecraft.command.CommandSource; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; import semmiedev.disc_jockey.gui.screen.DiscJockeyScreen; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Map; import java.util.Optional; import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument; import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; public class DiscjockeyCommand { + + public static void register(CommandDispatcher commandDispatcher) { + final ArrayList instrumentNames = new ArrayList<>(); + for (Instrument instrument : Instrument.values()) { + instrumentNames.add(instrument.toString().toLowerCase()); + } + final ArrayList instrumentNamesAndAll = new ArrayList<>(instrumentNames); + instrumentNamesAndAll.add("all"); + commandDispatcher.register( literal("discjockey") .executes(context -> { @@ -98,6 +111,109 @@ public class DiscjockeyCommand { } }) ) + .then(literal("remapInstruments") + .executes(context -> { + context.getSource().sendFeedback(Text.translatable(Main.MOD_ID + ".instrument_info")); + return 0; + }) + .then(literal("map") + .then(argument("originalInstrument", StringArgumentType.word()) + .suggests((context, builder) -> CommandSource.suggestMatching(instrumentNamesAndAll, builder)) + .then(argument("newInstrument", StringArgumentType.word()) + .suggests((context, builder) -> CommandSource.suggestMatching(instrumentNames, builder)) + .executes(context -> { + String originalInstrumentStr = StringArgumentType.getString(context, "originalInstrument"); + String newInstrumentStr = StringArgumentType.getString(context, "newInstrument"); + Instrument originalInstrument = null, newInstrument = null; + for(Instrument maybeInstrument : Instrument.values()) { + if(maybeInstrument.toString().equalsIgnoreCase(originalInstrumentStr)) { + originalInstrument = maybeInstrument; + } + if(maybeInstrument.toString().equalsIgnoreCase(newInstrumentStr)) { + newInstrument = maybeInstrument; + } + } + + if(originalInstrument == null && !originalInstrumentStr.equalsIgnoreCase("all")) { + context.getSource().sendFeedback(Text.translatable(Main.MOD_ID + ".invalid_instrument", originalInstrumentStr)); + return 0; + } + + if(newInstrument == null) { + context.getSource().sendFeedback(Text.translatable(Main.MOD_ID + ".invalid_instrument", newInstrumentStr)); + return 0; + } + + if(originalInstrument == null) { + // All instruments + for(Instrument instrument : Instrument.values()) { + Main.SONG_PLAYER.instrumentMap.put(instrument, newInstrument); + } + context.getSource().sendFeedback(Text.translatable(Main.MOD_ID + ".instrument_mapped_all", newInstrumentStr.toLowerCase())); + }else { + Main.SONG_PLAYER.instrumentMap.put(originalInstrument, newInstrument); + context.getSource().sendFeedback(Text.translatable(Main.MOD_ID + ".instrument_mapped", originalInstrumentStr.toLowerCase(), newInstrumentStr.toLowerCase())); + } + return 1; + }) + ) + ) + ) + .then(literal("unmap") + .then(argument("instrument", StringArgumentType.word()) + .suggests((context, builder) -> CommandSource.suggestMatching(instrumentNames, builder)) + .executes(context -> { + String instrumentStr = StringArgumentType.getString(context, "instrument"); + + Instrument instrument = null; + for(Instrument maybeInstrument : Instrument.values()) { + if(maybeInstrument.toString().equalsIgnoreCase(instrumentStr)) { + instrument = maybeInstrument; + break; + } + } + + if(instrument == null) { + context.getSource().sendFeedback(Text.translatable(Main.MOD_ID + ".invalid_instrument", instrumentStr)); + return 0; + } + + Main.SONG_PLAYER.instrumentMap.remove(instrument); + context.getSource().sendFeedback(Text.translatable(Main.MOD_ID + ".instrument_unmapped", instrumentStr.toLowerCase())); + return 1; + }) + ) + ) + .then(literal("show") + .executes(context -> { + if(Main.SONG_PLAYER.instrumentMap.isEmpty()) { + context.getSource().sendFeedback(Text.translatable(Main.MOD_ID + ".no_mapped_instruments")); + return 1; + } + + StringBuilder maps = new StringBuilder(); + for(Map.Entry entry : Main.SONG_PLAYER.instrumentMap.entrySet()) { + if(maps.length() > 0) { + maps.append(", "); + } + maps + .append(entry.getKey().toString().toLowerCase()) + .append(" -> ") + .append(entry.getValue().toString().toLowerCase()); + } + context.getSource().sendFeedback(Text.translatable(Main.MOD_ID + ".mapped_instruments", maps.toString())); + return 1; + }) + ) + .then(literal("clear") + .executes(context -> { + Main.SONG_PLAYER.instrumentMap.clear(); + context.getSource().sendFeedback(Text.translatable(Main.MOD_ID + ".instrument_maps_cleared")); + return 1; + }) + ) + ) + ); } diff --git a/src/main/resources/assets/disc_jockey/lang/en_us.json b/src/main/resources/assets/disc_jockey/lang/en_us.json index 72564b9..0c4ab11 100644 --- a/src/main/resources/assets/disc_jockey/lang/en_us.json +++ b/src/main/resources/assets/disc_jockey/lang/en_us.json @@ -23,6 +23,14 @@ "disc_jockey.info_tuning": "Tuning: (Speed: %s)", "disc_jockey.info_playing": "Playing: [%s/%s] %s (Speed: %s)", "disc_jockey.info_finished": "Finished: %s (Speed: %s)", + "disc_jockey.instrument_info": "This maps instruments to be played by noteblocks for a different instrument instead.", + "disc_jockey.invalid_instrument": "Invalid instrument: %s", + "disc_jockey.instrument_mapped": "Mapped %s to %s", + "disc_jockey.instrument_mapped_all": "Mapped all instruments to %s", + "disc_jockey.instrument_unmapped": "Unmapped %s", + "disc_jockey.mapped_instruments": "Mapped instruments: %s", + "disc_jockey.no_mapped_instruments": "No instruments mapped, yet.", + "disc_jockey.instrument_maps_cleared": "Instrument mappings cleared.", "disc_jockey.warning": "WARNING!!! This mod is very likely to get false flagged as hacks, please contact a server administrator before using this mod! (You can disable this warning in the mod settings)", "key.category.disc_jockey": "Disc Jockey", "disc_jockey.key_bind.open_screen": "Open song selection screen",