From f56884705aa17fe872eaa2c41c9e1e79488eb796 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 18 Aug 2023 23:43:54 +0700 Subject: [PATCH] Fix ingredients being "empty" when playing multiplayer These changes reflects Forge's PR https://github.com/MinecraftForge/MinecraftForge/pull/9688 --- .../mc/otm/OverdriveThatMatters.java | 7 +++++++ .../mc/otm/mixin/IngredientMixin.java | 19 +++++++++++++++++++ .../mc/otm/data/IngredientCodec.kt | 9 ++++++--- .../mc/otm/recipe/PlatePressRecipe.kt | 3 --- .../overdrive_that_matters.mixins.json | 3 ++- 5 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 src/main/java/ru/dbotthepony/mc/otm/mixin/IngredientMixin.java diff --git a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java index 350d59128..2e6221c8e 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java +++ b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java @@ -7,6 +7,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.event.TagsUpdatedEvent; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.ModList; @@ -151,6 +152,10 @@ public final class OverdriveThatMatters { ToolsConfig.INSTANCE.register(); } + private void tagsUpdated(TagsUpdatedEvent event) { + Ingredient.invalidateAll(); + } + private void setup(final FMLCommonSetupEvent event) { EVENT_BUS.addListener(EventPriority.NORMAL, DrivePool.INSTANCE::onWorldSave); @@ -200,6 +205,8 @@ public final class OverdriveThatMatters { EVENT_BUS.addListener(EventPriority.NORMAL, DevChestBlockEntity.Companion::mappingsChanged); + EVENT_BUS.addListener(EventPriority.NORMAL, this::tagsUpdated); + MatteryPlayerNetworkChannel.INSTANCE.register(); MenuNetworkChannel.INSTANCE.register(); WeaponNetworkChannel.INSTANCE.register(); diff --git a/src/main/java/ru/dbotthepony/mc/otm/mixin/IngredientMixin.java b/src/main/java/ru/dbotthepony/mc/otm/mixin/IngredientMixin.java new file mode 100644 index 000000000..ada9fe9ce --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/mixin/IngredientMixin.java @@ -0,0 +1,19 @@ +package ru.dbotthepony.mc.otm.mixin; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(Ingredient.class) +public abstract class IngredientMixin { + @Inject( + method = "getItems()[Lnet/minecraft/world/item/ItemStack;", + at = @At("HEAD") + ) + public void getItemsPatch(CallbackInfoReturnable info) { + ((Ingredient) (Object) this).checkInvalidation(); + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/data/IngredientCodec.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/data/IngredientCodec.kt index 27c18ade8..7eea0a880 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/data/IngredientCodec.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/data/IngredientCodec.kt @@ -1,5 +1,6 @@ package ru.dbotthepony.mc.otm.data +import com.google.gson.JsonParseException import com.google.gson.JsonSyntaxException import com.mojang.datafixers.util.Pair import com.mojang.serialization.Codec @@ -14,10 +15,12 @@ object IngredientCodec : Codec { } override fun decode(ops: DynamicOps, input: T): DataResult> { - try { - return DataResult.success(Pair(Ingredient.fromJson(ops.convertTo(JsonOps.INSTANCE, input)), ops.empty())) + return try { + DataResult.success(Pair(Ingredient.fromJson(ops.convertTo(JsonOps.INSTANCE, input)), ops.empty())) } catch (err: JsonSyntaxException) { - return DataResult.error { "Error decoding Ingredient: ${err.message}" } + DataResult.error { "Error decoding Ingredient: ${err.message}" } + } catch (err: JsonParseException) { + DataResult.error { "Error decoding Ingredient: ${err.message}" } } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/PlatePressRecipe.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/PlatePressRecipe.kt index 49ad6efd3..0cb3d373b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/PlatePressRecipe.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/PlatePressRecipe.kt @@ -56,9 +56,6 @@ class PlatePressRecipe( } override fun getIngredients(): NonNullList { - if (isIncomplete) - return super.getIngredients() - return NonNullList.of(Ingredient.EMPTY, input) } diff --git a/src/main/resources/overdrive_that_matters.mixins.json b/src/main/resources/overdrive_that_matters.mixins.json index cc4920e9d..74743f38a 100644 --- a/src/main/resources/overdrive_that_matters.mixins.json +++ b/src/main/resources/overdrive_that_matters.mixins.json @@ -15,7 +15,8 @@ "MixinAbstractHurtingProjectile", "SimpleCriterionTriggerMixin", "InventoryChangeTriggerMixin", - "MixinPlayer" + "MixinPlayer", + "IngredientMixin" ], "client": [ "MixinGameRenderer",