Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Minecraft Forge
- * Copyright (c) 2016.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation version 2.1
- * of the License.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
- package net.minecraftforge.server.console;
- import static com.google.common.base.Preconditions.checkNotNull;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.concurrent.ExecutionException;
- import java.util.concurrent.Future;
- import org.apache.logging.log4j.LogManager;
- import org.apache.logging.log4j.Logger;
- import org.bukkit.event.server.TabCompleteEvent;
- import net.minecraft.server.dedicated.DedicatedServer;
- import org.jline.reader.Candidate;
- import org.jline.reader.Completer;
- import org.jline.reader.LineReader;
- import org.jline.reader.ParsedLine;
- final class ConsoleCommandCompleter implements Completer {
- private static final Logger logger = LogManager.getLogger();
- private final DedicatedServer server;
- public ConsoleCommandCompleter(DedicatedServer server) {
- this.server = checkNotNull(server, "server");
- }
- @Override
- public void complete(LineReader reader, ParsedLine line, List<Candidate> candidates) {
- String buffer = line.line();
- boolean prefix;
- //forge getTabCompletions не принимает нулл.
- if (buffer.isEmpty() || buffer.charAt(0) != '/') {
- buffer = '/' + buffer;
- prefix = false;
- } else {
- prefix = true;
- }
- //Craftbukkit start
- //Для forge нужен слеш, иначе он не выводит полный список.
- final String forge = buffer;
- final String bakkit = line.line();
- Future<List<String>> tabComplete = this.server.callFromMainThread(() -> this.server.getTabCompletions(this.server, forge, this.server.getPosition(), false));
- Future<List<String>> offers = this.server.callFromMainThread(() -> server.server.getCommandMap().tabComplete(server.server.getConsoleSender(), bakkit));
- List<String> all = new ArrayList<String>();
- try {
- //Заполняем полный список forgeComplete, когда в buffer не было слеша.
- //Пропускаем список, когда в buffer был слеш.
- //Иначе список будет через слеш и смешается с complete worldedit.
- if (!prefix || buffer.isEmpty()) {
- for (String comp : tabComplete.get()) {
- boolean hasPrefix = comp.charAt(0) != '/';
- all.add(hasPrefix ? comp : comp.substring(1));
- }
- }
- //Заполняем список bukkitComplete, если вернуло не null.
- if (offers != null) {
- all.addAll(offers.get());
- }
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- } catch (ExecutionException e) {
- logger.error("Failed to tab complete", e);
- }
- //CallTabCompleteEvent
- TabCompleteEvent tabEvent = new TabCompleteEvent(server.server.getConsoleSender(), buffer, all);
- server.server.getPluginManager().callEvent(tabEvent);
- if (!tabEvent.isCancelled()) {
- for (String completion : tabEvent.getCompletions()) {
- if (!completion.isEmpty()) {
- Candidate candidate = new Candidate(completion);
- candidates.add(candidate);
- }
- }
- }
- //Craftbukkit end
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement