package net.minecraft.util.datafix.schemas; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import com.mojang.datafixers.DSL; import com.mojang.datafixers.DataFixUtils; import com.mojang.datafixers.schemas.Schema; import com.mojang.datafixers.types.templates.TypeTemplate; import com.mojang.datafixers.types.templates.Hook.HookFunction; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Dynamic; import com.mojang.serialization.DynamicOps; import java.util.Map; import java.util.Optional; import java.util.function.Supplier; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.datafix.fixes.References; public class V1451_6 extends NamespacedSchema { public static final String SPECIAL_OBJECTIVE_MARKER = "_special"; protected static final HookFunction UNPACK_OBJECTIVE_ID = new HookFunction() { @Override public T apply(DynamicOps dynamicOps, T object) { Dynamic dynamic = new Dynamic<>(dynamicOps, object); return DataFixUtils.orElse( dynamic.get("CriteriaName") .asString() .result() .map(string -> { int i = string.indexOf(58); if (i < 0) { return Pair.of("_special", string); } else { try { ResourceLocation resourceLocation = ResourceLocation.bySeparator(string.substring(0, i), '.'); ResourceLocation resourceLocation2 = ResourceLocation.bySeparator(string.substring(i + 1), '.'); return Pair.of(resourceLocation.toString(), resourceLocation2.toString()); } catch (Exception var4) { return Pair.of("_special", string); } } }) .map( pair -> dynamic.set( "CriteriaType", dynamic.createMap( ImmutableMap.of( dynamic.createString("type"), dynamic.createString((String)pair.getFirst()), dynamic.createString("id"), dynamic.createString((String)pair.getSecond()) ) ) ) ), dynamic ) .getValue(); } }; protected static final HookFunction REPACK_OBJECTIVE_ID = new HookFunction() { @Override public T apply(DynamicOps dynamicOps, T object) { Dynamic dynamic = new Dynamic<>(dynamicOps, object); Optional> optional = dynamic.get("CriteriaType") .get() .result() .flatMap( dynamic2 -> { Optional optionalx = dynamic2.get("type").asString().result(); Optional optional2 = dynamic2.get("id").asString().result(); if (optionalx.isPresent() && optional2.isPresent()) { String string = (String)optionalx.get(); return string.equals("_special") ? Optional.of(dynamic.createString((String)optional2.get())) : Optional.of(dynamic2.createString(V1451_6.packNamespacedWithDot(string) + ":" + V1451_6.packNamespacedWithDot((String)optional2.get()))); } else { return Optional.empty(); } } ); return DataFixUtils.orElse(optional.map(dynamic2 -> dynamic.set("CriteriaName", dynamic2).remove("CriteriaType")), dynamic).getValue(); } }; public V1451_6(int i, Schema schema) { super(i, schema); } @Override public void registerTypes(Schema schema, Map> map, Map> map2) { super.registerTypes(schema, map, map2); Supplier supplier = () -> DSL.compoundList(References.ITEM_NAME.in(schema), DSL.constType(DSL.intType())); schema.registerType( false, References.STATS, () -> DSL.optionalFields( "stats", DSL.optionalFields( Pair.of("minecraft:mined", DSL.compoundList(References.BLOCK_NAME.in(schema), DSL.constType(DSL.intType()))), Pair.of("minecraft:crafted", (TypeTemplate)supplier.get()), Pair.of("minecraft:used", (TypeTemplate)supplier.get()), Pair.of("minecraft:broken", (TypeTemplate)supplier.get()), Pair.of("minecraft:picked_up", (TypeTemplate)supplier.get()), Pair.of("minecraft:dropped", (TypeTemplate)supplier.get()), Pair.of("minecraft:killed", DSL.compoundList(References.ENTITY_NAME.in(schema), DSL.constType(DSL.intType()))), Pair.of("minecraft:killed_by", DSL.compoundList(References.ENTITY_NAME.in(schema), DSL.constType(DSL.intType()))), Pair.of("minecraft:custom", DSL.compoundList(DSL.constType(namespacedString()), DSL.constType(DSL.intType()))) ) ) ); Map> map3 = createCriterionTypes(schema); schema.registerType( false, References.OBJECTIVE, () -> DSL.hook( DSL.optionalFields("CriteriaType", DSL.taggedChoiceLazy("type", DSL.string(), map3), "DisplayName", References.TEXT_COMPONENT.in(schema)), UNPACK_OBJECTIVE_ID, REPACK_OBJECTIVE_ID ) ); } protected static Map> createCriterionTypes(Schema schema) { Supplier supplier = () -> DSL.optionalFields("id", References.ITEM_NAME.in(schema)); Supplier supplier2 = () -> DSL.optionalFields("id", References.BLOCK_NAME.in(schema)); Supplier supplier3 = () -> DSL.optionalFields("id", References.ENTITY_NAME.in(schema)); Map> map = Maps.>newHashMap(); map.put("minecraft:mined", supplier2); map.put("minecraft:crafted", supplier); map.put("minecraft:used", supplier); map.put("minecraft:broken", supplier); map.put("minecraft:picked_up", supplier); map.put("minecraft:dropped", supplier); map.put("minecraft:killed", supplier3); map.put("minecraft:killed_by", supplier3); map.put("minecraft:custom", (Supplier)() -> DSL.optionalFields("id", DSL.constType(namespacedString()))); map.put("_special", (Supplier)() -> DSL.optionalFields("id", DSL.constType(DSL.string()))); return map; } public static String packNamespacedWithDot(String namespace) { ResourceLocation resourceLocation = ResourceLocation.tryParse(namespace); return resourceLocation != null ? resourceLocation.getNamespace() + "." + resourceLocation.getPath() : namespace; } }