Newer
Older
void-pack-super-server / work / nms.old.1585251758016 / minecraft / server / ArgumentParserSelector.java
package net.minecraft.server;

import com.google.common.primitives.Doubles;
import com.mojang.brigadier.StringReader;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.exceptions.DynamicCommandExceptionType;
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
import com.mojang.brigadier.suggestion.Suggestions;
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.ToDoubleFunction;
import javax.annotation.Nullable;

public class ArgumentParserSelector {

    public static final SimpleCommandExceptionType a = new SimpleCommandExceptionType(new ChatMessage("argument.entity.invalid", new Object[0]));
    public static final DynamicCommandExceptionType b = new DynamicCommandExceptionType((object) -> {
        return new ChatMessage("argument.entity.selector.unknown", new Object[]{object});
    });
    public static final SimpleCommandExceptionType c = new SimpleCommandExceptionType(new ChatMessage("argument.entity.selector.not_allowed", new Object[0]));
    public static final SimpleCommandExceptionType d = new SimpleCommandExceptionType(new ChatMessage("argument.entity.selector.missing", new Object[0]));
    public static final SimpleCommandExceptionType e = new SimpleCommandExceptionType(new ChatMessage("argument.entity.options.unterminated", new Object[0]));
    public static final DynamicCommandExceptionType f = new DynamicCommandExceptionType((object) -> {
        return new ChatMessage("argument.entity.options.valueless", new Object[]{object});
    });
    public static final BiConsumer<Vec3D, List<? extends Entity>> g = (vec3d, list) -> {
    };
    public static final BiConsumer<Vec3D, List<? extends Entity>> h = (vec3d, list) -> {
        list.sort((entity, entity1) -> {
            return Doubles.compare(entity.c(vec3d), entity1.c(vec3d));
        });
    };
    public static final BiConsumer<Vec3D, List<? extends Entity>> i = (vec3d, list) -> {
        list.sort((entity, entity1) -> {
            return Doubles.compare(entity1.c(vec3d), entity.c(vec3d));
        });
    };
    public static final BiConsumer<Vec3D, List<? extends Entity>> j = (vec3d, list) -> {
        Collections.shuffle(list);
    };
    public static final BiFunction<SuggestionsBuilder, Consumer<SuggestionsBuilder>, CompletableFuture<Suggestions>> k = (suggestionsbuilder, consumer) -> {
        return suggestionsbuilder.buildFuture();
    };
    private final StringReader l;
    private final boolean m;
    private int n;
    private boolean o;
    private boolean p;
    private CriterionConditionValue.FloatRange q;
    private CriterionConditionValue.IntegerRange r;
    @Nullable
    private Double s;
    @Nullable
    private Double t;
    @Nullable
    private Double u;
    @Nullable
    private Double v;
    @Nullable
    private Double w;
    @Nullable
    private Double x;
    private CriterionConditionRange y;
    private CriterionConditionRange z;
    private Predicate<Entity> A;
    private BiConsumer<Vec3D, List<? extends Entity>> B;
    private boolean C;
    @Nullable
    private String D;
    private int E;
    @Nullable
    private UUID F;
    private BiFunction<SuggestionsBuilder, Consumer<SuggestionsBuilder>, CompletableFuture<Suggestions>> G;
    private boolean H;
    private boolean I;
    private boolean J;
    private boolean K;
    private boolean L;
    private boolean M;
    private boolean N;
    private boolean O;
    @Nullable
    private EntityTypes<?> P;
    private boolean Q;
    private boolean R;
    private boolean S;
    private boolean checkPermissions;

    public ArgumentParserSelector(StringReader stringreader) {
        this(stringreader, true);
    }

    public ArgumentParserSelector(StringReader stringreader, boolean flag) {
        this.q = CriterionConditionValue.FloatRange.e;
        this.r = CriterionConditionValue.IntegerRange.e;
        this.y = CriterionConditionRange.a;
        this.z = CriterionConditionRange.a;
        this.A = (entity) -> {
            return true;
        };
        this.B = ArgumentParserSelector.g;
        this.G = ArgumentParserSelector.k;
        this.l = stringreader;
        this.m = flag;
    }

    public EntitySelector a() {
        AxisAlignedBB axisalignedbb;

        if (this.v == null && this.w == null && this.x == null) {
            if (this.q.b() != null) {
                float f = (Float) this.q.b();

                axisalignedbb = new AxisAlignedBB((double) (-f), (double) (-f), (double) (-f), (double) (f + 1.0F), (double) (f + 1.0F), (double) (f + 1.0F));
            } else {
                axisalignedbb = null;
            }
        } else {
            axisalignedbb = this.a(this.v == null ? 0.0D : this.v, this.w == null ? 0.0D : this.w, this.x == null ? 0.0D : this.x);
        }

        Function<Vec3D, Vec3D> function; // CraftBukkit - decompile error

        if (this.s == null && this.t == null && this.u == null) {
            function = (vec3d) -> {
                return vec3d;
            };
        } else {
            function = (vec3d) -> {
                return new Vec3D(this.s == null ? vec3d.x : this.s, this.t == null ? vec3d.y : this.t, this.u == null ? vec3d.z : this.u);
            };
        }

        return new EntitySelector(this.n, this.o, this.p, this.A, this.q, function, axisalignedbb, this.B, this.C, this.D, this.F, this.P, this.checkPermissions);
    }

    private AxisAlignedBB a(double d0, double d1, double d2) {
        boolean flag = d0 < 0.0D;
        boolean flag1 = d1 < 0.0D;
        boolean flag2 = d2 < 0.0D;
        double d3 = flag ? d0 : 0.0D;
        double d4 = flag1 ? d1 : 0.0D;
        double d5 = flag2 ? d2 : 0.0D;
        double d6 = (flag ? 0.0D : d0) + 1.0D;
        double d7 = (flag1 ? 0.0D : d1) + 1.0D;
        double d8 = (flag2 ? 0.0D : d2) + 1.0D;

        return new AxisAlignedBB(d3, d4, d5, d6, d7, d8);
    }

    private void I() {
        if (this.y != CriterionConditionRange.a) {
            this.A = this.A.and(this.a(this.y, (entity) -> {
                return (double) entity.pitch;
            }));
        }

        if (this.z != CriterionConditionRange.a) {
            this.A = this.A.and(this.a(this.z, (entity) -> {
                return (double) entity.yaw;
            }));
        }

        if (!this.r.c()) {
            this.A = this.A.and((entity) -> {
                return !(entity instanceof EntityPlayer) ? false : this.r.d(((EntityPlayer) entity).expLevel);
            });
        }

    }

    private Predicate<Entity> a(CriterionConditionRange criterionconditionrange, ToDoubleFunction<Entity> todoublefunction) {
        double d0 = (double) MathHelper.g(criterionconditionrange.a() == null ? 0.0F : criterionconditionrange.a());
        double d1 = (double) MathHelper.g(criterionconditionrange.b() == null ? 359.0F : criterionconditionrange.b());

        return (entity) -> {
            double d2 = MathHelper.g(todoublefunction.applyAsDouble(entity));

            return d0 > d1 ? d2 >= d0 || d2 <= d1 : d2 >= d0 && d2 <= d1;
        };
    }

    // CraftBukkit start
    protected void parseSelector(boolean overridePermissions) throws CommandSyntaxException {
        this.checkPermissions = !overridePermissions;
        // CraftBukkit end
        this.G = this::d;
        if (!this.l.canRead()) {
            throw ArgumentParserSelector.d.createWithContext(this.l);
        } else {
            int i = this.l.getCursor();
            char c0 = this.l.read();

            if (c0 == 'p') {
                this.n = 1;
                this.o = false;
                this.B = ArgumentParserSelector.h;
                this.a(EntityTypes.PLAYER);
            } else if (c0 == 'a') {
                this.n = Integer.MAX_VALUE;
                this.o = false;
                this.B = ArgumentParserSelector.g;
                this.a(EntityTypes.PLAYER);
            } else if (c0 == 'r') {
                this.n = 1;
                this.o = false;
                this.B = ArgumentParserSelector.j;
                this.a(EntityTypes.PLAYER);
            } else if (c0 == 's') {
                this.n = 1;
                this.o = true;
                this.C = true;
            } else {
                if (c0 != 'e') {
                    this.l.setCursor(i);
                    throw ArgumentParserSelector.b.createWithContext(this.l, '@' + String.valueOf(c0));
                }

                this.n = Integer.MAX_VALUE;
                this.o = true;
                this.B = ArgumentParserSelector.g;
                this.A = Entity::isAlive;
            }

            this.G = this::e;
            if (this.l.canRead() && this.l.peek() == '[') {
                this.l.skip();
                this.G = this::f;
                this.d();
            }

        }
    }

    protected void c() throws CommandSyntaxException {
        if (this.l.canRead()) {
            this.G = this::c;
        }

        int i = this.l.getCursor();
        String s = this.l.readString();

        try {
            this.F = UUID.fromString(s);
            this.o = true;
        } catch (IllegalArgumentException illegalargumentexception) {
            if (s.isEmpty() || s.length() > 16) {
                this.l.setCursor(i);
                throw ArgumentParserSelector.a.createWithContext(this.l);
            }

            this.o = false;
            this.D = s;
        }

        this.n = 1;
    }

    protected void d() throws CommandSyntaxException {
        this.G = this::g;
        this.l.skipWhitespace();

        while (true) {
            if (this.l.canRead() && this.l.peek() != ']') {
                this.l.skipWhitespace();
                int i = this.l.getCursor();
                String s = this.l.readString();
                PlayerSelector.a playerselector_a = PlayerSelector.a(this, s, i);

                this.l.skipWhitespace();
                if (!this.l.canRead() || this.l.peek() != '=') {
                    this.l.setCursor(i);
                    throw ArgumentParserSelector.f.createWithContext(this.l, s);
                }

                this.l.skip();
                this.l.skipWhitespace();
                this.G = ArgumentParserSelector.k;
                playerselector_a.handle(this);
                this.l.skipWhitespace();
                this.G = this::h;
                if (!this.l.canRead()) {
                    continue;
                }

                if (this.l.peek() == ',') {
                    this.l.skip();
                    this.G = this::g;
                    continue;
                }

                if (this.l.peek() != ']') {
                    throw ArgumentParserSelector.e.createWithContext(this.l);
                }
            }

            if (this.l.canRead()) {
                this.l.skip();
                this.G = ArgumentParserSelector.k;
                return;
            }

            throw ArgumentParserSelector.e.createWithContext(this.l);
        }
    }

    public boolean e() {
        this.l.skipWhitespace();
        if (this.l.canRead() && this.l.peek() == '!') {
            this.l.skip();
            this.l.skipWhitespace();
            return true;
        } else {
            return false;
        }
    }

    public boolean f() {
        this.l.skipWhitespace();
        if (this.l.canRead() && this.l.peek() == '#') {
            this.l.skip();
            this.l.skipWhitespace();
            return true;
        } else {
            return false;
        }
    }

    public StringReader g() {
        return this.l;
    }

    public void a(Predicate<Entity> predicate) {
        this.A = this.A.and(predicate);
    }

    public void h() {
        this.p = true;
    }

    public CriterionConditionValue.FloatRange i() {
        return this.q;
    }

    public void a(CriterionConditionValue.FloatRange criterionconditionvalue_floatrange) {
        this.q = criterionconditionvalue_floatrange;
    }

    public CriterionConditionValue.IntegerRange j() {
        return this.r;
    }

    public void a(CriterionConditionValue.IntegerRange criterionconditionvalue_integerrange) {
        this.r = criterionconditionvalue_integerrange;
    }

    public CriterionConditionRange k() {
        return this.y;
    }

    public void a(CriterionConditionRange criterionconditionrange) {
        this.y = criterionconditionrange;
    }

    public CriterionConditionRange l() {
        return this.z;
    }

    public void b(CriterionConditionRange criterionconditionrange) {
        this.z = criterionconditionrange;
    }

    @Nullable
    public Double m() {
        return this.s;
    }

    @Nullable
    public Double n() {
        return this.t;
    }

    @Nullable
    public Double o() {
        return this.u;
    }

    public void a(double d0) {
        this.s = d0;
    }

    public void b(double d0) {
        this.t = d0;
    }

    public void c(double d0) {
        this.u = d0;
    }

    public void d(double d0) {
        this.v = d0;
    }

    public void e(double d0) {
        this.w = d0;
    }

    public void f(double d0) {
        this.x = d0;
    }

    @Nullable
    public Double p() {
        return this.v;
    }

    @Nullable
    public Double q() {
        return this.w;
    }

    @Nullable
    public Double r() {
        return this.x;
    }

    public void a(int i) {
        this.n = i;
    }

    public void a(boolean flag) {
        this.o = flag;
    }

    public void a(BiConsumer<Vec3D, List<? extends Entity>> biconsumer) {
        this.B = biconsumer;
    }

    public EntitySelector parse() throws CommandSyntaxException {
        // CraftBukkit start
        return parse(false);
    }

    public EntitySelector parse(boolean overridePermissions) throws CommandSyntaxException {
        // CraftBukkit end
        this.E = this.l.getCursor();
        this.G = this::b;
        if (this.l.canRead() && this.l.peek() == '@') {
            if (!this.m) {
                throw ArgumentParserSelector.c.createWithContext(this.l);
            }

            this.l.skip();
            this.parseSelector(overridePermissions); // CraftBukkit
        } else {
            this.c();
        }

        this.I();
        return this.a();
    }

    private static void a(SuggestionsBuilder suggestionsbuilder) {
        suggestionsbuilder.suggest("@p", new ChatMessage("argument.entity.selector.nearestPlayer", new Object[0]));
        suggestionsbuilder.suggest("@a", new ChatMessage("argument.entity.selector.allPlayers", new Object[0]));
        suggestionsbuilder.suggest("@r", new ChatMessage("argument.entity.selector.randomPlayer", new Object[0]));
        suggestionsbuilder.suggest("@s", new ChatMessage("argument.entity.selector.self", new Object[0]));
        suggestionsbuilder.suggest("@e", new ChatMessage("argument.entity.selector.allEntities", new Object[0]));
    }

    private CompletableFuture<Suggestions> b(SuggestionsBuilder suggestionsbuilder, Consumer<SuggestionsBuilder> consumer) {
        consumer.accept(suggestionsbuilder);
        if (this.m) {
            a(suggestionsbuilder);
        }

        return suggestionsbuilder.buildFuture();
    }

    private CompletableFuture<Suggestions> c(SuggestionsBuilder suggestionsbuilder, Consumer<SuggestionsBuilder> consumer) {
        SuggestionsBuilder suggestionsbuilder1 = suggestionsbuilder.createOffset(this.E);

        consumer.accept(suggestionsbuilder1);
        return suggestionsbuilder.add(suggestionsbuilder1).buildFuture();
    }

    private CompletableFuture<Suggestions> d(SuggestionsBuilder suggestionsbuilder, Consumer<SuggestionsBuilder> consumer) {
        SuggestionsBuilder suggestionsbuilder1 = suggestionsbuilder.createOffset(suggestionsbuilder.getStart() - 1);

        a(suggestionsbuilder1);
        suggestionsbuilder.add(suggestionsbuilder1);
        return suggestionsbuilder.buildFuture();
    }

    private CompletableFuture<Suggestions> e(SuggestionsBuilder suggestionsbuilder, Consumer<SuggestionsBuilder> consumer) {
        suggestionsbuilder.suggest(String.valueOf('['));
        return suggestionsbuilder.buildFuture();
    }

    private CompletableFuture<Suggestions> f(SuggestionsBuilder suggestionsbuilder, Consumer<SuggestionsBuilder> consumer) {
        suggestionsbuilder.suggest(String.valueOf(']'));
        PlayerSelector.a(this, suggestionsbuilder);
        return suggestionsbuilder.buildFuture();
    }

    private CompletableFuture<Suggestions> g(SuggestionsBuilder suggestionsbuilder, Consumer<SuggestionsBuilder> consumer) {
        PlayerSelector.a(this, suggestionsbuilder);
        return suggestionsbuilder.buildFuture();
    }

    private CompletableFuture<Suggestions> h(SuggestionsBuilder suggestionsbuilder, Consumer<SuggestionsBuilder> consumer) {
        suggestionsbuilder.suggest(String.valueOf(','));
        suggestionsbuilder.suggest(String.valueOf(']'));
        return suggestionsbuilder.buildFuture();
    }

    public boolean u() {
        return this.C;
    }

    public void a(BiFunction<SuggestionsBuilder, Consumer<SuggestionsBuilder>, CompletableFuture<Suggestions>> bifunction) {
        this.G = bifunction;
    }

    public CompletableFuture<Suggestions> a(SuggestionsBuilder suggestionsbuilder, Consumer<SuggestionsBuilder> consumer) {
        return (CompletableFuture) this.G.apply(suggestionsbuilder.createOffset(this.l.getCursor()), consumer);
    }

    public boolean v() {
        return this.H;
    }

    public void c(boolean flag) {
        this.H = flag;
    }

    public boolean w() {
        return this.I;
    }

    public void d(boolean flag) {
        this.I = flag;
    }

    public boolean x() {
        return this.J;
    }

    public void e(boolean flag) {
        this.J = flag;
    }

    public boolean y() {
        return this.K;
    }

    public void f(boolean flag) {
        this.K = flag;
    }

    public boolean z() {
        return this.L;
    }

    public void g(boolean flag) {
        this.L = flag;
    }

    public boolean A() {
        return this.M;
    }

    public void h(boolean flag) {
        this.M = flag;
    }

    public boolean B() {
        return this.N;
    }

    public void i(boolean flag) {
        this.N = flag;
    }

    public void j(boolean flag) {
        this.O = flag;
    }

    public void a(EntityTypes<?> entitytypes) {
        this.P = entitytypes;
    }

    public void D() {
        this.Q = true;
    }

    public boolean E() {
        return this.P != null;
    }

    public boolean F() {
        return this.Q;
    }

    public boolean G() {
        return this.R;
    }

    public void k(boolean flag) {
        this.R = flag;
    }

    public boolean H() {
        return this.S;
    }

    public void l(boolean flag) {
        this.S = flag;
    }
}