tutorial:command_suggestions
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revision | |||
tutorial:command_suggestions [2023/02/20 05:44] – solidblock | tutorial:command_suggestions [2023/11/18 12:06] (current) – solidblock | ||
---|---|---|---|
Line 3: | Line 3: | ||
====== Command Suggestions ====== | ====== Command Suggestions ====== | ||
- | Brigadier allows specification of custom suggestions for arguments. In Minecraft, these suggestions are sent to the client as a user is typing out the command. | + | Brigadier allows specification of custom suggestions for arguments. In Minecraft, these suggestions are sent to the client as a user is typing out the command. Besides, some argument types can have their default suggestion providers calculated directly in client, which is not focused in this article. |
===== Suggestion Providers ===== | ===== Suggestion Providers ===== | ||
- | A '' | + | A '' |
Suggestions can be contextual since a suggestion provider gives you access to the current command context. | Suggestions can be contextual since a suggestion provider gives you access to the current command context. | ||
Line 16: | Line 16: | ||
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
- | class AttributeSuggestionProvider implements SuggestionProvider< | + | public |
@Override | @Override | ||
public CompletableFuture< | public CompletableFuture< | ||
Line 28: | Line 28: | ||
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
- | class AttributeSuggestionProvider implements SuggestionProvider< | + | public |
@Override | @Override | ||
public CompletableFuture< | public CompletableFuture< | ||
Line 36: | Line 36: | ||
| | ||
if (!DefaultAttributeContainer.hasDefinitionFor(entityType)) { | if (!DefaultAttributeContainer.hasDefinitionFor(entityType)) { | ||
- | | + | |
} | } | ||
| | ||
DefaultAttributeContainer attributeContainer = DefaultAttributeRegistry.get(entityType); | DefaultAttributeContainer attributeContainer = DefaultAttributeRegistry.get(entityType); | ||
// You will need mixin to get the ' | // You will need mixin to get the ' | ||
- | for (EntityAttribute attribute : attributeContainer.instances().keySet()) { | + | for (EntityAttribute attribute : attributeContainer.instances.keySet()) { |
Identifier attributeId = Registries.ATTRIBUTE.getId(attribute); | Identifier attributeId = Registries.ATTRIBUTE.getId(attribute); | ||
- | if (attributeId != null) { | + | if (attributeId != null && CommandSource.shouldSuggest(builder.getRemaining(), |
... | ... | ||
</ | </ | ||
+ | |||
+ | The check of '' | ||
In order to have a suggestion appear on the client, you must add the suggestion to the builder. This can be done through one of the '' | In order to have a suggestion appear on the client, you must add the suggestion to the builder. This can be done through one of the '' | ||
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
- | for (EntityAttribute attribute : attributeContainer.instances().keySet()) { | + | |
- | Identifier attributeId = Registries.ATTRIBUTE.getId(attribute); | + | Identifier attributeId = Registries.ATTRIBUTE.getId(attribute); |
- | if (attributeId != null) { | + | if (attributeId != null && CommandSource.shouldSuggest(builder.getRemaining(), |
- | | + | |
- | } | + | } |
- | } | + | } |
</ | </ | ||
Line 63: | Line 65: | ||
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
- | return builder.buildFuture(); | + | |
</ | </ | ||
Line 69: | Line 71: | ||
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
- | class AttributeSuggestionProvider implements SuggestionProvider< | + | public |
@Override | @Override | ||
public CompletableFuture< | public CompletableFuture< | ||
Line 76: | Line 78: | ||
| | ||
if (!DefaultAttributeContainer.hasDefinitionFor(entityType)) { | if (!DefaultAttributeContainer.hasDefinitionFor(entityType)) { | ||
- | | + | |
} | } | ||
| | ||
DefaultAttributeContainer attributeContainer = DefaultAttributeRegistry.get(entityType); | DefaultAttributeContainer attributeContainer = DefaultAttributeRegistry.get(entityType); | ||
// You will need mixin to get the ' | // You will need mixin to get the ' | ||
- | for (EntityAttribute attribute : attributeContainer.instances().keySet()) { | + | for (EntityAttribute attribute : attributeContainer.instances.keySet()) { |
Identifier attributeId = Registries.ATTRIBUTE.getId(attribute); | Identifier attributeId = Registries.ATTRIBUTE.getId(attribute); | ||
- | if (attributeId != null) { | + | if (attributeId != null && CommandSource.shouldSuggest(builder.getRemaining(), |
builder.suggest(attributeId.toString()); | builder.suggest(attributeId.toString()); | ||
} | } | ||
Line 116: | Line 118: | ||
===== Utilities in CommandSource ===== | ===== Utilities in CommandSource ===== | ||
- | '' | + | '' |
- | Many of the utility methods involve returning completed suggestions from a '' | + | |
+ | In the example above, we can simplify it to: | ||
+ | <code java> | ||
+ | DefaultAttributeContainer attributeContainer = DefaultAttributeRegistry.get(entityType); | ||
+ | // You will need mixin to get the ' | ||
+ | return CommandSource.suggestMatching(Iterables.transform(attributeContainer.instances.keySet(), | ||
+ | |||
+ | // you can also use stream: | ||
+ | return CommandSource.suggestMatching(attributeContainer.instances.keySet().stream().map(Identifier:: | ||
+ | </ | ||
+ | |||
+ | ===== Builder offsets ===== | ||
+ | Most cases the suggestions appear from the beginning of the argument, such as the example above. However, sometimes suggestions appear in the middle of the argument. For example, in a block state argument, you input '' | ||
+ | |||
+ | In this case, you should use '' | ||
===== Other command tutorials ===== | ===== Other command tutorials ===== | ||
- | [[tutorial: | + | For other command tutorials, see the sidebar. |
tutorial/command_suggestions.1676871864.txt.gz · Last modified: 2023/02/20 05:44 by solidblock