diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ToolModeSwitchBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ToolModeSwitchBehavior.java index e230ff01ac5..692109b0de2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ToolModeSwitchBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ToolModeSwitchBehavior.java @@ -1,18 +1,29 @@ package com.gregtechceu.gtceu.common.item.tool.behavior; +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.item.tool.behavior.IToolBehavior; +import com.gregtechceu.gtceu.common.data.GTSoundEntries; import com.gregtechceu.gtceu.common.data.item.GTToolActions; +import com.gregtechceu.gtceu.data.recipe.CustomTags; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.common.ToolAction; import lombok.Getter; @@ -20,6 +31,7 @@ import org.jetbrains.annotations.Nullable; import java.util.List; +import java.util.Set; import static com.gregtechceu.gtceu.api.item.tool.ToolHelper.getBehaviorsTag; @@ -49,13 +61,40 @@ public void addBehaviorNBT(@NotNull ItemStack stack, @NotNull CompoundTag tag) { IToolBehavior.super.addBehaviorNBT(stack, tag); } + @Override + public @NotNull InteractionResult onItemUse(UseOnContext context) { + Level world = context.getLevel(); + BlockHitResult blockHitResult = context.getHitResult(); + Player player = context.getPlayer(); + ItemStack itemStack = context.getItemInHand(); + BlockState state = world.getBlockState(blockHitResult.getBlockPos()); + BlockPos pos = blockHitResult.getBlockPos(); + Set toolTypes = ToolHelper.getToolTypes(itemStack); + // Copied and adapted from + // https://github.com/Creators-of-Create/Create/blob/mc1.20.1/dev/src/main/java/com/simibubi/create/content/equipment/wrench/WrenchItem.java + if (toolTypes.contains(GTToolType.WRENCH) && GTCEu.Mods.isCreateLoaded() && + state.is(CustomTags.CREATE_WRENCH_PICKUP)) { + if (!(world instanceof ServerLevel serverLevel)) + return InteractionResult.SUCCESS; + if (player != null && !player.isCreative()) + Block.getDrops(state, serverLevel, pos, world.getBlockEntity(pos), player, itemStack) + .forEach(stack -> player.getInventory().placeItemBackInInventory(stack)); + state.spawnAfterBreak(serverLevel, pos, ItemStack.EMPTY, true); + world.destroyBlock(pos, false); + GTSoundEntries.WRENCH_TOOL.playOnServer(serverLevel, pos, 1, GTValues.RNG.nextFloat() * .5f + .5f); + return InteractionResult.SUCCESS; + } + + if (player != null) world.getBlockState(pos).use(world, player, context.getHand(), blockHitResult); + return InteractionResult.SUCCESS; + } + @Override public @NotNull InteractionResultHolder onItemRightClick(@NotNull Level world, @NotNull Player player, @NotNull InteractionHand hand) { var itemStack = player.getItemInHand(hand); var tagCompound = getBehaviorsTag(itemStack); if (player.isShiftKeyDown()) { - var toolTypes = ToolHelper.getToolTypes(itemStack); if (toolTypes.contains(GTToolType.WRENCH)) { tagCompound.putByte("Mode", diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/CustomTags.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/CustomTags.java index b11f390d082..e2a876e0510 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/CustomTags.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/CustomTags.java @@ -2,7 +2,9 @@ import com.gregtechceu.gtceu.api.data.tag.TagUtil; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; import net.minecraft.tags.TagKey; import net.minecraft.world.entity.EntityType; @@ -200,6 +202,8 @@ public class CustomTags { public static final TagKey CLEANROOM_FLOORS = TagUtil.createModBlockTag("cleanroom_floors"); public static final TagKey CHARCOAL_PILE_IGNITER_WALLS = TagUtil.createModBlockTag( "charcoal_pile_igniter_walls"); + public static final TagKey CREATE_WRENCH_PICKUP = TagUtil.optionalTag(BuiltInRegistries.BLOCK, + new ResourceLocation("create", "wrench_pickup")); public static final TagKey IS_SWAMP = TagUtil.createTag(Registries.BIOME, "is_swamp", false); public static final TagKey IS_SANDY = TagUtil.createModTag(Registries.BIOME, "is_sandy");