diff --git a/common/src/main/java/dev/architectury/hooks/item/tool/AxeItemHooks.java b/common/src/main/java/dev/architectury/hooks/item/tool/AxeItemHooks.java new file mode 100644 index 00000000..b7ff4252 --- /dev/null +++ b/common/src/main/java/dev/architectury/hooks/item/tool/AxeItemHooks.java @@ -0,0 +1,19 @@ +package dev.architectury.hooks.item.tool; + +import com.google.common.collect.ImmutableMap; +import net.minecraft.world.item.AxeItem; +import net.minecraft.world.level.block.Block; + +import java.util.HashMap; + +public final class AxeItemHooks { + private AxeItemHooks() { + } + + public static void addStrippingRecipe(Block src, Block dst) { + if (AxeItem.STRIPPABLES instanceof ImmutableMap) { + AxeItem.STRIPPABLES = new HashMap<>(AxeItem.STRIPPABLES); + } + AxeItem.STRIPPABLES.put(src, dst); + } +} diff --git a/common/src/main/java/dev/architectury/hooks/item/tool/HoeItemHooks.java b/common/src/main/java/dev/architectury/hooks/item/tool/HoeItemHooks.java new file mode 100644 index 00000000..302fb637 --- /dev/null +++ b/common/src/main/java/dev/architectury/hooks/item/tool/HoeItemHooks.java @@ -0,0 +1,23 @@ +package dev.architectury.hooks.item.tool; + +import com.google.common.collect.ImmutableMap; +import com.mojang.datafixers.util.Pair; +import net.minecraft.world.item.HoeItem; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.block.Block; + +import java.util.HashMap; +import java.util.function.Consumer; +import java.util.function.Predicate; + +public class HoeItemHooks { + private HoeItemHooks() { + } + + public static void addTillingRecipe(Block src, Predicate predicate, Consumer action) { + if (HoeItem.TILLABLES instanceof ImmutableMap) { + HoeItem.TILLABLES = new HashMap<>(HoeItem.TILLABLES); + } + HoeItem.TILLABLES.put(src, new Pair<>(predicate, action)); + } +} diff --git a/common/src/main/java/dev/architectury/hooks/item/tool/ShovelItemHooks.java b/common/src/main/java/dev/architectury/hooks/item/tool/ShovelItemHooks.java new file mode 100644 index 00000000..91f48c50 --- /dev/null +++ b/common/src/main/java/dev/architectury/hooks/item/tool/ShovelItemHooks.java @@ -0,0 +1,20 @@ +package dev.architectury.hooks.item.tool; + +import com.google.common.collect.ImmutableMap; +import net.minecraft.world.item.ShovelItem; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; + +import java.util.HashMap; + +public final class ShovelItemHooks { + private ShovelItemHooks() { + } + + public static void addFlatteningRecipe(Block src, BlockState dst) { + if (ShovelItem.FLATTENABLES instanceof ImmutableMap) { + ShovelItem.FLATTENABLES = new HashMap<>(ShovelItem.FLATTENABLES); + } + ShovelItem.FLATTENABLES.put(src, dst); + } +} diff --git a/common/src/main/resources/architectury.accessWidener b/common/src/main/resources/architectury.accessWidener index 9376d749..c20dffd6 100644 --- a/common/src/main/resources/architectury.accessWidener +++ b/common/src/main/resources/architectury.accessWidener @@ -40,4 +40,10 @@ mutable field net/minecraft/world/level/biome/BiomeSpecialEffects ambientAdditio accessible field net/minecraft/world/level/biome/BiomeSpecialEffects backgroundMusic Ljava/util/Optional; mutable field net/minecraft/world/level/biome/BiomeSpecialEffects backgroundMusic Ljava/util/Optional; accessible method net/minecraft/world/level/storage/LevelResource (Ljava/lang/String;)V -accessible class net/minecraft/world/level/block/entity/BlockEntityType$BlockEntitySupplier \ No newline at end of file +accessible class net/minecraft/world/level/block/entity/BlockEntityType$BlockEntitySupplier +accessible field net/minecraft/world/item/AxeItem STRIPPABLES Ljava/util/Map; +mutable field net/minecraft/world/item/AxeItem STRIPPABLES Ljava/util/Map; +accessible field net/minecraft/world/item/ShovelItem FLATTENABLES Ljava/util/Map; +mutable field net/minecraft/world/item/ShovelItem FLATTENABLES Ljava/util/Map; +accessible field net/minecraft/world/item/HoeItem TILLABLES Ljava/util/Map; +mutable field net/minecraft/world/item/HoeItem TILLABLES Ljava/util/Map; \ No newline at end of file diff --git a/fabric/src/main/resources/architectury.accessWidener b/fabric/src/main/resources/architectury.accessWidener index 5e44d25c..dd39e916 100644 --- a/fabric/src/main/resources/architectury.accessWidener +++ b/fabric/src/main/resources/architectury.accessWidener @@ -98,4 +98,10 @@ mutable field net/minecraft/world/level/biome/BiomeSpecialEffects ambientAdditio accessible field net/minecraft/world/level/biome/BiomeSpecialEffects backgroundMusic Ljava/util/Optional; mutable field net/minecraft/world/level/biome/BiomeSpecialEffects backgroundMusic Ljava/util/Optional; accessible method net/minecraft/world/level/storage/LevelResource (Ljava/lang/String;)V -accessible class net/minecraft/world/level/block/entity/BlockEntityType$BlockEntitySupplier \ No newline at end of file +accessible class net/minecraft/world/level/block/entity/BlockEntityType$BlockEntitySupplier +accessible field net/minecraft/world/item/AxeItem STRIPPABLES Ljava/util/Map; +mutable field net/minecraft/world/item/AxeItem STRIPPABLES Ljava/util/Map; +accessible field net/minecraft/world/item/ShovelItem FLATTENABLES Ljava/util/Map; +mutable field net/minecraft/world/item/ShovelItem FLATTENABLES Ljava/util/Map; +accessible field net/minecraft/world/item/HoeItem TILLABLES Ljava/util/Map; +mutable field net/minecraft/world/item/HoeItem TILLABLES Ljava/util/Map; \ No newline at end of file diff --git a/forge/src/main/resources/META-INF/accesstransformer.cfg b/forge/src/main/resources/META-INF/accesstransformer.cfg index 2cbec00e..a18e70b5 100644 --- a/forge/src/main/resources/META-INF/accesstransformer.cfg +++ b/forge/src/main/resources/META-INF/accesstransformer.cfg @@ -45,3 +45,6 @@ public net.minecraft.world.level.GameRules$IntegerValue m_46294_(ILjava/util/fun public net.minecraft.client.particle.ParticleEngine f_107296_ # textureAtlas public net.minecraft.client.particle.ParticleEngine$MutableSpriteSet public net.minecraft.client.particle.ParticleEngine$MutableSpriteSet f_107406_ # sprites +public-f net.minecraft.world.item.AxeItem f_150683_ # STRIPPABLES +public-f net.minecraft.world.item.ShovelItem f_43110_ # FLATTENABLES +public-f net.minecraft.world.item.HoeItem f_41332_ # TILLABLES diff --git a/testmod-common/src/main/java/dev/architectury/test/TestMod.java b/testmod-common/src/main/java/dev/architectury/test/TestMod.java index bdc91ad1..19172b68 100644 --- a/testmod-common/src/main/java/dev/architectury/test/TestMod.java +++ b/testmod-common/src/main/java/dev/architectury/test/TestMod.java @@ -29,6 +29,7 @@ import dev.architectury.test.events.DebugEvents; import dev.architectury.test.gamerule.TestGameRules; import dev.architectury.test.networking.TestModNet; import dev.architectury.test.particle.TestParticles; +import dev.architectury.test.recipe.TestRecipes; import dev.architectury.test.registry.TestRegistries; import dev.architectury.test.registry.client.TestKeybinds; import dev.architectury.test.tags.TestTags; @@ -52,6 +53,7 @@ public class TestMod { TestTrades.init(); TestParticles.initialize(); TestModNet.initialize(); + TestRecipes.init(); if (Platform.getEnvironment() == Env.CLIENT) { initializeClient(); } diff --git a/testmod-common/src/main/java/dev/architectury/test/recipe/TestRecipes.java b/testmod-common/src/main/java/dev/architectury/test/recipe/TestRecipes.java new file mode 100644 index 00000000..f5112a10 --- /dev/null +++ b/testmod-common/src/main/java/dev/architectury/test/recipe/TestRecipes.java @@ -0,0 +1,39 @@ +package dev.architectury.test.recipe; + +import dev.architectury.hooks.item.tool.AxeItemHooks; +import dev.architectury.hooks.item.tool.HoeItemHooks; +import dev.architectury.hooks.item.tool.ShovelItemHooks; +import net.minecraft.Util; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.Blocks; + +public final class TestRecipes { + private TestRecipes() { + } + + public static void init() { + AxeItemHooks.addStrippingRecipe(Blocks.QUARTZ_PILLAR, Blocks.OAK_LOG); + ShovelItemHooks.addFlatteningRecipe(Blocks.IRON_ORE, Blocks.DIAMOND_BLOCK.defaultBlockState()); + HoeItemHooks.addTillingRecipe(Blocks.COAL_BLOCK, ctx -> { + if (!ctx.getLevel().isNight()) { + if (!ctx.getLevel().isClientSide) { + Player player = ctx.getPlayer(); + if (player != null) + player.sendMessage(new TextComponent("These dark arts can only be done at night!"), Util.NIL_UUID); + } + return false; + } + return true; + }, ctx -> { + BlockPos pos = ctx.getClickedPos(); + ctx.getLevel().setBlock(pos, Blocks.DIAMOND_BLOCK.defaultBlockState(), 3); + if (!ctx.getLevel().isClientSide) { + Player player = ctx.getPlayer(); + if (player != null) + player.sendMessage(new TextComponent("Thou has successfully committed the dark arts of alchemy!!"), Util.NIL_UUID); + } + }); + } +}