minecraft-src/net/minecraft/util/datafix/fixes/SpawnerDataFix.java
2025-07-04 01:41:11 +03:00

54 lines
2.2 KiB
Java

package net.minecraft.util.datafix.fixes;
import com.mojang.datafixers.DataFix;
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.Pair;
import com.mojang.serialization.Dynamic;
import com.mojang.serialization.DynamicOps;
import java.util.List;
public class SpawnerDataFix extends DataFix {
public SpawnerDataFix(Schema outputSchema) {
super(outputSchema, true);
}
@Override
protected TypeRewriteRule makeRule() {
Type<?> type = this.getInputSchema().getType(References.UNTAGGED_SPAWNER);
Type<?> type2 = this.getOutputSchema().getType(References.UNTAGGED_SPAWNER);
OpticFinder<?> opticFinder = type.findField("SpawnData");
Type<?> type3 = type2.findField("SpawnData").type();
OpticFinder<?> opticFinder2 = type.findField("SpawnPotentials");
Type<?> type4 = type2.findField("SpawnPotentials").type();
return this.fixTypeEverywhereTyped(
"Fix mob spawner data structure",
type,
type2,
typed -> typed.updateTyped(opticFinder, type3, typedx -> this.wrapEntityToSpawnData(type3, typedx))
.updateTyped(opticFinder2, type4, typedx -> this.wrapSpawnPotentialsToWeightedEntries(type4, typedx))
);
}
private <T> Typed<T> wrapEntityToSpawnData(Type<T> type, Typed<?> typed) {
DynamicOps<?> dynamicOps = typed.getOps();
return new Typed<>(type, dynamicOps, (T)Pair.<Object, Dynamic<?>>of(typed.getValue(), new Dynamic<>(dynamicOps)));
}
private <T> Typed<T> wrapSpawnPotentialsToWeightedEntries(Type<T> type, Typed<?> typed) {
DynamicOps<?> dynamicOps = typed.getOps();
List<?> list = (List<?>)typed.getValue();
List<?> list2 = list.stream().map(object -> {
Pair<Object, Dynamic<?>> pair = (Pair<Object, Dynamic<?>>)object;
int i = ((Number)pair.getSecond().get("Weight").asNumber().result().orElse(1)).intValue();
Dynamic<?> dynamic = new Dynamic<>(dynamicOps);
dynamic = dynamic.set("weight", dynamic.createInt(i));
Dynamic<?> dynamic2 = pair.getSecond().remove("Weight").remove("Entity");
return Pair.of(Pair.of(pair.getFirst(), dynamic2), dynamic);
}).toList();
return new Typed<>(type, dynamicOps, (T)list2);
}
}