minecraft-source/src/net/minecraft/util/datafix/fixes/BedBlockEntityInjecter.java

101 lines
4.9 KiB
Java

package net.minecraft.util.datafix.fixes;
import com.mojang.datafixers.util.Pair;
import com.mojang.datafixers.types.DynamicOps;
import java.util.Iterator;
import java.util.stream.Stream;
import com.mojang.datafixers.Typed;
import com.mojang.datafixers.OpticFinder;
import java.util.Map;
import java.util.Optional;
import com.google.common.collect.Maps;
import java.util.function.Function;
import com.google.common.collect.Lists;
import com.mojang.datafixers.Dynamic;
import com.mojang.datafixers.DSL;
import com.mojang.datafixers.types.Type;
import com.mojang.datafixers.types.templates.List;
import com.mojang.datafixers.TypeRewriteRule;
import com.mojang.datafixers.schemas.Schema;
import com.mojang.datafixers.DataFix;
public class BedBlockEntityInjecter extends DataFix {
public BedBlockEntityInjecter(final Schema schema, final boolean boolean2) {
super(schema, boolean2);
}
public TypeRewriteRule makeRule() {
final Type<?> type2 = this.getOutputSchema().getType(References.CHUNK);
final Type<?> type3 = type2.findFieldType("Level");
final Type<?> type4 = type3.findFieldType("TileEntities");
if (!(type4 instanceof List.ListType)) {
throw new IllegalStateException("Tile entity type is not a list type.");
}
final List.ListType<?> listType5 = type4;
return this.cap(type3, listType5);
}
private <TE> TypeRewriteRule cap(final Type<?> type, final List.ListType<TE> listType) {
final Type<TE> type2 = (Type<TE>)listType.getElement();
final OpticFinder<?> opticFinder5 = DSL.fieldFinder("Level", (Type)type);
final OpticFinder<java.util.List<TE>> opticFinder6 = (OpticFinder<java.util.List<TE>>)DSL.fieldFinder("TileEntities", (Type)listType);
final int integer7 = 416;
final OpticFinder opticFinder7;
final Typed<?> typed2;
final Dynamic<?> dynamic2;
final int integer8;
final int integer9;
final OpticFinder opticFinder8;
final java.util.List<Object> list9;
java.util.List<? extends Dynamic<?>> list10;
int integer10;
Dynamic<?> dynamic3;
int integer11;
Stream<Integer> stream14;
int integer12;
final Iterator<Integer> iterator;
int integer13;
int integer14;
int integer15;
int integer16;
Map<Dynamic<?>, Dynamic<?>> map21;
final Type type3;
return TypeRewriteRule.seq(this.fixTypeEverywhere("InjectBedBlockEntityType", (Type)this.getInputSchema().findChoiceType(References.BLOCK_ENTITY), (Type)this.getOutputSchema().findChoiceType(References.BLOCK_ENTITY), dynamicOps -> pair -> pair), this.fixTypeEverywhereTyped("BedBlockEntityInjecter", this.getOutputSchema().getType(References.CHUNK), typed -> {
typed2 = typed.getTyped(opticFinder7);
dynamic2 = typed2.get(DSL.remainderFinder());
integer8 = dynamic2.get("xPos").asInt(0);
integer9 = dynamic2.get("zPos").asInt(0);
list9 = Lists.newArrayList(typed2.getOrCreate(opticFinder8));
for (list10 = dynamic2.get("Sections").asList((Function)Function.identity()), integer10 = 0; integer10 < list10.size(); ++integer10) {
dynamic3 = list10.get(integer10);
integer11 = dynamic3.get("Y").asInt(0);
stream14 = dynamic3.get("Blocks").asStream().<Integer>map(dynamic -> dynamic.asInt(0));
integer12 = 0;
((Iterable<Integer>)stream14::iterator).iterator();
while (iterator.hasNext()) {
integer13 = iterator.next();
if (416 == (integer13 & 0xFF) << 4) {
integer14 = (integer12 & 0xF);
integer15 = (integer12 >> 8 & 0xF);
integer16 = (integer12 >> 4 & 0xF);
map21 = Maps.newHashMap();
map21.put(dynamic3.createString("id"), dynamic3.createString("minecraft:bed"));
map21.put(dynamic3.createString("x"), dynamic3.createInt(integer14 + (integer8 << 4)));
map21.put(dynamic3.createString("y"), dynamic3.createInt(integer15 + (integer11 << 4)));
map21.put(dynamic3.createString("z"), dynamic3.createInt(integer16 + (integer9 << 4)));
map21.put(dynamic3.createString("color"), dynamic3.createShort((short)14));
list9.add(((Optional)type3.read(dynamic3.createMap((Map)map21)).getSecond()).orElseThrow(() -> new IllegalStateException("Could not parse newly created bed block entity.")));
}
++integer12;
}
}
if (!list9.isEmpty()) {
return typed.set(opticFinder7, typed2.set(opticFinder8, list9));
}
else {
return typed;
}
}));
}
}