Skip to content

Commit 219ba03

Browse files
committed
Reimplemented the hand command.
1 parent 1dac305 commit 219ba03

File tree

7 files changed

+192
-3
lines changed

7 files changed

+192
-3
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package net.darkhax.bookshelf.api.commands.args;
2+
3+
import com.mojang.brigadier.StringReader;
4+
import com.mojang.brigadier.arguments.ArgumentType;
5+
import com.mojang.brigadier.context.CommandContext;
6+
import com.mojang.brigadier.exceptions.CommandSyntaxException;
7+
import com.mojang.brigadier.exceptions.DynamicCommandExceptionType;
8+
import com.mojang.brigadier.suggestion.Suggestions;
9+
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
10+
import net.darkhax.bookshelf.api.function.CachedSupplier;
11+
import net.minecraft.commands.SharedSuggestionProvider;
12+
import net.minecraft.network.chat.TranslatableComponent;
13+
14+
import java.util.Collection;
15+
import java.util.HashMap;
16+
import java.util.Map;
17+
import java.util.concurrent.CompletableFuture;
18+
19+
public class EnumArgument<T extends Enum<T>> implements ArgumentType<T> {
20+
21+
private static final DynamicCommandExceptionType ERROR_UNKNOWN = new DynamicCommandExceptionType((obj) -> new TranslatableComponent("argument.bookshelf.unknown_value", obj));
22+
23+
private final CachedSupplier<Map<String, T>> values;
24+
25+
public EnumArgument(Class<T> enumClass) {
26+
27+
values = CachedSupplier.cache(() -> {
28+
29+
final Map<String, T> valueMap = new HashMap<>();
30+
31+
for (T enumConst : enumClass.getEnumConstants()) {
32+
33+
valueMap.put(enumConst.name(), enumConst);
34+
}
35+
36+
return valueMap;
37+
});
38+
}
39+
40+
@Override
41+
public T parse(final StringReader reader) throws CommandSyntaxException {
42+
43+
final String inputEnumName = reader.readUnquotedString();
44+
45+
if (values.get().containsKey(inputEnumName)) {
46+
47+
return values.get().get(inputEnumName);
48+
}
49+
50+
throw ERROR_UNKNOWN.createWithContext(reader, inputEnumName);
51+
}
52+
53+
@Override
54+
public Collection<String> getExamples() {
55+
56+
return this.values.get().keySet();
57+
}
58+
59+
@Override
60+
public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) {
61+
62+
return SharedSuggestionProvider.suggest(this.values.get().keySet(), builder);
63+
}
64+
}

Common/src/main/java/net/darkhax/bookshelf/impl/BookshelfContentProvider.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import net.darkhax.bookshelf.api.registry.RegistryDataProvider;
55
import net.darkhax.bookshelf.impl.commands.BookshelfCommands;
66
import net.darkhax.bookshelf.impl.commands.args.FontArgument;
7+
import net.darkhax.bookshelf.impl.commands.args.HandArgument;
78
import net.darkhax.bookshelf.impl.data.recipes.crafting.ShapedDurabilityRecipe;
89
import net.darkhax.bookshelf.impl.data.recipes.crafting.ShapelessDurabilityRecipe;
910

@@ -14,7 +15,8 @@ public BookshelfContentProvider() {
1415
super(Constants.MOD_ID);
1516

1617
// Command Argument Types
17-
this.commandArguments.add(FontArgument.class, () -> FontArgument.SERIALIZER, "font");
18+
this.commandArguments.add(FontArgument.class, () -> FontArgument.FONT_SERIALIZER, "font");
19+
this.commandArguments.add(HandArgument.class, () -> HandArgument.SERIALIZER, "item_output");
1820

1921
// Command Builders
2022
this.commands.add(BookshelfCommands::new, "commands");

Common/src/main/java/net/darkhax/bookshelf/impl/commands/BookshelfCommands.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public void build(CommandDispatcher<CommandSourceStack> dispatcher, boolean isDe
1313

1414
final LiteralArgumentBuilder<CommandSourceStack> root = Commands.literal("bookshelf");
1515
root.then(CommandFont.build());
16+
root.then(CommandHand.build());
1617

1718
dispatcher.register(root);
1819
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package net.darkhax.bookshelf.impl.commands;
2+
3+
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
4+
import com.mojang.brigadier.context.CommandContext;
5+
import com.mojang.brigadier.exceptions.CommandSyntaxException;
6+
import net.darkhax.bookshelf.api.Services;
7+
import net.darkhax.bookshelf.api.serialization.Serializers;
8+
import net.darkhax.bookshelf.api.util.TextHelper;
9+
import net.darkhax.bookshelf.impl.commands.args.HandArgument;
10+
import net.minecraft.commands.CommandSourceStack;
11+
import net.minecraft.commands.Commands;
12+
import net.minecraft.network.chat.TextComponent;
13+
import net.minecraft.resources.ResourceLocation;
14+
import net.minecraft.server.commands.GiveCommand;
15+
import net.minecraft.world.entity.Entity;
16+
import net.minecraft.world.entity.LivingEntity;
17+
import net.minecraft.world.item.ItemStack;
18+
import net.minecraft.world.item.crafting.Ingredient;
19+
20+
import java.util.StringJoiner;
21+
import java.util.function.Function;
22+
23+
public class CommandHand {
24+
25+
public static LiteralArgumentBuilder<CommandSourceStack> build() {
26+
27+
final LiteralArgumentBuilder<CommandSourceStack> hand = Commands.literal("hand");
28+
hand.then(HandArgument.arg().executes(CommandHand::printHeldStack));
29+
return hand;
30+
}
31+
32+
private static int printHeldStack(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
33+
34+
final OutputType type = HandArgument.get(context);
35+
final Entity sender = context.getSource().getEntity();
36+
37+
if (sender instanceof LivingEntity living) {
38+
39+
final String stackOutput = type.converter.apply(living.getMainHandItem());
40+
context.getSource().sendSuccess(TextHelper.textWithCopy(stackOutput), false);
41+
}
42+
43+
return 1;
44+
}
45+
46+
public enum OutputType {
47+
48+
STRING(OutputType::getAsString),
49+
INGREDIENT(OutputType::getAsIngredient),
50+
STACK_JSON(OutputType::getAsStackJson),
51+
ID(OutputType::getAsID),
52+
TAGS(OutputType::getTags);
53+
54+
private final Function<ItemStack, String> converter;
55+
56+
OutputType(Function<ItemStack, String> converter) {
57+
58+
this.converter = converter;
59+
}
60+
61+
private static String getAsString(ItemStack stack) {
62+
63+
return stack.toString();
64+
}
65+
66+
private static String getAsIngredient(ItemStack stack) {
67+
68+
return Serializers.INGREDIENT.toJSON(Ingredient.of(stack)).toString();
69+
}
70+
71+
private static String getAsStackJson(ItemStack stack) {
72+
73+
return Serializers.ITEM_STACK.toJSON(stack).toString();
74+
}
75+
76+
public static String getAsID(ItemStack stack) {
77+
78+
final ResourceLocation id = Services.REGISTRIES.items().getId(stack.getItem());
79+
return id != null ? id.toString() : null;
80+
}
81+
82+
public static String getTags(ItemStack stack) {
83+
84+
final StringJoiner joiner = new StringJoiner("\n");
85+
86+
stack.getItem().builtInRegistryHolder().tags().forEach(tag -> joiner.add(tag.location().toString()));
87+
88+
return joiner.toString();
89+
}
90+
}
91+
}

Common/src/main/java/net/darkhax/bookshelf/impl/commands/args/FontArgument.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
public class FontArgument implements ArgumentType<ResourceLocation> {
2525

2626
public static final FontArgument ARGUMENT = new FontArgument();
27-
public static final ArgumentSerializer<FontArgument> SERIALIZER = SingletonArgumentSerializer.of(ARGUMENT);
27+
public static final ArgumentSerializer<FontArgument> FONT_SERIALIZER = SingletonArgumentSerializer.of(ARGUMENT);
2828

2929
private static final Collection<ResourceLocation> VANILLA_FONTS = List.of(TextHelper.FONT_DEFAULT, TextHelper.FONT_ALT, TextHelper.FONT_UNIFORM, TextHelper.FONT_ILLAGER);
3030
private static final Collection<String> EXAMPLES = VANILLA_FONTS.stream().map(ResourceLocation::toString).collect(Collectors.toList());
@@ -36,7 +36,7 @@ public static ResourceLocation getFont(CommandContext<CommandSourceStack> contex
3636

3737
public static RequiredArgumentBuilder<CommandSourceStack, ResourceLocation> argument() {
3838

39-
return Commands.argument("font", FontArgument.ARGUMENT);
39+
return Commands.argument("font", ARGUMENT);
4040
}
4141

4242
@Override
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package net.darkhax.bookshelf.impl.commands.args;
2+
3+
import com.mojang.brigadier.builder.RequiredArgumentBuilder;
4+
import com.mojang.brigadier.context.CommandContext;
5+
import net.darkhax.bookshelf.api.commands.args.EnumArgument;
6+
import net.darkhax.bookshelf.api.commands.args.SingletonArgumentSerializer;
7+
import net.darkhax.bookshelf.impl.commands.CommandHand;
8+
import net.minecraft.commands.CommandSourceStack;
9+
import net.minecraft.commands.Commands;
10+
11+
public class HandArgument extends EnumArgument<CommandHand.OutputType> {
12+
13+
public static final HandArgument ARGUMENT = new HandArgument();
14+
public static final SingletonArgumentSerializer<HandArgument> SERIALIZER = SingletonArgumentSerializer.of(ARGUMENT);
15+
16+
private HandArgument() {
17+
18+
super(CommandHand.OutputType.class);
19+
}
20+
21+
public static CommandHand.OutputType get(CommandContext<CommandSourceStack> context) {
22+
23+
return context.getArgument("output_type", CommandHand.OutputType.class);
24+
}
25+
26+
public static RequiredArgumentBuilder<CommandSourceStack, CommandHand.OutputType> arg() {
27+
28+
return Commands.argument("output_type", ARGUMENT);
29+
}
30+
}

Common/src/main/resources/assets/bookshelf/lang/en_us.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
"_comment": "Commands",
3838
"commands.bookshelf.loot_tables": "Found %d missing loot tables for %s.",
3939
"commands.bookshelf.loot_tables.wildcard": "Found %d missing loot tables for all mods.",
40+
"argument.bookshelf.unknown_value": "The value '%s' is unknown.",
4041

4142
"_comment": "Misc",
4243
"text.bookshelf.ticks": "Ticks: %s"

0 commit comments

Comments
 (0)