59 lines
2.1 KiB
Java
59 lines
2.1 KiB
Java
package net.minecraft.util.datafix.fixes;
|
|
|
|
import com.mojang.datafixers.DSL;
|
|
import com.mojang.datafixers.DataFix;
|
|
import com.mojang.datafixers.OpticFinder;
|
|
import com.mojang.datafixers.TypeRewriteRule;
|
|
import com.mojang.datafixers.schemas.Schema;
|
|
import com.mojang.datafixers.types.Type;
|
|
import com.mojang.serialization.Dynamic;
|
|
import java.util.Optional;
|
|
import java.util.Set;
|
|
import net.minecraft.Util;
|
|
import net.minecraft.util.datafix.ExtraDataFixUtils;
|
|
import net.minecraft.util.datafix.LegacyComponentDataFixUtils;
|
|
import net.minecraft.util.datafix.schemas.NamespacedSchema;
|
|
|
|
public class BlockEntityCustomNameToComponentFix extends DataFix {
|
|
private static final Set<String> NAMEABLE_BLOCK_ENTITIES = Set.of(
|
|
"minecraft:beacon",
|
|
"minecraft:banner",
|
|
"minecraft:brewing_stand",
|
|
"minecraft:chest",
|
|
"minecraft:trapped_chest",
|
|
"minecraft:dispenser",
|
|
"minecraft:dropper",
|
|
"minecraft:enchanting_table",
|
|
"minecraft:furnace",
|
|
"minecraft:hopper",
|
|
"minecraft:shulker_box"
|
|
);
|
|
|
|
public BlockEntityCustomNameToComponentFix(Schema outputSchema) {
|
|
super(outputSchema, true);
|
|
}
|
|
|
|
@Override
|
|
public TypeRewriteRule makeRule() {
|
|
OpticFinder<String> opticFinder = DSL.fieldFinder("id", NamespacedSchema.namespacedString());
|
|
Type<?> type = this.getInputSchema().getType(References.BLOCK_ENTITY);
|
|
Type<?> type2 = this.getOutputSchema().getType(References.BLOCK_ENTITY);
|
|
Type<?> type3 = ExtraDataFixUtils.patchSubType(type, type, type2);
|
|
return this.fixTypeEverywhereTyped(
|
|
"BlockEntityCustomNameToComponentFix",
|
|
type,
|
|
type2,
|
|
typed -> {
|
|
Optional<String> optional = typed.getOptional(opticFinder);
|
|
return optional.isPresent() && !NAMEABLE_BLOCK_ENTITIES.contains(optional.get())
|
|
? ExtraDataFixUtils.cast(type2, typed)
|
|
: Util.writeAndReadTypedOrThrow(ExtraDataFixUtils.cast(type3, typed), type2, BlockEntityCustomNameToComponentFix::fixTagCustomName);
|
|
}
|
|
);
|
|
}
|
|
|
|
public static <T> Dynamic<T> fixTagCustomName(Dynamic<T> tag) {
|
|
String string = tag.get("CustomName").asString("");
|
|
return string.isEmpty() ? tag.remove("CustomName") : tag.set("CustomName", LegacyComponentDataFixUtils.createPlainTextComponent(tag.getOps(), string));
|
|
}
|
|
}
|