Expose ability to map instruments via command

This commit is contained in:
EnderKill98 2024-04-16 02:45:47 +02:00
parent 3e359b6435
commit 8de17aacc8
2 changed files with 124 additions and 0 deletions

View File

@ -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<FabricClientCommandSource> commandDispatcher) {
final ArrayList<String> instrumentNames = new ArrayList<>();
for (Instrument instrument : Instrument.values()) {
instrumentNames.add(instrument.toString().toLowerCase());
}
final ArrayList<String> 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<Instrument, Instrument> 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;
})
)
)
);
}

View File

@ -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",