package org.chrisoft.trashyaddon.commands.argument; import com.google.common.collect.Iterables; import com.google.gson.JsonObject; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; import java.util.Arrays; import java.util.Collection; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import net.minecraft.client.MinecraftClient; import net.minecraft.command.CommandRegistryAccess; import net.minecraft.command.CommandSource; import org.chrisoft.trashyaddon.commands.CEntitySelector; import org.chrisoft.trashyaddon.commands.CEntitySelectorReader; import net.minecraft.command.argument.serialize.ArgumentSerializer; import net.minecraft.network.PacketByteBuf; import net.minecraft.text.Text; public class CEntityArgumentType implements ArgumentType { private static final Collection EXAMPLES = Arrays.asList("Player", "0123", "@e", "@e[type=foo]", "dd12be42-52a9-4a91-a8a1-11c01849e498"); public static final SimpleCommandExceptionType TOO_MANY_ENTITIES_EXCEPTION = new SimpleCommandExceptionType(Text.translatable("argument.entity.toomany")); public static final SimpleCommandExceptionType TOO_MANY_PLAYERS_EXCEPTION = new SimpleCommandExceptionType(Text.translatable("argument.player.toomany")); public static final SimpleCommandExceptionType PLAYER_SELECTOR_HAS_ENTITIES_EXCEPTION = new SimpleCommandExceptionType( Text.translatable("argument.player.entities") ); public static final SimpleCommandExceptionType ENTITY_NOT_FOUND_EXCEPTION = new SimpleCommandExceptionType( Text.translatable("argument.entity.notfound.entity") ); public static final SimpleCommandExceptionType PLAYER_NOT_FOUND_EXCEPTION = new SimpleCommandExceptionType( Text.translatable("argument.entity.notfound.player") ); public static final SimpleCommandExceptionType NOT_ALLOWED_EXCEPTION = new SimpleCommandExceptionType( Text.translatable("argument.entity.selector.not_allowed") ); final boolean singleTarget; final boolean playersOnly; protected CEntityArgumentType(boolean singleTarget, boolean playersOnly) { this.singleTarget = singleTarget; this.playersOnly = playersOnly; } public static CEntityArgumentType entity() { return new CEntityArgumentType(true, false); } public static CEntityArgumentType entities() { return new CEntityArgumentType(false, false); } public static CEntityArgumentType player() { return new CEntityArgumentType(true, true); } public static CEntityArgumentType players() { return new CEntityArgumentType(false, true); } public CEntitySelector parse(StringReader stringReader) throws CommandSyntaxException { int i = 0; CEntitySelectorReader lv = new CEntitySelectorReader(stringReader); CEntitySelector lv2 = lv.read(); if (lv2.getLimit() > 1 && this.singleTarget) { if (this.playersOnly) { stringReader.setCursor(0); throw TOO_MANY_PLAYERS_EXCEPTION.createWithContext(stringReader); } else { stringReader.setCursor(0); throw TOO_MANY_ENTITIES_EXCEPTION.createWithContext(stringReader); } } else if (lv2.includesNonPlayers() && this.playersOnly && !lv2.isSenderOnly()) { stringReader.setCursor(0); throw PLAYER_SELECTOR_HAS_ENTITIES_EXCEPTION.createWithContext(stringReader); } else { return lv2; } } public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { if (context.getSource() instanceof CommandSource lv) { StringReader stringReader = new StringReader(builder.getInput()); stringReader.setCursor(builder.getStart()); CEntitySelectorReader lv2 = new CEntitySelectorReader(stringReader, lv.hasPermissionLevel(2)); try { lv2.read(); } catch (CommandSyntaxException var7) { } return lv2.listSuggestions(builder, builderx -> { Collection collection = MinecraftClient.getInstance().getNetworkHandler().getPlayerList().stream().map(e -> e.getProfile().getName()).collect(Collectors.toSet()); Iterable iterable = (Iterable)(this.playersOnly ? collection : Iterables.concat(collection, lv.getEntitySuggestions())); CommandSource.suggestMatching(iterable, builderx); }); } else { return Suggestions.empty(); } } public Collection getExamples() { return EXAMPLES; } public static class Serializer implements ArgumentSerializer { private static final byte SINGLE_FLAG = 1; private static final byte PLAYERS_ONLY_FLAG = 2; public void writePacket(CEntityArgumentType.Serializer.Properties arg, PacketByteBuf arg2) { int i = 0; if (arg.single) { i |= 1; } if (arg.playersOnly) { i |= 2; } arg2.writeByte(i); } public CEntityArgumentType.Serializer.Properties fromPacket(PacketByteBuf arg) { byte b = arg.readByte(); return new CEntityArgumentType.Serializer.Properties((b & 1) != 0, (b & 2) != 0); } public void writeJson(CEntityArgumentType.Serializer.Properties arg, JsonObject jsonObject) { jsonObject.addProperty("amount", arg.single ? "single" : "multiple"); jsonObject.addProperty("type", arg.playersOnly ? "players" : "entities"); } public CEntityArgumentType.Serializer.Properties getArgumentTypeProperties(CEntityArgumentType arg) { return new CEntityArgumentType.Serializer.Properties(arg.singleTarget, arg.playersOnly); } public final class Properties implements ArgumentSerializer.ArgumentTypeProperties { final boolean single; final boolean playersOnly; Properties(boolean single, boolean playersOnly) { this.single = single; this.playersOnly = playersOnly; } public CEntityArgumentType createType(CommandRegistryAccess arg) { return new CEntityArgumentType(this.single, this.playersOnly); } @Override public ArgumentSerializer getSerializer() { return Serializer.this; } } } }