package net.minecraft.command.collections; import java.util.ArrayList; import java.util.List; import net.minecraft.command.CommandException; import net.minecraft.command.SyntaxErrorException; import net.minecraft.command.arg.CommandArg; import net.minecraft.command.type.management.Convertable; import net.minecraft.command.type.management.Converter; import net.minecraft.command.type.management.relations.RelCommandArg; import net.minecraft.command.type.management.relations.RelDefault; import net.minecraft.command.type.management.relations.RelIdentity; import net.minecraft.command.type.management.relations.RelList; import net.minecraft.command.type.management.relations.RelSuper; import net.minecraft.command.type.management.relations.Relation.Attribute; import net.minecraft.command.type.management.relations.Relation.Provider; public final class Relations { public static final RelIdentity id = new RelIdentity(); public static final Attribute idAttribute = id.new Att(); public static final RelCommandArg commandArg = new RelCommandArg(); public static final RelList list = new RelList(); public static final RelDefault relDefault = new RelDefault(); public static final RelSuper relSuper = new RelSuper(); private Relations() { } public static final void init() { commandArg.addProvider(commandArg, new Provider() { // Checked... @SuppressWarnings("unchecked") @Override public <F, T, E extends CommandException> void apply(final Convertable<F, ?, E> source, final Convertable<T, ?, ? extends E> target, final Converter<F, T, ? extends E> converter, final int dist, final Attribute attSource, final Attribute attTarget) { final Convertable<CommandArg<T>, ?, SyntaxErrorException> relTarget = ((RelCommandArg.Att<T>) attTarget).rel; ((RelCommandArg.Att<F>) attSource).apply(relTarget, converter, dist); } }); id.addProvider(relDefault, new Provider() { // Checked... @SuppressWarnings("unchecked") @Override public <F, T, E extends CommandException> void apply(final Convertable<F, ?, E> source, final Convertable<T, ?, ? extends E> target, final Converter<F, T, ? extends E> converter, final int dist, final Attribute attSource, final Attribute attTarget) { final RelDefault.Att<T, ?, ? extends E> att = (RelDefault.Att<T, ?, ? extends E>) attTarget; RelDefault.apply(source, att, converter, dist); } }); relSuper.addProvider(id, new Provider() { // Checked... @SuppressWarnings("unchecked") @Override public <F, T, E extends CommandException> void apply(final Convertable<F, ?, E> source, final Convertable<T, ?, ? extends E> target, final Converter<F, T, ? extends E> converter, final int dist, final Attribute attSource, final Attribute attTarget) { final RelSuper.Att<?, F, ? super E> att = (RelSuper.Att<?, F, ? super E>) attSource; att.apply(target, converter, dist); } }); list.addProvider(list, new Provider() { // Checked... @SuppressWarnings("unchecked") @Override public <F, T, E extends CommandException> void apply(final Convertable<F, ?, E> source, final Convertable<T, ?, ? extends E> target, final Converter<F, T, ? extends E> converter, final int dist, final Attribute attSource, final Attribute attTarget) { final Convertable<List<F>, ?, E> relSource = ((RelList.Att<F, E>) attSource).rel; final Convertable<List<T>, ?, ? extends E> relTarget = ((RelList.Att<T, ? extends E>) attTarget).rel; relSource.addConverter(relTarget, new Converter<List<F>, List<T>, E>() { @Override public List<T> convert(final List<F> toConvert) throws E { final List<T> list = new ArrayList<>(toConvert.size()); for (final F item : toConvert) list.add(converter.convert(item)); return list; } }, dist + 1); } }); } }