package net.minecraft.util.datafix.schemas; 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.logging.LogUtils; import com.mojang.serialization.Dynamic; import com.mojang.serialization.DynamicOps; import java.util.HashMap; import java.util.Map; import java.util.function.Supplier; import net.minecraft.util.datafix.fixes.References; import org.slf4j.Logger; public class V99 extends Schema { private static final Logger LOGGER = LogUtils.getLogger(); static final Map ITEM_TO_BLOCKENTITY = DataFixUtils.make(Maps.newHashMap(), p_145919_ -> { p_145919_.put("minecraft:furnace", "Furnace"); p_145919_.put("minecraft:lit_furnace", "Furnace"); p_145919_.put("minecraft:chest", "Chest"); p_145919_.put("minecraft:trapped_chest", "Chest"); p_145919_.put("minecraft:ender_chest", "EnderChest"); p_145919_.put("minecraft:jukebox", "RecordPlayer"); p_145919_.put("minecraft:dispenser", "Trap"); p_145919_.put("minecraft:dropper", "Dropper"); p_145919_.put("minecraft:sign", "Sign"); p_145919_.put("minecraft:mob_spawner", "MobSpawner"); p_145919_.put("minecraft:noteblock", "Music"); p_145919_.put("minecraft:brewing_stand", "Cauldron"); p_145919_.put("minecraft:enhanting_table", "EnchantTable"); p_145919_.put("minecraft:command_block", "CommandBlock"); p_145919_.put("minecraft:beacon", "Beacon"); p_145919_.put("minecraft:skull", "Skull"); p_145919_.put("minecraft:daylight_detector", "DLDetector"); p_145919_.put("minecraft:hopper", "Hopper"); p_145919_.put("minecraft:banner", "Banner"); p_145919_.put("minecraft:flower_pot", "FlowerPot"); p_145919_.put("minecraft:repeating_command_block", "CommandBlock"); p_145919_.put("minecraft:chain_command_block", "CommandBlock"); p_145919_.put("minecraft:standing_sign", "Sign"); p_145919_.put("minecraft:wall_sign", "Sign"); p_145919_.put("minecraft:piston_head", "Piston"); p_145919_.put("minecraft:daylight_detector_inverted", "DLDetector"); p_145919_.put("minecraft:unpowered_comparator", "Comparator"); p_145919_.put("minecraft:powered_comparator", "Comparator"); p_145919_.put("minecraft:wall_banner", "Banner"); p_145919_.put("minecraft:standing_banner", "Banner"); p_145919_.put("minecraft:structure_block", "Structure"); p_145919_.put("minecraft:end_portal", "Airportal"); p_145919_.put("minecraft:end_gateway", "EndGateway"); p_145919_.put("minecraft:shield", "Banner"); }); public static final Map ITEM_TO_ENTITY = Map.of("minecraft:armor_stand", "ArmorStand", "minecraft:painting", "Painting"); protected static final HookFunction ADD_NAMES = new HookFunction() { @Override public T apply(DynamicOps p_18312_, T p_18313_) { return V99.addNames(new Dynamic<>(p_18312_, p_18313_), V99.ITEM_TO_BLOCKENTITY, V99.ITEM_TO_ENTITY); } }; public V99(int p_18185_, Schema p_18186_) { super(p_18185_, p_18186_); } protected static void registerThrowableProjectile(Schema p_18225_, Map> p_18226_, String p_18227_) { p_18225_.register(p_18226_, p_18227_, () -> DSL.optionalFields("inTile", References.BLOCK_NAME.in(p_18225_))); } protected static void registerMinecart(Schema p_18237_, Map> p_18238_, String p_18239_) { p_18237_.register(p_18238_, p_18239_, () -> DSL.optionalFields("DisplayTile", References.BLOCK_NAME.in(p_18237_))); } protected static void registerInventory(Schema p_18247_, Map> p_18248_, String p_18249_) { p_18247_.register(p_18248_, p_18249_, () -> DSL.optionalFields("Items", DSL.list(References.ITEM_STACK.in(p_18247_)))); } @Override public Map> registerEntities(Schema p_18305_) { Map> map = Maps.newHashMap(); p_18305_.register(map, "Item", p_18301_ -> DSL.optionalFields("Item", References.ITEM_STACK.in(p_18305_))); p_18305_.registerSimple(map, "XPOrb"); registerThrowableProjectile(p_18305_, map, "ThrownEgg"); p_18305_.registerSimple(map, "LeashKnot"); p_18305_.registerSimple(map, "Painting"); p_18305_.register(map, "Arrow", p_18295_ -> DSL.optionalFields("inTile", References.BLOCK_NAME.in(p_18305_))); p_18305_.register(map, "TippedArrow", p_18292_ -> DSL.optionalFields("inTile", References.BLOCK_NAME.in(p_18305_))); p_18305_.register(map, "SpectralArrow", p_397789_ -> DSL.optionalFields("inTile", References.BLOCK_NAME.in(p_18305_))); registerThrowableProjectile(p_18305_, map, "Snowball"); registerThrowableProjectile(p_18305_, map, "Fireball"); registerThrowableProjectile(p_18305_, map, "SmallFireball"); registerThrowableProjectile(p_18305_, map, "ThrownEnderpearl"); p_18305_.registerSimple(map, "EyeOfEnderSignal"); p_18305_.register( map, "ThrownPotion", p_18289_ -> DSL.optionalFields("inTile", References.BLOCK_NAME.in(p_18305_), "Potion", References.ITEM_STACK.in(p_18305_)) ); registerThrowableProjectile(p_18305_, map, "ThrownExpBottle"); p_18305_.register(map, "ItemFrame", p_18284_ -> DSL.optionalFields("Item", References.ITEM_STACK.in(p_18305_))); registerThrowableProjectile(p_18305_, map, "WitherSkull"); p_18305_.registerSimple(map, "PrimedTnt"); p_18305_.register( map, "FallingSand", p_18279_ -> DSL.optionalFields("Block", References.BLOCK_NAME.in(p_18305_), "TileEntityData", References.BLOCK_ENTITY.in(p_18305_)) ); p_18305_.register(map, "FireworksRocketEntity", p_18274_ -> DSL.optionalFields("FireworksItem", References.ITEM_STACK.in(p_18305_))); p_18305_.registerSimple(map, "Boat"); p_18305_.register( map, "Minecart", () -> DSL.optionalFields("DisplayTile", References.BLOCK_NAME.in(p_18305_), "Items", DSL.list(References.ITEM_STACK.in(p_18305_))) ); registerMinecart(p_18305_, map, "MinecartRideable"); p_18305_.register( map, "MinecartChest", p_18269_ -> DSL.optionalFields("DisplayTile", References.BLOCK_NAME.in(p_18305_), "Items", DSL.list(References.ITEM_STACK.in(p_18305_))) ); registerMinecart(p_18305_, map, "MinecartFurnace"); registerMinecart(p_18305_, map, "MinecartTNT"); p_18305_.register(map, "MinecartSpawner", () -> DSL.optionalFields("DisplayTile", References.BLOCK_NAME.in(p_18305_), References.UNTAGGED_SPAWNER.in(p_18305_))); p_18305_.register( map, "MinecartHopper", p_18264_ -> DSL.optionalFields("DisplayTile", References.BLOCK_NAME.in(p_18305_), "Items", DSL.list(References.ITEM_STACK.in(p_18305_))) ); p_18305_.register( map, "MinecartCommandBlock", () -> DSL.optionalFields("DisplayTile", References.BLOCK_NAME.in(p_18305_), "LastOutput", References.TEXT_COMPONENT.in(p_18305_)) ); p_18305_.registerSimple(map, "ArmorStand"); p_18305_.registerSimple(map, "Creeper"); p_18305_.registerSimple(map, "Skeleton"); p_18305_.registerSimple(map, "Spider"); p_18305_.registerSimple(map, "Giant"); p_18305_.registerSimple(map, "Zombie"); p_18305_.registerSimple(map, "Slime"); p_18305_.registerSimple(map, "Ghast"); p_18305_.registerSimple(map, "PigZombie"); p_18305_.register(map, "Enderman", p_18298_ -> DSL.optionalFields("carried", References.BLOCK_NAME.in(p_18305_))); p_18305_.registerSimple(map, "CaveSpider"); p_18305_.registerSimple(map, "Silverfish"); p_18305_.registerSimple(map, "Blaze"); p_18305_.registerSimple(map, "LavaSlime"); p_18305_.registerSimple(map, "EnderDragon"); p_18305_.registerSimple(map, "WitherBoss"); p_18305_.registerSimple(map, "Bat"); p_18305_.registerSimple(map, "Witch"); p_18305_.registerSimple(map, "Endermite"); p_18305_.registerSimple(map, "Guardian"); p_18305_.registerSimple(map, "Pig"); p_18305_.registerSimple(map, "Sheep"); p_18305_.registerSimple(map, "Cow"); p_18305_.registerSimple(map, "Chicken"); p_18305_.registerSimple(map, "Squid"); p_18305_.registerSimple(map, "Wolf"); p_18305_.registerSimple(map, "MushroomCow"); p_18305_.registerSimple(map, "SnowMan"); p_18305_.registerSimple(map, "Ozelot"); p_18305_.registerSimple(map, "VillagerGolem"); p_18305_.register( map, "EntityHorse", p_390453_ -> DSL.optionalFields( "Items", DSL.list(References.ITEM_STACK.in(p_18305_)), "ArmorItem", References.ITEM_STACK.in(p_18305_), "SaddleItem", References.ITEM_STACK.in(p_18305_) ) ); p_18305_.registerSimple(map, "Rabbit"); p_18305_.register( map, "Villager", p_390451_ -> DSL.optionalFields( "Inventory", DSL.list(References.ITEM_STACK.in(p_18305_)), "Offers", DSL.optionalFields("Recipes", DSL.list(References.VILLAGER_TRADE.in(p_18305_))) ) ); p_18305_.registerSimple(map, "EnderCrystal"); p_18305_.register(map, "AreaEffectCloud", p_326715_ -> DSL.optionalFields("Particle", References.PARTICLE.in(p_18305_))); p_18305_.registerSimple(map, "ShulkerBullet"); p_18305_.registerSimple(map, "DragonFireball"); p_18305_.registerSimple(map, "Shulker"); return map; } @Override public Map> registerBlockEntities(Schema p_18303_) { Map> map = Maps.newHashMap(); registerInventory(p_18303_, map, "Furnace"); registerInventory(p_18303_, map, "Chest"); p_18303_.registerSimple(map, "EnderChest"); p_18303_.register(map, "RecordPlayer", p_18235_ -> DSL.optionalFields("RecordItem", References.ITEM_STACK.in(p_18303_))); registerInventory(p_18303_, map, "Trap"); registerInventory(p_18303_, map, "Dropper"); p_18303_.register(map, "Sign", () -> sign(p_18303_)); p_18303_.register(map, "MobSpawner", p_18223_ -> References.UNTAGGED_SPAWNER.in(p_18303_)); p_18303_.registerSimple(map, "Music"); p_18303_.registerSimple(map, "Piston"); registerInventory(p_18303_, map, "Cauldron"); p_18303_.registerSimple(map, "EnchantTable"); p_18303_.registerSimple(map, "Airportal"); p_18303_.register(map, "Control", () -> DSL.optionalFields("LastOutput", References.TEXT_COMPONENT.in(p_18303_))); p_18303_.registerSimple(map, "Beacon"); p_18303_.register(map, "Skull", () -> DSL.optionalFields("custom_name", References.TEXT_COMPONENT.in(p_18303_))); p_18303_.registerSimple(map, "DLDetector"); registerInventory(p_18303_, map, "Hopper"); p_18303_.registerSimple(map, "Comparator"); p_18303_.register(map, "FlowerPot", p_18192_ -> DSL.optionalFields("Item", DSL.or(DSL.constType(DSL.intType()), References.ITEM_NAME.in(p_18303_)))); p_18303_.register(map, "Banner", () -> DSL.optionalFields("CustomName", References.TEXT_COMPONENT.in(p_18303_))); p_18303_.registerSimple(map, "Structure"); p_18303_.registerSimple(map, "EndGateway"); return map; } public static TypeTemplate sign(Schema p_397989_) { return DSL.optionalFields( Pair.of("Text1", References.TEXT_COMPONENT.in(p_397989_)), Pair.of("Text2", References.TEXT_COMPONENT.in(p_397989_)), Pair.of("Text3", References.TEXT_COMPONENT.in(p_397989_)), Pair.of("Text4", References.TEXT_COMPONENT.in(p_397989_)), Pair.of("FilteredText1", References.TEXT_COMPONENT.in(p_397989_)), Pair.of("FilteredText2", References.TEXT_COMPONENT.in(p_397989_)), Pair.of("FilteredText3", References.TEXT_COMPONENT.in(p_397989_)), Pair.of("FilteredText4", References.TEXT_COMPONENT.in(p_397989_)) ); } @Override public void registerTypes(Schema p_18307_, Map> p_18308_, Map> p_18309_) { p_18307_.registerType( false, References.LEVEL, () -> DSL.optionalFields("CustomBossEvents", DSL.compoundList(DSL.optionalFields("Name", References.TEXT_COMPONENT.in(p_18307_)))) ); p_18307_.registerType( false, References.PLAYER, () -> DSL.optionalFields("Inventory", DSL.list(References.ITEM_STACK.in(p_18307_)), "EnderItems", DSL.list(References.ITEM_STACK.in(p_18307_))) ); p_18307_.registerType( false, References.CHUNK, () -> DSL.fields( "Level", DSL.optionalFields( "Entities", DSL.list(References.ENTITY_TREE.in(p_18307_)), "TileEntities", DSL.list(DSL.or(References.BLOCK_ENTITY.in(p_18307_), DSL.remainder())), "TileTicks", DSL.list(DSL.fields("i", References.BLOCK_NAME.in(p_18307_))) ) ) ); p_18307_.registerType( true, References.BLOCK_ENTITY, () -> DSL.optionalFields("components", References.DATA_COMPONENTS.in(p_18307_), DSL.taggedChoiceLazy("id", DSL.string(), p_18309_)) ); p_18307_.registerType(true, References.ENTITY_TREE, () -> DSL.optionalFields("Riding", References.ENTITY_TREE.in(p_18307_), References.ENTITY.in(p_18307_))); p_18307_.registerType(false, References.ENTITY_NAME, () -> DSL.constType(NamespacedSchema.namespacedString())); p_18307_.registerType( true, References.ENTITY, () -> DSL.and( References.ENTITY_EQUIPMENT.in(p_18307_), DSL.optionalFields("CustomName", DSL.constType(DSL.string()), DSL.taggedChoiceLazy("id", DSL.string(), p_18308_)) ) ); p_18307_.registerType( true, References.ITEM_STACK, () -> DSL.hook( DSL.optionalFields("id", DSL.or(DSL.constType(DSL.intType()), References.ITEM_NAME.in(p_18307_)), "tag", itemStackTag(p_18307_)), ADD_NAMES, HookFunction.IDENTITY ) ); p_18307_.registerType(false, References.OPTIONS, DSL::remainder); p_18307_.registerType(false, References.BLOCK_NAME, () -> DSL.or(DSL.constType(DSL.intType()), DSL.constType(NamespacedSchema.namespacedString()))); p_18307_.registerType(false, References.ITEM_NAME, () -> DSL.constType(NamespacedSchema.namespacedString())); p_18307_.registerType(false, References.STATS, DSL::remainder); p_18307_.registerType(false, References.SAVED_DATA_COMMAND_STORAGE, DSL::remainder); p_18307_.registerType(false, References.SAVED_DATA_TICKETS, DSL::remainder); p_18307_.registerType( false, References.SAVED_DATA_MAP_DATA, () -> DSL.optionalFields("banners", DSL.list(DSL.optionalFields("Name", References.TEXT_COMPONENT.in(p_18307_)))) ); p_18307_.registerType(false, References.SAVED_DATA_MAP_INDEX, DSL::remainder); p_18307_.registerType(false, References.SAVED_DATA_RAIDS, DSL::remainder); p_18307_.registerType(false, References.SAVED_DATA_RANDOM_SEQUENCES, DSL::remainder); p_18307_.registerType( false, References.SAVED_DATA_SCOREBOARD, () -> DSL.optionalFields( "data", DSL.optionalFields( "Objectives", DSL.list(References.OBJECTIVE.in(p_18307_)), "Teams", DSL.list(References.TEAM.in(p_18307_)), "PlayerScores", DSL.list(DSL.optionalFields("display", References.TEXT_COMPONENT.in(p_18307_))) ) ) ); p_18307_.registerType( false, References.SAVED_DATA_STRUCTURE_FEATURE_INDICES, () -> DSL.optionalFields("data", DSL.optionalFields("Features", DSL.compoundList(References.STRUCTURE_FEATURE.in(p_18307_)))) ); p_18307_.registerType(false, References.STRUCTURE_FEATURE, DSL::remainder); p_18307_.registerType(false, References.OBJECTIVE, DSL::remainder); p_18307_.registerType( false, References.TEAM, () -> DSL.optionalFields( "MemberNamePrefix", References.TEXT_COMPONENT.in(p_18307_), "MemberNameSuffix", References.TEXT_COMPONENT.in(p_18307_), "DisplayName", References.TEXT_COMPONENT.in(p_18307_) ) ); p_18307_.registerType(true, References.UNTAGGED_SPAWNER, DSL::remainder); p_18307_.registerType(false, References.POI_CHUNK, DSL::remainder); p_18307_.registerType(false, References.WORLD_GEN_SETTINGS, DSL::remainder); p_18307_.registerType(false, References.ENTITY_CHUNK, () -> DSL.optionalFields("Entities", DSL.list(References.ENTITY_TREE.in(p_18307_)))); p_18307_.registerType(true, References.DATA_COMPONENTS, DSL::remainder); p_18307_.registerType( true, References.VILLAGER_TRADE, () -> DSL.optionalFields( "buy", References.ITEM_STACK.in(p_18307_), "buyB", References.ITEM_STACK.in(p_18307_), "sell", References.ITEM_STACK.in(p_18307_) ) ); p_18307_.registerType(true, References.PARTICLE, () -> DSL.constType(DSL.string())); p_18307_.registerType(true, References.TEXT_COMPONENT, () -> DSL.constType(DSL.string())); p_18307_.registerType( false, References.STRUCTURE, () -> DSL.optionalFields( "entities", DSL.list(DSL.optionalFields("nbt", References.ENTITY_TREE.in(p_18307_))), "blocks", DSL.list(DSL.optionalFields("nbt", References.BLOCK_ENTITY.in(p_18307_))), "palette", DSL.list(References.BLOCK_STATE.in(p_18307_)) ) ); p_18307_.registerType(false, References.BLOCK_STATE, DSL::remainder); p_18307_.registerType(false, References.FLAT_BLOCK_STATE, DSL::remainder); p_18307_.registerType(true, References.ENTITY_EQUIPMENT, () -> DSL.optional(DSL.field("Equipment", DSL.list(References.ITEM_STACK.in(p_18307_))))); } public static TypeTemplate itemStackTag(Schema p_392240_) { return DSL.optionalFields( Pair.of("EntityTag", References.ENTITY_TREE.in(p_392240_)), Pair.of("BlockEntityTag", References.BLOCK_ENTITY.in(p_392240_)), Pair.of("CanDestroy", DSL.list(References.BLOCK_NAME.in(p_392240_))), Pair.of("CanPlaceOn", DSL.list(References.BLOCK_NAME.in(p_392240_))), Pair.of("Items", DSL.list(References.ITEM_STACK.in(p_392240_))), Pair.of("ChargedProjectiles", DSL.list(References.ITEM_STACK.in(p_392240_))), Pair.of("pages", DSL.list(References.TEXT_COMPONENT.in(p_392240_))), Pair.of("filtered_pages", DSL.compoundList(References.TEXT_COMPONENT.in(p_392240_))), Pair.of("display", DSL.optionalFields("Name", References.TEXT_COMPONENT.in(p_392240_), "Lore", DSL.list(References.TEXT_COMPONENT.in(p_392240_)))) ); } protected static T addNames(Dynamic p_18206_, Map p_18207_, Map p_334570_) { return p_18206_.update("tag", p_145917_ -> p_145917_.update("BlockEntityTag", p_145912_ -> { String s = p_18206_.get("id").asString().result().map(NamespacedSchema::ensureNamespaced).orElse("minecraft:air"); if (!"minecraft:air".equals(s)) { String s1 = p_18207_.get(s); if (s1 != null) { return p_145912_.set("id", p_18206_.createString(s1)); } LOGGER.warn("Unable to resolve BlockEntity for ItemStack: {}", s); } return p_145912_; }).update("EntityTag", p_341252_ -> { if (p_341252_.get("id").result().isPresent()) { return p_341252_; } else { String s = NamespacedSchema.ensureNamespaced(p_18206_.get("id").asString("")); String s1 = p_334570_.get(s); return s1 != null ? p_341252_.set("id", p_18206_.createString(s1)) : p_341252_; } })).getValue(); } }