minecraft_25w45a_unobfuscated/net/minecraft/util/datafix/fixes/EntityEquipmentToArmorAndHandFix.java
2025-11-24 22:52:51 +03:00

92 lines
5.3 KiB
Java

/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* com.google.common.collect.Lists
* com.mojang.datafixers.DSL
* com.mojang.datafixers.DataFix
* com.mojang.datafixers.TypeRewriteRule
* com.mojang.datafixers.schemas.Schema
* com.mojang.datafixers.types.Type
* com.mojang.datafixers.util.Either
* com.mojang.datafixers.util.Pair
* com.mojang.serialization.Dynamic
*/
package net.minecraft.util.datafix.fixes;
import com.google.common.collect.Lists;
import com.mojang.datafixers.DSL;
import com.mojang.datafixers.DataFix;
import com.mojang.datafixers.TypeRewriteRule;
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 com.mojang.serialization.Dynamic;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Stream;
import net.minecraft.util.datafix.fixes.References;
public class EntityEquipmentToArmorAndHandFix
extends DataFix {
public EntityEquipmentToArmorAndHandFix(Schema outputSchema) {
super(outputSchema, true);
}
public TypeRewriteRule makeRule() {
return this.cap(this.getInputSchema().getTypeRaw(References.ITEM_STACK), this.getOutputSchema().getTypeRaw(References.ITEM_STACK));
}
private <ItemStackOld, ItemStackNew> TypeRewriteRule cap(Type<ItemStackOld> oldItemStackType, Type<ItemStackNew> newItemStackType) {
Type oldEquipmentType = DSL.named((String)References.ENTITY_EQUIPMENT.typeName(), (Type)DSL.optional((Type)DSL.field((String)"Equipment", (Type)DSL.list(oldItemStackType))));
Type newEquipmentType = DSL.named((String)References.ENTITY_EQUIPMENT.typeName(), (Type)DSL.and((Type)DSL.optional((Type)DSL.field((String)"ArmorItems", (Type)DSL.list(newItemStackType))), (Type)DSL.optional((Type)DSL.field((String)"HandItems", (Type)DSL.list(newItemStackType))), (Type)DSL.optional((Type)DSL.field((String)"body_armor_item", newItemStackType)), (Type)DSL.optional((Type)DSL.field((String)"saddle", newItemStackType))));
if (!oldEquipmentType.equals((Object)this.getInputSchema().getType(References.ENTITY_EQUIPMENT))) {
throw new IllegalStateException("Input entity_equipment type does not match expected");
}
if (!newEquipmentType.equals((Object)this.getOutputSchema().getType(References.ENTITY_EQUIPMENT))) {
throw new IllegalStateException("Output entity_equipment type does not match expected");
}
return TypeRewriteRule.seq((TypeRewriteRule)this.fixTypeEverywhereTyped("EntityEquipmentToArmorAndHandFix - drop chances", this.getInputSchema().getType(References.ENTITY), typed -> typed.update(DSL.remainderFinder(), EntityEquipmentToArmorAndHandFix::fixDropChances)), (TypeRewriteRule)this.fixTypeEverywhere("EntityEquipmentToArmorAndHandFix - equipment", oldEquipmentType, newEquipmentType, ops -> {
Object emptyStack = ((Pair)newItemStackType.read(new Dynamic(ops).emptyMap()).result().orElseThrow(() -> new IllegalStateException("Could not parse newly created empty itemstack."))).getFirst();
Either noItem = Either.right((Object)DSL.unit());
return named -> named.mapSecond(equipmentField -> {
List items = (List)equipmentField.map(Function.identity(), ignored -> List.of());
Either handItems = Either.right((Object)DSL.unit());
Either armorItems = Either.right((Object)DSL.unit());
if (!items.isEmpty()) {
handItems = Either.left((Object)Lists.newArrayList((Object[])new Object[]{items.getFirst(), emptyStack}));
}
if (items.size() > 1) {
ArrayList armor = Lists.newArrayList((Object[])new Object[]{emptyStack, emptyStack, emptyStack, emptyStack});
for (int i = 1; i < Math.min(items.size(), 5); ++i) {
armor.set(i - 1, items.get(i));
}
armorItems = Either.left((Object)armor);
}
return Pair.of((Object)armorItems, (Object)Pair.of((Object)handItems, (Object)Pair.of((Object)noItem, (Object)noItem)));
});
}));
}
private static Dynamic<?> fixDropChances(Dynamic<?> tag) {
Optional dropChances = tag.get("DropChances").asStreamOpt().result();
tag = tag.remove("DropChances");
if (dropChances.isPresent()) {
Iterator chances = Stream.concat(((Stream)dropChances.get()).map(value -> Float.valueOf(value.asFloat(0.0f))), Stream.generate(() -> Float.valueOf(0.0f))).iterator();
float handChance = ((Float)chances.next()).floatValue();
if (tag.get("HandDropChances").result().isEmpty()) {
tag = tag.set("HandDropChances", tag.createList(Stream.of(Float.valueOf(handChance), Float.valueOf(0.0f)).map(arg_0 -> ((Dynamic)tag).createFloat(arg_0))));
}
if (tag.get("ArmorDropChances").result().isEmpty()) {
tag = tag.set("ArmorDropChances", tag.createList(Stream.of((Float)chances.next(), (Float)chances.next(), (Float)chances.next(), (Float)chances.next()).map(arg_0 -> ((Dynamic)tag).createFloat(arg_0))));
}
}
return tag;
}
}