Newer
Older
void-pack-super-server / work / decompile-ee3ecae0 / net / minecraft / server / DataConverterEquipment.java
package net.minecraft.server;

import com.google.common.collect.Lists;
import com.mojang.datafixers.DSL;
import com.mojang.datafixers.DataFix;
import com.mojang.datafixers.Dynamic;
import com.mojang.datafixers.OpticFinder;
import com.mojang.datafixers.TypeRewriteRule;
import com.mojang.datafixers.Typed;
import com.mojang.datafixers.schemas.Schema;
import com.mojang.datafixers.types.Type;
import com.mojang.datafixers.util.Either;
import com.mojang.datafixers.util.Pair;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

public class DataConverterEquipment extends DataFix {

    public DataConverterEquipment(Schema schema, boolean flag) {
        super(schema, flag);
    }

    public TypeRewriteRule makeRule() {
        return this.a(this.getInputSchema().getTypeRaw(DataConverterTypes.ITEM_STACK));
    }

    private <IS> TypeRewriteRule a(Type<IS> type) {
        Type<Pair<Either<List<IS>, com.mojang.datafixers.util.Unit>, Dynamic<?>>> type1 = DSL.and(DSL.optional(DSL.field("Equipment", DSL.list(type))), DSL.remainderType());
        Type<Pair<Either<List<IS>, com.mojang.datafixers.util.Unit>, Pair<Either<List<IS>, com.mojang.datafixers.util.Unit>, Dynamic<?>>>> type2 = DSL.and(DSL.optional(DSL.field("ArmorItems", DSL.list(type))), DSL.optional(DSL.field("HandItems", DSL.list(type))), DSL.remainderType());
        OpticFinder<Pair<Either<List<IS>, com.mojang.datafixers.util.Unit>, Dynamic<?>>> opticfinder = DSL.typeFinder(type1);
        OpticFinder<List<IS>> opticfinder1 = DSL.fieldFinder("Equipment", DSL.list(type));

        return this.fixTypeEverywhereTyped("EntityEquipmentToArmorAndHandFix", this.getInputSchema().getType(DataConverterTypes.ENTITY), this.getOutputSchema().getType(DataConverterTypes.ENTITY), (typed) -> {
            Either<List<IS>, com.mojang.datafixers.util.Unit> either = Either.right(DSL.unit());
            Either<List<IS>, com.mojang.datafixers.util.Unit> either1 = Either.right(DSL.unit());
            Dynamic<?> dynamic = (Dynamic) typed.getOrCreate(DSL.remainderFinder());
            Optional<List<IS>> optional = typed.getOptional(opticfinder1);

            if (optional.isPresent()) {
                List<IS> list = (List) optional.get();
                IS is = ((Optional) type.read(dynamic.emptyMap()).getSecond()).orElseThrow(() -> {
                    return new IllegalStateException("Could not parse newly created empty itemstack.");
                });

                if (!list.isEmpty()) {
                    either = Either.left(Lists.newArrayList(new Object[]{list.get(0), is}));
                }

                if (list.size() > 1) {
                    List<IS> list1 = Lists.newArrayList(new Object[]{is, is, is, is});

                    for (int i = 1; i < Math.min(list.size(), 5); ++i) {
                        list1.set(i - 1, list.get(i));
                    }

                    either1 = Either.left(list1);
                }
            }

            Optional<? extends Stream<? extends Dynamic<?>>> optional1 = dynamic.get("DropChances").asStreamOpt();

            if (optional1.isPresent()) {
                Iterator<? extends Dynamic<?>> iterator = Stream.concat((Stream) optional1.get(), Stream.generate(() -> {
                    return dynamic.createInt(0);
                })).iterator();
                float f = ((Dynamic) iterator.next()).asFloat(0.0F);
                Dynamic dynamic1;

                if (!dynamic.get("HandDropChances").get().isPresent()) {
                    dynamic1 = dynamic.emptyMap().merge(dynamic.createFloat(f)).merge(dynamic.createFloat(0.0F));
                    dynamic = dynamic.set("HandDropChances", dynamic1);
                }

                if (!dynamic.get("ArmorDropChances").get().isPresent()) {
                    dynamic1 = dynamic.emptyMap().merge(dynamic.createFloat(((Dynamic) iterator.next()).asFloat(0.0F))).merge(dynamic.createFloat(((Dynamic) iterator.next()).asFloat(0.0F))).merge(dynamic.createFloat(((Dynamic) iterator.next()).asFloat(0.0F))).merge(dynamic.createFloat(((Dynamic) iterator.next()).asFloat(0.0F)));
                    dynamic = dynamic.set("ArmorDropChances", dynamic1);
                }

                dynamic = dynamic.remove("DropChances");
            }

            return typed.set(opticfinder, type2, Pair.of(either, Pair.of(either1, dynamic)));
        });
    }
}