From be60ddbfca41c8c3bb4ff6844094f6626055e8eb Mon Sep 17 00:00:00 2001 From: LexManos Date: Wed, 20 Sep 2023 17:46:22 -0700 Subject: [PATCH] Enable ForgeLootTableProvider. --- .../data/minecraft/recipes/bamboo_fence.json | 2 +- .../minecraft/recipes/bamboo_fence_gate.json | 2 +- src/generated/resources/pack.mcmeta | 2 +- .../net/minecraftforge/common/ForgeMod.java | 3 +- .../crafting/conditions/ICondition.java | 4 + .../common/data/ForgeLootTableProvider.java | 102 ++++++++++-------- 6 files changed, 69 insertions(+), 46 deletions(-) diff --git a/src/generated/resources/data/minecraft/recipes/bamboo_fence.json b/src/generated/resources/data/minecraft/recipes/bamboo_fence.json index a6ee1ca953..08d3a67b96 100644 --- a/src/generated/resources/data/minecraft/recipes/bamboo_fence.json +++ b/src/generated/resources/data/minecraft/recipes/bamboo_fence.json @@ -1,7 +1,7 @@ { "type": "minecraft:crafting_shaped", "category": "misc", - "group": "wooden_custom_fence", + "group": "wooden_fence", "key": { "#": { "tag": "forge:rods/wooden" diff --git a/src/generated/resources/data/minecraft/recipes/bamboo_fence_gate.json b/src/generated/resources/data/minecraft/recipes/bamboo_fence_gate.json index 09dc54b13e..4682b1d2fc 100644 --- a/src/generated/resources/data/minecraft/recipes/bamboo_fence_gate.json +++ b/src/generated/resources/data/minecraft/recipes/bamboo_fence_gate.json @@ -1,7 +1,7 @@ { "type": "minecraft:crafting_shaped", "category": "redstone", - "group": "wooden_custom_fence_gate", + "group": "wooden_fence_gate", "key": { "#": { "tag": "forge:rods/wooden" diff --git a/src/generated/resources/pack.mcmeta b/src/generated/resources/pack.mcmeta index 9fbfc8a424..fe3ab14755 100644 --- a/src/generated/resources/pack.mcmeta +++ b/src/generated/resources/pack.mcmeta @@ -3,6 +3,6 @@ "description": { "translate": "pack.forge.description" }, - "pack_format": 15 + "pack_format": 18 } } \ No newline at end of file diff --git a/src/main/java/net/minecraftforge/common/ForgeMod.java b/src/main/java/net/minecraftforge/common/ForgeMod.java index 7071f1df09..5db01feadd 100644 --- a/src/main/java/net/minecraftforge/common/ForgeMod.java +++ b/src/main/java/net/minecraftforge/common/ForgeMod.java @@ -47,6 +47,7 @@ import net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions; import net.minecraftforge.common.data.ExistingFileHelper; import net.minecraftforge.common.data.ForgeBiomeTagsProvider; import net.minecraftforge.common.data.ForgeFluidTagsProvider; +import net.minecraftforge.common.data.ForgeLootTableProvider; import net.minecraftforge.common.data.ForgeSpriteSourceProvider; import net.minecraftforge.common.data.VanillaSoundDefinitionsProvider; import net.minecraftforge.common.extensions.IForgeEntity; @@ -504,7 +505,7 @@ public class ForgeMod { gen.addProvider(event.includeServer(), new ForgeEntityTypeTagsProvider(packOutput, lookupProvider, existingFileHelper)); gen.addProvider(event.includeServer(), new ForgeFluidTagsProvider(packOutput, lookupProvider, existingFileHelper)); gen.addProvider(event.includeServer(), new ForgeRecipeProvider(packOutput)); - //gen.addProvider(event.includeServer(), new ForgeLootTableProvider(packOutput)); + gen.addProvider(event.includeServer(), new ForgeLootTableProvider(packOutput)); gen.addProvider(event.includeServer(), new ForgeBiomeTagsProvider(packOutput, lookupProvider, existingFileHelper)); gen.addProvider(event.includeClient(), new ForgeSpriteSourceProvider(packOutput, existingFileHelper)); diff --git a/src/main/java/net/minecraftforge/common/crafting/conditions/ICondition.java b/src/main/java/net/minecraftforge/common/crafting/conditions/ICondition.java index 89b8ed67bf..e33a2ba4a8 100644 --- a/src/main/java/net/minecraftforge/common/crafting/conditions/ICondition.java +++ b/src/main/java/net/minecraftforge/common/crafting/conditions/ICondition.java @@ -23,6 +23,8 @@ import java.util.Optional; import java.util.Set; import java.util.function.Function; +import org.jetbrains.annotations.ApiStatus; + public interface ICondition { Codec CODEC = ExtraCodecs.lazyInitializedCodec(() -> ForgeRegistries.CONDITION_SERIALIZERS.get().getCodec().dispatch(ICondition::codec, Function.identity())); String DEFAULT_FIELD = "forge:condition"; @@ -33,6 +35,8 @@ public interface ICondition { Codec codec(); interface IContext { + /* Key used to attach this context option to a DynamicOps instance */ + @ApiStatus.Internal public static ResourceLocation KEY = new ResourceLocation("forge", "condition_context"); IContext EMPTY = new IContext() { diff --git a/src/main/java/net/minecraftforge/common/data/ForgeLootTableProvider.java b/src/main/java/net/minecraftforge/common/data/ForgeLootTableProvider.java index c12a9b39da..704b15df34 100644 --- a/src/main/java/net/minecraftforge/common/data/ForgeLootTableProvider.java +++ b/src/main/java/net/minecraftforge/common/data/ForgeLootTableProvider.java @@ -4,7 +4,7 @@ */ package net.minecraftforge.common.data; -/* + import net.minecraft.advancements.critereon.ItemPredicate; import net.minecraft.data.PackOutput; import net.minecraft.data.loot.LootTableProvider; @@ -22,11 +22,14 @@ import net.minecraftforge.common.ToolActions; import net.minecraftforge.common.loot.CanToolPerformAction; import net.minecraftforge.fml.util.ObfuscationReflectionHelper; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import com.google.common.collect.ImmutableList; + import net.minecraft.world.level.storage.loot.LootPool; import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.ValidationContext; @@ -35,8 +38,15 @@ import net.minecraft.world.level.storage.loot.entries.LootPoolEntryContainer; /** * Currently used only for replacing shears item to shears_dig tool action - * / + */ public final class ForgeLootTableProvider extends LootTableProvider { + private static final String POOLS = "f_7915" + "6_"; // LootTable.Builder.pools + private static final String ENTRIES = "f_7902" + "3_"; // LootPool.entries + private static final String CONDITIONS = "f_7902" + "4_"; // LootPool.conditions + private static final String CHILDREN = "f_7942" + "8_"; // CompositeEntryBase.children + private static final String ENTRY_CONDITION = "f_7963" + "6_"; // LootPoolEntryContainer.conditions + private static final String TERMS = "f_28560" + "9_"; // CompositeLootItemCondition.terms + public ForgeLootTableProvider(PackOutput packOutput) { super(packOutput, Set.of(), VanillaLootTableProvider.create(packOutput).getTables()); } @@ -63,14 +73,14 @@ public final class ForgeLootTableProvider extends LootTableProvider { } private boolean findAndReplaceInLootTableBuilder(LootTable.Builder builder, Item from, ToolAction toolAction) { - List lootPools = ObfuscationReflectionHelper.getPrivateValue(LootTable.Builder.class, builder, "f_7915" + "6_"); + ImmutableList.Builder lootPools = ObfuscationReflectionHelper.getPrivateValue(LootTable.Builder.class, builder, POOLS); boolean found = false; if (lootPools == null) { - throw new IllegalStateException(LootTable.Builder.class.getName() + " is missing field f_7915" + "6_"); + throw new IllegalStateException(LootTable.Builder.class.getName() + " is missing field " + POOLS); } - for (LootPool lootPool : lootPools) { + for (LootPool lootPool : lootPools.build()) { if (findAndReplaceInLootPool(lootPool, from, toolAction)) { found = true; } @@ -80,39 +90,40 @@ public final class ForgeLootTableProvider extends LootTableProvider { } private boolean findAndReplaceInLootPool(LootPool lootPool, Item from, ToolAction toolAction) { - LootPoolEntryContainer[] lootEntries = ObfuscationReflectionHelper.getPrivateValue(LootPool.class, lootPool, "f_7902" +"3_"); - LootItemCondition[] lootConditions = ObfuscationReflectionHelper.getPrivateValue(LootPool.class, lootPool, "f_7902" + "4_"); + List lootEntries = ObfuscationReflectionHelper.getPrivateValue(LootPool.class, lootPool, ENTRIES); + List lootConditions = ObfuscationReflectionHelper.getPrivateValue(LootPool.class, lootPool, CONDITIONS); boolean found = false; - if (lootEntries == null) { - throw new IllegalStateException(LootPool.class.getName() + " is missing field f_7902" + "3_"); - } + if (lootEntries == null) + throw new IllegalStateException(LootPool.class.getName() + " is missing field " + ENTRIES); for (LootPoolEntryContainer lootEntry : lootEntries) { - if (findAndReplaceInLootEntry(lootEntry, from, toolAction)) { + if (findAndReplaceInLootEntry(lootEntry, from, toolAction)) found = true; - } + if (lootEntry instanceof CompositeEntryBase) { - if (findAndReplaceInParentedLootEntry((CompositeEntryBase) lootEntry, from, toolAction)) { + if (findAndReplaceInParentedLootEntry((CompositeEntryBase) lootEntry, from, toolAction)) found = true; - } } } - if (lootConditions == null) { - throw new IllegalStateException(LootPool.class.getName() + " is missing field f_7902" + "4_"); + if (lootConditions == null) + throw new IllegalStateException(LootPool.class.getName() + " is missing field " + CONDITIONS); + else { + lootConditions = new ArrayList<>(lootConditions); + ObfuscationReflectionHelper.setPrivateValue(LootPool.class, lootPool, lootConditions, CONDITIONS); } - for (int i = 0; i < lootConditions.length; i++) { - LootItemCondition lootCondition = lootConditions[i]; - if (lootCondition instanceof MatchTool && checkMatchTool((MatchTool) lootCondition, from)) { - lootConditions[i] = CanToolPerformAction.canToolPerformAction(toolAction).build(); + for (int i = 0; i < lootConditions.size(); i++) { + LootItemCondition lootCondition = lootConditions.get(i); + if (lootCondition instanceof MatchTool matchTool && checkMatchTool(matchTool, from)) { + lootConditions.set(i, CanToolPerformAction.canToolPerformAction(toolAction).build()); found = true; - } else if (lootCondition instanceof InvertedLootItemCondition) { - LootItemCondition invLootCondition = ObfuscationReflectionHelper.getPrivateValue(InvertedLootItemCondition.class, (InvertedLootItemCondition) lootCondition, "f_8168" + "1_"); + } else if (lootCondition instanceof InvertedLootItemCondition inverted) { + LootItemCondition invLootCondition = inverted.term(); - if (invLootCondition instanceof MatchTool && checkMatchTool((MatchTool) invLootCondition, from)) { - lootConditions[i] = InvertedLootItemCondition.invert(CanToolPerformAction.canToolPerformAction(toolAction)).build(); + if (invLootCondition instanceof MatchTool matchTool && checkMatchTool(matchTool, from)) { + lootConditions.set(i, InvertedLootItemCondition.invert(CanToolPerformAction.canToolPerformAction(toolAction)).build()); found = true; } else if (invLootCondition instanceof CompositeLootItemCondition compositeLootItemCondition && findAndReplaceInComposite(compositeLootItemCondition, from, toolAction)) { found = true; @@ -120,15 +131,17 @@ public final class ForgeLootTableProvider extends LootTableProvider { } } + + return found; } private boolean findAndReplaceInParentedLootEntry(CompositeEntryBase entry, Item from, ToolAction toolAction) { - LootPoolEntryContainer[] lootEntries = ObfuscationReflectionHelper.getPrivateValue(CompositeEntryBase.class, entry, "f_7942" + "8_"); + List lootEntries = ObfuscationReflectionHelper.getPrivateValue(CompositeEntryBase.class, entry, CHILDREN); boolean found = false; if (lootEntries == null) { - throw new IllegalStateException(CompositeEntryBase.class.getName() + " is missing field f_7942" + "8_"); + throw new IllegalStateException(CompositeEntryBase.class.getName() + " is missing field " + CHILDREN); } for (LootPoolEntryContainer lootEntry : lootEntries) { @@ -141,18 +154,22 @@ public final class ForgeLootTableProvider extends LootTableProvider { } private boolean findAndReplaceInLootEntry(LootPoolEntryContainer entry, Item from, ToolAction toolAction) { - LootItemCondition[] lootConditions = ObfuscationReflectionHelper.getPrivateValue(LootPoolEntryContainer.class, entry, "f_7963" + "6_"); + List lootConditions = ObfuscationReflectionHelper.getPrivateValue(LootPoolEntryContainer.class, entry, ENTRY_CONDITION); boolean found = false; - if (lootConditions == null) { + if (lootConditions == null) throw new IllegalStateException(LootPoolEntryContainer.class.getName() + " is missing field f_7963" + "6_"); + else { + lootConditions = new ArrayList<>(lootConditions); + ObfuscationReflectionHelper.setPrivateValue(LootPoolEntryContainer.class, entry, lootConditions, ENTRY_CONDITION); } - for (int i = 0; i < lootConditions.length; i++) { - if (lootConditions[i] instanceof CompositeLootItemCondition composite && findAndReplaceInComposite(composite, from, toolAction)) { + for (int i = 0; i < lootConditions.size(); i++) { + var condition = lootConditions.get(i); + if (condition instanceof CompositeLootItemCondition composite && findAndReplaceInComposite(composite, from, toolAction)) { found = true; - } else if (lootConditions[i] instanceof MatchTool && checkMatchTool((MatchTool) lootConditions[i], from)) { - lootConditions[i] = CanToolPerformAction.canToolPerformAction(toolAction).build(); + } else if (condition instanceof MatchTool matchTool && checkMatchTool(matchTool, from)) { + lootConditions.set(i, CanToolPerformAction.canToolPerformAction(toolAction).build()); found = true; } } @@ -161,16 +178,19 @@ public final class ForgeLootTableProvider extends LootTableProvider { } private boolean findAndReplaceInComposite(CompositeLootItemCondition alternative, Item from, ToolAction toolAction) { - LootItemCondition[] lootConditions = ObfuscationReflectionHelper.getPrivateValue(CompositeLootItemCondition.class, alternative, "f_28560" + "9_"); + List lootConditions = ObfuscationReflectionHelper.getPrivateValue(CompositeLootItemCondition.class, alternative, TERMS); boolean found = false; - if (lootConditions == null) { - throw new IllegalStateException(CompositeLootItemCondition.class.getName() + " is missing field f_28560" + "9_"); + if (lootConditions == null) + throw new IllegalStateException(CompositeLootItemCondition.class.getName() + " is missing field " + TERMS); + else { + lootConditions = new ArrayList<>(lootConditions); + ObfuscationReflectionHelper.setPrivateValue(CompositeLootItemCondition.class, alternative, lootConditions, TERMS); } - for (int i = 0; i < lootConditions.length; i++) { - if (lootConditions[i] instanceof MatchTool && checkMatchTool((MatchTool) lootConditions[i], from)) { - lootConditions[i] = CanToolPerformAction.canToolPerformAction(toolAction).build(); + for (int i = 0; i < lootConditions.size(); i++) { + if (lootConditions.get(i) instanceof MatchTool matchTool && checkMatchTool(matchTool, from)) { + lootConditions.set(i, CanToolPerformAction.canToolPerformAction(toolAction).build()); found = true; } } @@ -178,10 +198,8 @@ public final class ForgeLootTableProvider extends LootTableProvider { return found; } + @SuppressWarnings("deprecation") private boolean checkMatchTool(MatchTool lootCondition, Item expected) { - ItemPredicate predicate = ObfuscationReflectionHelper.getPrivateValue(MatchTool.class, lootCondition, "f_8199" + "3_"); - Set items = ObfuscationReflectionHelper.getPrivateValue(ItemPredicate.class, predicate, "f_15142" + "7_"); - return items != null && items.contains(expected); + return lootCondition.predicate().flatMap(ItemPredicate::items).filter(s -> s.contains(expected.builtInRegistryHolder())).isPresent(); } } -*/ \ No newline at end of file