Начинающий
- Статус
- Оффлайн
- Регистрация
- 25 Май 2021
- Сообщения
- 45
- Реакции
- 1
- Выберите загрузчик игры
- Vanilla
Не найдя ни одной похожей темы, я решил написать мини-гайд по созданию подсказок для кастомных команд клиента. Буду показывать на примере Excellent Upgrade.
1.Создай класс, где и будут храниться наши подсказки, в моем случае это CustomCommandDispatcher
Покажу на примере добавления кастомной команды для добавления в друзья.
после этого в самом верху пишем
После этого идея в класс CommandSuggestionHelper и заменяем init на следующее
1.Создай класс, где и будут храниться наши подсказки, в моем случае это CustomCommandDispatcher
Покажу на примере добавления кастомной команды для добавления в друзья.
Код:
private static void registerFriendCommands(CommandDispatcher<ISuggestionProvider> dispatcher) {
dispatcher.register(
LiteralArgumentBuilder.<ISuggestionProvider>literal("friend")
.then(LiteralArgumentBuilder.<ISuggestionProvider>literal("add")
.then(RequiredArgumentBuilder.<ISuggestionProvider, String>argument("player", StringArgumentType.word())
.suggests((context, builder) -> {
Collection<String> playerNames = mc.player.connection.getSuggestionProvider().getPlayerNames();
return ISuggestionProvider.suggest(playerNames, builder);
})
)
)
.then(LiteralArgumentBuilder.<ISuggestionProvider>literal("remove")
.then(RequiredArgumentBuilder.<ISuggestionProvider, String>argument("player", StringArgumentType.word())
.suggests((context, builder) -> {
FriendManager manager = FriendManager.getInstance();
if (manager != null) {
return ISuggestionProvider.suggest(manager.getFriends(), builder);
}
return builder.buildFuture();
})
)
)
.then(LiteralArgumentBuilder.literal("clear"))
.then(LiteralArgumentBuilder.literal("list"))
);
}
после этого в самом верху пишем
Java:
public static void registerAll(CommandDispatcher<ISuggestionProvider> dispatcher) {
registerFriendCommands(dispatcher);
// по аналогии создаете и для других команд и так же сюда добавляете.
}
После этого идея в класс CommandSuggestionHelper и заменяем init на следующее
Java:
public void init() {
String s = this.inputField.getText();
if (this.parseResults != null && !this.parseResults.getReader().getString().equals(s)) {
this.parseResults = null;
}
if (!this.isApplyingSuggestion) {
this.inputField.setSuggestion(null);
this.suggestions = null;
}
this.exceptionList.clear();
StringReader stringreader = new StringReader(s);
boolean isCommand = stringreader.canRead() && stringreader.peek() == '/';
boolean isCustomCommand = stringreader.canRead() && stringreader.peek() == '.';
if (isCommand || isCustomCommand) {
stringreader.skip();
}
boolean shouldSuggest = this.commandsOnly || isCommand || isCustomCommand;
int cursorPos = this.inputField.getCursorPosition();
if (shouldSuggest) {
CommandDispatcher<ISuggestionProvider> dispatcher;
if (isCustomCommand) {
dispatcher = new CommandDispatcher<>();
CustomCommandDispatcher.registerAll(dispatcher);
} else {
dispatcher = this.mc.player.connection.getCommandDispatcher();
}
if (this.parseResults == null) {
this.parseResults = dispatcher.parse(stringreader, this.mc.player.connection.getSuggestionProvider());
}
int readerCursor = this.hasCursor ? stringreader.getCursor() : 1;
if (cursorPos >= readerCursor && (this.suggestions == null || !this.isApplyingSuggestion)) {
this.suggestionsFuture = dispatcher.getCompletionSuggestions(this.parseResults, cursorPos);
this.suggestionsFuture.thenRun(() -> {
if (this.suggestionsFuture.isDone()) {
this.recompileSuggestions();
}
});
}
} else {
String inputText = s.substring(0, cursorPos);
int lastWhitespace = getLastWhitespace(inputText);
if (mc.player == null) return;
Collection<String> playerNames = this.mc.player.connection.getSuggestionProvider().getPlayerNames();
this.suggestionsFuture = ISuggestionProvider.suggest(playerNames, new SuggestionsBuilder(inputText, lastWhitespace));
}
}