diff --git a/dependencies.gradle b/dependencies.gradle index 15a9f452b95..fecc244f0d7 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -62,6 +62,7 @@ dependencies { // Maps modCompileOnly(forge.ftbchunks) + modCompileOnly(forge.xaeroslib) modCompileOnly(forge.xaerosminimap) modCompileOnly(forge.xaerosworldmap) modCompileOnly(forge.journeymap.api) diff --git a/docs/content/Modpacks/Changes/v8.0.0.md b/docs/content/Modpacks/Changes/v8.0.0.md index fdeb7e18ec6..d439a3ab106 100644 --- a/docs/content/Modpacks/Changes/v8.0.0.md +++ b/docs/content/Modpacks/Changes/v8.0.0.md @@ -145,4 +145,5 @@ A large number of machine feature interfaces have been removed, and have had the - `BlastingRecipeBuilder`, `CampfireRecipeBuilder`, `SmeltingRecipeBuilder` and `SmokingRecipeBuilder` have been merged into `SimpleCookingRecipeBuilder` - Example usage: `SimpleCookingRecipeBuilder.campfireCooking("cooking_chicken").input(new ItemStack(Items.CHICKEN)).output(new ItemStacks(Items.COOKED_CHICKEN)).cookingTime(100).experience(100).save(provider);` - `GTFluidImpl` has been merged into `GTFluid`, use `GTFluid.Flowing` and `GTFluid.Source` instead of `GTFluidImpl.Flowing` and `GTFluidImpl.Source`. -- Item behaviors have been moved to `common/item/behavior`, and some items have been moved from `api/item` to `common/item` +- Item behaviors have been moved to `common/item/behavior`, and some items have been moved from `api/item` to `common/item`. +- Methods for processing machine interactions have changed, and all now take a single `ExtendedUseOnContext` argument. diff --git a/gradle/forge.versions.toml b/gradle/forge.versions.toml index 1d0db77b89f..9c7ff7e33f1 100644 --- a/gradle/forge.versions.toml +++ b/gradle/forge.versions.toml @@ -25,6 +25,9 @@ ccTweaked = "1.114.3" create = "6.0.6-150" ponder = "1.0.80" flywheel = "1.0.4" +xaerosLib = "1.1.0" +xaerosWorldMap = "1.40.11" +xaerosMinimap = "25.3.10" ## modrinth maven ## jade = "11.6.3" @@ -36,8 +39,6 @@ modernfix = "DdUByV9S" # 5.24.1+mc1.20.1 worldStripper = "4578579" javd = "4803995" trenzalore = "4848244" -xaerosWorldMap = "5658224" -xaerosMinimap = "5773012" journeyMap = "5789363" resourcefullib = "5659871" argonauts = "5263580" @@ -90,6 +91,9 @@ jade = { module = "maven.modrinth:jade", version.ref = "jade" } embeddium = { module = "maven.modrinth:embeddium", version.ref = "embeddium" } oculus = { module = "maven.modrinth:oculus", version.ref = "oculus" } modernfix = { module = "maven.modrinth:modernfix", version.ref = "modernfix" } +xaeroslib = { module = "xaero.lib:xaerolib-forge-1.20.1", version.ref = "xaerosLib" } +xaerosworldmap = { module = "xaero.map:xaeroworldmap-forge-1.20.1", version.ref = "xaerosWorldMap" } +xaerosminimap = { module = "xaero.minimap:xaerominimap-forge-1.20.1", version.ref = "xaerosMinimap" } cc-tweaked-core-api = { module = "cc.tweaked:cc-tweaked-1.20.1-core-api", version.ref = "ccTweaked" } @@ -99,8 +103,6 @@ cc-tweaked-forge-impl = { module = "cc.tweaked:cc-tweaked-1.20.1-forge", version worldstripper = { module = "curse.maven:worldStripper-250603", version.ref = "worldStripper" } javd = { module = "curse.maven:javd-370890", version.ref = "javd" } trenzalore = { module = "curse.maven:trenzalore-870210", version.ref = "trenzalore" } -xaerosworldmap = { module = "curse.maven:xaeros-world-map-317780", version.ref = "xaerosWorldMap" } -xaerosminimap = { module = "curse.maven:xaeros-minimap-263420", version.ref = "xaerosMinimap" } journeymap-forge = { module = "curse.maven:journeymap-32274", version.ref = "journeyMap" } resourcefullib = { module = "curse.maven:resourceful-lib-570073", version.ref = "resourcefullib" } argonauts = { module = "curse.maven:argonauts-845833", version.ref = "argonauts" } diff --git a/gradle/scripts/repositories.gradle b/gradle/scripts/repositories.gradle index 4ce761a0199..fab08f1e4d0 100644 --- a/gradle/scripts/repositories.gradle +++ b/gradle/scripts/repositories.gradle @@ -81,4 +81,8 @@ repositories { forRepository { maven { url = "https://maven.squiddev.cc" } } filter { includeGroup("cc.tweaked") } } + exclusiveContent { // Xaero's + forRepository { maven { url = "https://chocolateminecraft.com/maven/" } } + filter { includeGroupAndSubgroups("xaero") } + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java index 58aaac61653..70e8a2c9f12 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -11,6 +11,7 @@ import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.MethodsReturnNonnullByDefault; @@ -273,7 +274,13 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player machine.setOwnerUUID(sPlayer.getUUID()); } - InteractionResult machineInteractResult = machine.onUse(state, world, pos, player, hand, hit); + InteractionResult machineInteractResult; + if (itemStack.isEmpty()) { + machineInteractResult = machine.onUse(new ExtendedUseOnContext(player, hand, hit)); + } else { + machineInteractResult = machine.onUseWithItem(new ExtendedUseOnContext(player, hand, hit)); + } + if (machineInteractResult != InteractionResult.PASS) return machineInteractResult; if (itemStack.is(GTItems.PORTABLE_SCANNER.get())) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java index 965831da9f8..0c81186ff92 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java @@ -21,6 +21,7 @@ import com.gregtechceu.gtceu.common.item.behavior.CoverPlaceBehavior; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.recipe.VanillaRecipeHelper; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.GTMath; import com.gregtechceu.gtceu.utils.GTUtil; @@ -352,8 +353,8 @@ public InteractionResult use(BlockState state, Level level, BlockPos pos, Player } Set types = ToolHelper.getToolTypes(itemStack); - if ((!types.isEmpty() && ToolHelper.canUse(itemStack)) || (types.isEmpty() && player.isShiftKeyDown())) { - var result = pipeBlockEntity.onToolClick(types, itemStack, new UseOnContext(player, hand, hit)); + if ((!types.isEmpty() && ToolHelper.canUse(itemStack))) { + var result = pipeBlockEntity.onToolClick(new ExtendedUseOnContext(player, hand, hit)); if (result.getSecond() == InteractionResult.CONSUME && player instanceof ServerPlayer serverPlayer) { ToolHelper.playToolSound(result.getFirst(), serverPlayer); diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java index b4fce4cded1..2f352bf8ddc 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java @@ -2,8 +2,6 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.block.MaterialPipeBlock; -import com.gregtechceu.gtceu.api.capability.ICoverable; -import com.gregtechceu.gtceu.api.capability.IToolable; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; @@ -18,6 +16,7 @@ import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -32,13 +31,11 @@ import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -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.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import com.mojang.datafixers.util.Pair; import lombok.Getter; @@ -55,7 +52,7 @@ @MethodsReturnNonnullByDefault public abstract class PipeBlockEntity & IPipeType, NodeDataType> extends ManagedSyncBlockEntity - implements IPipeNode, IToolGridHighlight, IToolable, + implements IPipeNode, IToolGridHighlight, ICopyable { private final long offset = GTValues.RNG.nextInt(20); @@ -350,56 +347,41 @@ public ResourceTexture getPipeTexture(boolean isBlock) { return null; } - @Override - public Pair<@Nullable GTToolType, InteractionResult> onToolClick(Set toolTypes, ItemStack itemStack, - UseOnContext context) { + public Pair<@Nullable GTToolType, InteractionResult> onToolClick(ExtendedUseOnContext context) { // the side hit from the machine grid - var playerIn = context.getPlayer(); - if (playerIn == null) return Pair.of(null, InteractionResult.PASS); - - var hand = context.getHand(); - var hitResult = new BlockHitResult(context.getClickLocation(), context.getClickedFace(), - context.getClickedPos(), false); - Direction gridSide = ICoverable.determineGridSideHit(hitResult); - CoverBehavior coverBehavior = gridSide == null ? null : coverContainer.getCoverAtSide(gridSide); - if (gridSide == null) gridSide = hitResult.getDirection(); - - // Prioritize covers where they apply (Screwdriver, Soft Mallet) - if (toolTypes.isEmpty() && playerIn.isShiftKeyDown()) { - if (coverBehavior != null) { - return Pair.of(null, coverBehavior.onScrewdriverClick(playerIn, hand, hitResult)); + var player = context.getPlayer(); + var toolType = context.getToolType(); + var gridSide = context.getGridSide(); + + if (player == null) return Pair.of(null, InteractionResult.PASS); + + // Prioritize covers + var cover = getCoverContainer().getCoverAtSide(context.getClickedFace()); + if (cover != null) { + var result = cover.onToolClick(context); + if (result.getSecond() != InteractionResult.PASS) return result; + + if (toolType.contains(GTToolType.CROWBAR) && !isRemote()) { + getCoverContainer().removeCover(context.getGridSide(), player); + return Pair.of(GTToolType.CROWBAR, InteractionResult.SUCCESS); } } - if (toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (coverBehavior != null) { - return Pair.of(GTToolType.SCREWDRIVER, coverBehavior.onScrewdriverClick(playerIn, hand, hitResult)); - } - } else if (toolTypes.contains(GTToolType.SOFT_MALLET)) { - if (coverBehavior != null) { - return Pair.of(GTToolType.SOFT_MALLET, coverBehavior.onSoftMalletClick(playerIn, hand, hitResult)); - } - } else if (toolTypes.contains(getPipeTuneTool())) { - if (playerIn.isShiftKeyDown() && this.canHaveBlockedFaces()) { + + if (toolType.contains(getPipeTuneTool())) { + if (player.isShiftKeyDown() && this.canHaveBlockedFaces()) { boolean isBlocked = this.isBlocked(gridSide); this.setBlocked(gridSide, !isBlocked); } else { boolean isOpen = this.isConnected(gridSide); this.setConnection(gridSide, !isOpen, false); } - return Pair.of(getPipeTuneTool(), InteractionResult.sidedSuccess(playerIn.level().isClientSide)); - } else if (toolTypes.contains(GTToolType.CROWBAR)) { - if (coverBehavior != null) { - if (!isRemote()) { - getCoverContainer().removeCover(gridSide, playerIn); - return Pair.of(GTToolType.CROWBAR, InteractionResult.sidedSuccess(playerIn.level().isClientSide)); - } - } else { - if (!frameMaterial.isNull()) { - Block.popResource(getLevel(), this.getBlockPos(), - GTMaterialBlocks.MATERIAL_BLOCKS.get(TagPrefix.frameGt, frameMaterial).asStack()); - frameMaterial = GTMaterials.NULL; - return Pair.of(GTToolType.CROWBAR, InteractionResult.sidedSuccess(playerIn.level().isClientSide)); - } + return Pair.of(getPipeTuneTool(), InteractionResult.sidedSuccess(isRemote())); + } else if (toolType.contains(GTToolType.CROWBAR)) { + if (!frameMaterial.isNull()) { + Block.popResource(context.getLevel(), this.getBlockPos(), + GTMaterialBlocks.MATERIAL_BLOCKS.get(TagPrefix.frameGt, frameMaterial).asStack()); + frameMaterial = GTMaterials.NULL; + return Pair.of(GTToolType.CROWBAR, InteractionResult.sidedSuccess(isRemote())); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapability.java index 66a0aa5c6b3..375da974dd5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapability.java @@ -14,7 +14,6 @@ public class GTCapability { public static final Capability CAPABILITY_ENERGY_INFO_PROVIDER = CapabilityManager .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_COVERABLE = CapabilityManager.get(new CapabilityToken<>() {}); - public static final Capability CAPABILITY_TOOLABLE = CapabilityManager.get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_WORKABLE = CapabilityManager.get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_CONTROLLABLE = CapabilityManager .get(new CapabilityToken<>() {}); @@ -40,7 +39,6 @@ public static void register(RegisterCapabilitiesEvent event) { event.register(IEnergyContainer.class); event.register(IEnergyInfoProvider.class); event.register(ICoverable.class); - event.register(IToolable.class); event.register(IWorkable.class); event.register(IControllable.class); event.register(IElectricItem.class); diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java b/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java index ddd096e5fab..3fe65bbbd54 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java @@ -53,11 +53,6 @@ public static ICoverable getCoverable(Level level, BlockPos pos, @Nullable Direc return getBlockEntityCapability(GTCapability.CAPABILITY_COVERABLE, level, pos, side); } - @Nullable - public static IToolable getToolable(Level level, BlockPos pos, @Nullable Direction side) { - return getBlockEntityCapability(GTCapability.CAPABILITY_TOOLABLE, level, pos, side); - } - @Nullable public static IWorkable getWorkable(Level level, BlockPos pos, @Nullable Direction side) { return getBlockEntityCapability(GTCapability.CAPABILITY_WORKABLE, level, pos, side); diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/IToolable.java b/src/main/java/com/gregtechceu/gtceu/api/capability/IToolable.java deleted file mode 100644 index 338ea1b2164..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/IToolable.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.gregtechceu.gtceu.api.capability; - -import com.gregtechceu.gtceu.api.item.tool.GTToolType; - -import net.minecraft.world.InteractionResult; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.UseOnContext; - -import com.mojang.datafixers.util.Pair; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Set; - -public interface IToolable { - - /** - * Called when a player clicks this meta tile entity with a tool - * - * @return SUCCESS / CONSUME (will damage tool) / FAIL if something happened, so tools will get damaged and - * animations will be played - */ - Pair<@Nullable GTToolType, InteractionResult> onToolClick(@NotNull Set toolTypes, ItemStack itemStack, - UseOnContext context); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java index c6516616d1a..4639836c860 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java @@ -14,6 +14,7 @@ import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.client.renderer.cover.ICoverRenderer; import com.gregtechceu.gtceu.client.renderer.cover.IDynamicCoverRenderer; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -21,15 +22,14 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.items.IItemHandlerModifiable; +import com.mojang.datafixers.util.Pair; import lombok.Getter; import org.jetbrains.annotations.MustBeInvokedByOverriders; import org.jetbrains.annotations.Nullable; @@ -147,17 +147,28 @@ public boolean canConnectRedstone() { ////////////////////////////////////// // ******* Interaction *******// ////////////////////////////////////// - public InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, BlockHitResult hitResult) { + + public final Pair<@Nullable GTToolType, InteractionResult> onToolClick(ExtendedUseOnContext context) { + var toolType = context.getToolType(); + if (toolType.contains(GTToolType.SCREWDRIVER)) { + return Pair.of(GTToolType.SCREWDRIVER, onScrewdriverClick(context)); + } else if (toolType.contains(GTToolType.SOFT_MALLET)) { + return Pair.of(GTToolType.SOFT_MALLET, onSoftMalletClick(context)); + } + return Pair.of(null, InteractionResult.PASS); + } + + public InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { if (this instanceof IMuiCover muiCover) { - if (playerIn instanceof ServerPlayer serverPlayer) { + if (context.getPlayer() instanceof ServerPlayer serverPlayer) { com.gregtechceu.gtceu.common.mui.factory.CoverUIFactory.INSTANCE.open(serverPlayer, muiCover); } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); + return InteractionResult.sidedSuccess(coverHolder.isRemote()); } return InteractionResult.PASS; } - public InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, BlockHitResult hitResult) { + public InteractionResult onSoftMalletClick(ExtendedUseOnContext context) { return InteractionResult.PASS; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index 91c4fef90cd..ee835342048 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -44,6 +44,7 @@ import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; import com.gregtechceu.gtceu.common.machine.owner.PlayerOwner; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.data.TagCompatibilityFixer; @@ -67,20 +68,17 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.BlockGetter; 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.AABB; -import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.model.data.ModelData; -import net.minecraftforge.client.model.data.ModelProperty; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.common.util.LazyOptional; @@ -100,12 +98,9 @@ import java.util.function.Consumer; import java.util.function.Predicate; -public class MetaMachine extends ManagedSyncBlockEntity implements IGregtechBlockEntity, IToolable, IToolGridHighlight, +public class MetaMachine extends ManagedSyncBlockEntity implements IGregtechBlockEntity, IToolGridHighlight, IFancyTooltip, IPaintable, IMachineFeature, ICopyable { - public static final ModelProperty MODEL_DATA_LEVEL = new ModelProperty<>(); - public static final ModelProperty MODEL_DATA_POS = new ModelProperty<>(); - @Getter protected final SyncDataHolder syncDataHolder = new SyncDataHolder(this); @@ -282,55 +277,44 @@ private void executeTick() { * @return SUCCESS / CONSUME (will damage tool) / FAIL if something happened, so tools will get damaged and * animations will be played */ - @Override - public final Pair<@Nullable GTToolType, InteractionResult> onToolClick(Set toolType, - ItemStack itemStack, - UseOnContext context) { + public final Pair<@Nullable GTToolType, InteractionResult> onToolClick(ExtendedUseOnContext context) { // the side hit from the machine grid - var playerIn = context.getPlayer(); - if (playerIn == null) return Pair.of(null, InteractionResult.PASS); + var player = context.getPlayer(); + if (player == null) return Pair.of(null, InteractionResult.PASS); - var hand = context.getHand(); - var hitResult = new BlockHitResult(context.getClickLocation(), context.getClickedFace(), - context.getClickedPos(), false); - Direction gridSide = ICoverable.determineGridSideHit(hitResult); - CoverBehavior coverBehavior = gridSide == null ? null : coverContainer.getCoverAtSide(gridSide); - if (gridSide == null) gridSide = hitResult.getDirection(); + var toolType = context.getToolType(); Pair<@Nullable GTToolType, InteractionResult> result = null; - // Prioritize covers where they apply (Screwdriver, Soft Mallet) - if (toolType.isEmpty() && playerIn.isShiftKeyDown()) { - if (coverBehavior != null) { - result = Pair.of(null, coverBehavior.onScrewdriverClick(playerIn, hand, hitResult)); + // Prioritize covers + var cover = getCoverContainer().getCoverAtSide(context.getClickedFace()); + if (cover != null) { + result = cover.onToolClick(context); + if (result.getSecond() != InteractionResult.PASS) return result; + + if (toolType.contains(GTToolType.CROWBAR) && !isRemote()) { + getCoverContainer().removeCover(context.getGridSide(), player); + return Pair.of(GTToolType.CROWBAR, InteractionResult.SUCCESS); } - } else if (toolType.contains(GTToolType.SCREWDRIVER)) { - if (coverBehavior != null) { - result = Pair.of(GTToolType.SCREWDRIVER, coverBehavior.onScrewdriverClick(playerIn, hand, hitResult)); - } else result = Pair.of(GTToolType.SCREWDRIVER, onScrewdriverClick(playerIn, hand, gridSide, hitResult)); + } + + if (toolType.contains(GTToolType.SCREWDRIVER)) { + result = Pair.of(GTToolType.SCREWDRIVER, onScrewdriverClick(context)); } else if (toolType.contains(GTToolType.SOFT_MALLET)) { - if (coverBehavior != null) { - result = Pair.of(GTToolType.SOFT_MALLET, coverBehavior.onSoftMalletClick(playerIn, hand, hitResult)); - } else result = Pair.of(GTToolType.SOFT_MALLET, onSoftMalletClick(playerIn, hand, gridSide, hitResult)); + result = Pair.of(GTToolType.SOFT_MALLET, onSoftMalletClick(context)); } else if (toolType.contains(GTToolType.WRENCH)) { - result = Pair.of(GTToolType.WRENCH, onWrenchClick(playerIn, hand, gridSide, hitResult)); + result = Pair.of(GTToolType.WRENCH, onWrenchClick(context)); } else if (toolType.contains(GTToolType.CROWBAR)) { - if (coverBehavior != null) { - if (!isRemote()) { - getCoverContainer().removeCover(gridSide, playerIn); - } - - } - result = Pair.of(GTToolType.CROWBAR, onCrowbarClick(playerIn, hand, gridSide, hitResult)); + result = Pair.of(GTToolType.CROWBAR, onCrowbarClick(context)); } else if (toolType.contains(GTToolType.HARD_HAMMER)) { - result = Pair.of(GTToolType.HARD_HAMMER, onHardHammerClick(playerIn, hand, gridSide, hitResult)); + result = Pair.of(GTToolType.HARD_HAMMER, onHardHammerClick(context)); } if (result != null && result.getSecond() != InteractionResult.PASS) return result; for (var trait : getTraitHolder().getAllTraits()) { if (trait instanceof IInteractionTrait interactionTrait) { - var r = interactionTrait.onToolClick(toolType, playerIn, hand, gridSide, hitResult); + var r = interactionTrait.onToolClick(context); if (r.getSecond() != InteractionResult.PASS) return r; } } @@ -338,32 +322,31 @@ private void executeTick() { return result != null ? result : Pair.of(null, InteractionResult.PASS); } - protected InteractionResult onHardHammerClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { + protected InteractionResult onHardHammerClick(ExtendedUseOnContext context) { if (this instanceof IMufflableMachine mufflableMachine) { if (!isRemote()) { mufflableMachine.setMuffled(!mufflableMachine.isMuffled()); - playerIn.sendSystemMessage(Component.translatable(mufflableMachine.isMuffled() ? + context.getPlayer().sendSystemMessage(Component.translatable(mufflableMachine.isMuffled() ? "gtceu.machine.muffle.on" : "gtceu.machine.muffle.off")); } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); + return InteractionResult.sidedSuccess(isRemote()); } return InteractionResult.PASS; } - protected InteractionResult onCrowbarClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { + protected InteractionResult onCrowbarClick(ExtendedUseOnContext context) { return InteractionResult.PASS; } - protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { + protected InteractionResult onWrenchClick(ExtendedUseOnContext context) { + var player = context.getPlayer(); + var gridSide = context.getGridSide(); if (gridSide == getFrontFacing() && allowExtendedFacing()) { - setUpwardsFacing(playerIn.isShiftKeyDown() ? getUpwardsFacing().getCounterClockWise() : + setUpwardsFacing(player.isShiftKeyDown() ? getUpwardsFacing().getCounterClockWise() : getUpwardsFacing().getClockWise()); return InteractionResult.sidedSuccess(isRemote()); } - if (playerIn.isShiftKeyDown()) { + if (player.isShiftKeyDown()) { if (gridSide == getFrontFacing() || !isFacingValid(gridSide)) { return InteractionResult.FAIL; } @@ -373,34 +356,31 @@ protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, return InteractionResult.PASS; } - protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - var controllable = GTCapabilityHelper.getControllable(getLevel(), getBlockPos(), gridSide); + protected InteractionResult onSoftMalletClick(ExtendedUseOnContext context) { + var controllable = GTCapabilityHelper.getControllable(getLevel(), getBlockPos(), context.getGridSide()); if (controllable == null) return InteractionResult.PASS; if (!isRemote()) { controllable.setWorkingEnabled(!controllable.isWorkingEnabled()); - playerIn.sendSystemMessage(Component.translatable(controllable.isWorkingEnabled() ? + context.getPlayer().sendSystemMessage(Component.translatable(controllable.isWorkingEnabled() ? "behaviour.soft_hammer.enabled" : "behaviour.soft_hammer.disabled_cycle")); } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); + return InteractionResult.sidedSuccess(getLevel().isClientSide); } - protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { + protected InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { if (isRemote()) return InteractionResult.SUCCESS; return InteractionResult.PASS; } /** - * Called when a machine is right clicked. + * Called when a machine is right clicked with an item. */ - public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit) { - ItemStack itemStack = player.getItemInHand(hand); - - Set types = ToolHelper.getToolTypes(itemStack); + public InteractionResult onUseWithItem(ExtendedUseOnContext context) { + var types = context.getToolType(); + var itemStack = context.getItemInHand(); + var player = context.getPlayer(); if (!types.isEmpty() && ToolHelper.canUse(itemStack) || types.isEmpty() && player.isShiftKeyDown()) { - var result = onToolClick(types, itemStack, new UseOnContext(player, hand, hit)); + var result = onToolClick(context); if (result.getSecond() == InteractionResult.CONSUME && player instanceof ServerPlayer serverPlayer) { ToolHelper.playToolSound(result.getFirst(), serverPlayer); @@ -410,10 +390,21 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play } if (result.getSecond() != InteractionResult.PASS) return result.getSecond(); } + return InteractionResult.PASS; + } + + /** + * Called when a machine is right clicked without an item. + */ + public InteractionResult onUse(ExtendedUseOnContext context) { + if (context.getPlayer().isShiftKeyDown()) { + var cover = coverContainer.getCoverAtSide(context.getClickedFace()); + if (cover != null) cover.onScrewdriverClick(context); + } for (var trait : getTraitHolder().getAllTraits()) { if (trait instanceof IInteractionTrait interactionTrait) { - InteractionResult result = interactionTrait.onUse(state, world, pos, player, hand, hit); + InteractionResult result = interactionTrait.onUse(context); if (result != InteractionResult.PASS) return result; } } @@ -426,8 +417,7 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play * * @return true to cancel the click event, false to continue processing */ - public boolean onLeftClick(Player player, Level world, InteractionHand hand, BlockPos pos, - @Nullable Direction face) { + public boolean onLeftClick(Player player, InteractionHand hand, @Nullable Direction face) { return false; } @@ -630,7 +620,7 @@ public void setFrontFacing(Direction facing) { } @Override - public @NotNull ModelData getModelData() { + public ModelData getModelData() { ModelData.Builder data = super.getModelData().derive(); updateModelData(data); return data.build(); @@ -641,7 +631,7 @@ public Direction getUpwardsFacing() { Direction.NORTH; } - public void setUpwardsFacing(@NotNull Direction upwardsFacing) { + public void setUpwardsFacing(Direction upwardsFacing) { if (!getDefinition().isAllowExtendedFacing()) { return; } @@ -681,7 +671,6 @@ public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { public void animateTick(RandomSource random) {} - @NotNull public BlockState getBlockAppearance(BlockState state, BlockAndTintGetter level, BlockPos pos, Direction side, BlockState sourceState, BlockPos sourcePos) { var appearance = getCoverContainer().getBlockAppearance(state, level, pos, side, sourceState, sourcePos); @@ -737,7 +726,7 @@ public int getAnalogOutputSignal() { return 0; } - public boolean canConnectRedstone(@NotNull Direction side) { + public boolean canConnectRedstone(Direction side) { // For some reason, Minecraft requests the output signal from the opposite side... CoverBehavior cover = getCoverContainer().getCoverAtSide(side); if (cover == null) return false; @@ -898,7 +887,7 @@ public IFluidHandlerModifiable getFluidHandlerCap(@Nullable Direction side, bool } @Override - public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + public LazyOptional getCapability(Capability cap, @Nullable Direction side) { var result = getCapability(this, cap, side); return result.isPresent() ? result : super.getCapability(cap, side); } @@ -915,12 +904,10 @@ private static List getCapabilitiesFromTraits(List traits, return list; } - public static @NotNull LazyOptional getCapability(MetaMachine machine, @NotNull Capability cap, - @Nullable Direction side) { + public static LazyOptional getCapability(MetaMachine machine, Capability cap, + @Nullable Direction side) { if (cap == GTCapability.CAPABILITY_COVERABLE) { return GTCapability.CAPABILITY_COVERABLE.orEmpty(cap, LazyOptional.of(machine::getCoverContainer)); - } else if (cap == GTCapability.CAPABILITY_TOOLABLE) { - return GTCapability.CAPABILITY_TOOLABLE.orEmpty(cap, LazyOptional.of(() -> machine)); } else if (cap == GTCapability.CAPABILITY_WORKABLE) { if (machine instanceof IWorkable workable) { return GTCapability.CAPABILITY_WORKABLE.orEmpty(cap, LazyOptional.of(() -> workable)); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java index 0f3dd511d2b..706789c2ca8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java @@ -22,17 +22,14 @@ import com.gregtechceu.gtceu.client.renderer.MultiblockInWorldPreviewRenderer; import com.gregtechceu.gtceu.common.machine.multiblock.part.ParallelHatchPartMachine; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import lombok.Getter; import org.jetbrains.annotations.Nullable; @@ -321,16 +318,15 @@ public void setFrontFacing(Direction facing) { * Show the preview of structure. */ @Override - public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit) { - if (!isFormed() && player.isShiftKeyDown() && player.getItemInHand(hand).isEmpty()) { - if (world.isClientSide()) { - MultiblockInWorldPreviewRenderer.showPreview(pos, this, + public InteractionResult onUse(ExtendedUseOnContext context) { + if (!isFormed() && context.getPlayer().isShiftKeyDown()) { + if (isRemote()) { + MultiblockInWorldPreviewRenderer.showPreview(getBlockPos(), this, ConfigHolder.INSTANCE.client.inWorldPreviewDuration * 20); } return InteractionResult.SUCCESS; } - return super.onUse(state, world, pos, player, hand, hit); + return super.onUse(context); } public boolean allowCircuitSlots() { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java index 33e7bef0004..03d4b46473a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java @@ -31,10 +31,7 @@ import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.common.mui.GTGuis; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.utils.FormattingUtil; -import com.gregtechceu.gtceu.utils.GTTransferUtils; -import com.gregtechceu.gtceu.utils.GTUtil; -import com.gregtechceu.gtceu.utils.ISubscription; +import com.gregtechceu.gtceu.utils.*; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -46,13 +43,8 @@ import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.util.RandomSource; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -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.fluids.FluidType; import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; @@ -300,20 +292,18 @@ public void afterWorking() { ////////////////////////////////////// @Override - protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { + protected InteractionResult onSoftMalletClick(ExtendedUseOnContext context) { return InteractionResult.PASS; } @Override - public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit) { + public InteractionResult onUseWithItem(ExtendedUseOnContext context) { if (!isRemote()) { - if (FluidUtil.interactWithFluidHandler(player, hand, waterTank)) { + if (FluidUtil.interactWithFluidHandler(context.getPlayer(), context.getHand(), waterTank)) { return InteractionResult.SUCCESS; } } - return super.onUse(state, world, pos, player, hand, hit); + return super.onUseWithItem(context); } ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java index 8434c9c9fc3..5164e0df13d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java @@ -13,6 +13,7 @@ import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -20,11 +21,9 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.fluids.FluidType; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; @@ -156,14 +155,15 @@ public boolean isFacingValid(Direction facing) { } @Override - protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!playerIn.isShiftKeyDown()) { + protected InteractionResult onWrenchClick(ExtendedUseOnContext context) { + var gridSide = context.getGridSide(); + var player = context.getPlayer(); + if (!player.isShiftKeyDown()) { if (hasFrontFacing() && gridSide == getFrontFacing()) return InteractionResult.PASS; setOutputFacing(gridSide); - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); + return InteractionResult.sidedSuccess(player.level().isClientSide); } - return super.onWrenchClick(playerIn, hand, gridSide, hitResult); + return super.onWrenchClick(context); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/AutoOutputTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/AutoOutputTrait.java index b11770867d6..51b7fd892f0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/AutoOutputTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/AutoOutputTrait.java @@ -12,6 +12,7 @@ import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.item.tool.behavior.ToolModeSwitchBehavior; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; @@ -22,13 +23,11 @@ import net.minecraft.network.chat.Component; import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandler; @@ -324,23 +323,24 @@ public boolean shouldRenderGridOverlay(Player player, BlockPos pos, BlockState s } @Override - public Pair onToolClick(Set toolType, Player player, - InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { + public Pair onToolClick(ExtendedUseOnContext context) { + var toolType = context.getToolType(); if (useDefaultToolHandlers) { if (toolType.contains(GTToolType.WRENCH)) { - return Pair.of(GTToolType.WRENCH, onWrenchClick(player, hand, gridSide, hitResult)); + return Pair.of(GTToolType.WRENCH, onWrenchClick(context)); } if (toolType.contains(GTToolType.SCREWDRIVER)) { - return Pair.of(GTToolType.SCREWDRIVER, onScrewdriverClick(player, hand, gridSide, hitResult)); + return Pair.of(GTToolType.SCREWDRIVER, onScrewdriverClick(context)); } } - return IInteractionTrait.super.onToolClick(toolType, player, hand, gridSide, hitResult); + return IInteractionTrait.super.onToolClick(context); } - private InteractionResult onWrenchClick(Player player, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - var itemStack = player.getItemInHand(hand); + private InteractionResult onWrenchClick(ExtendedUseOnContext context) { + var player = context.getPlayer(); + var itemStack = context.getItemInHand(); + var gridSide = context.getGridSide(); + var tagCompound = getBehaviorsTag(itemStack); ToolModeSwitchBehavior.WrenchModeType type = ToolModeSwitchBehavior.WrenchModeType.VALUES[tagCompound .getByte("Mode")]; @@ -363,8 +363,10 @@ private InteractionResult onWrenchClick(Player player, InteractionHand hand, Dir return hasChanged ? InteractionResult.sidedSuccess(machine.isRemote()) : InteractionResult.PASS; } - private InteractionResult onScrewdriverClick(Player player, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { + private InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { + var player = context.getPlayer(); + var gridSide = context.getGridSide(); + boolean hasChanged = false; if (player.isShiftKeyDown()) { if (getItemOutputDirection() == gridSide) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IInteractionTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IInteractionTrait.java index 1f8d0e23ea7..aa1b4601f9d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IInteractionTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IInteractionTrait.java @@ -1,20 +1,12 @@ package com.gregtechceu.gtceu.api.machine.trait.feature; import com.gregtechceu.gtceu.api.item.tool.GTToolType; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import com.mojang.datafixers.util.Pair; -import java.util.Set; - import javax.annotation.ParametersAreNonnullByDefault; /** @@ -23,16 +15,13 @@ @ParametersAreNonnullByDefault public interface IInteractionTrait extends ITraitFeature { - /// Called when a player interacts with a machine without a tool. - default InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit) { + /// Called when a player interacts with a machine without an item. + default InteractionResult onUse(ExtendedUseOnContext context) { return InteractionResult.PASS; } /// Called when a player interacts with a machine with a tool. - default Pair onToolClick(Set toolType, - Player player, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { + default Pair onToolClick(ExtendedUseOnContext context) { return Pair.of(null, InteractionResult.PASS); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/FluidIngredient.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/FluidIngredient.java index af66ccedd63..a915c6cff67 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/FluidIngredient.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/FluidIngredient.java @@ -1,5 +1,8 @@ package com.gregtechceu.gtceu.api.recipe.ingredient; +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.integration.kjs.recipe.KJSHelpers; + import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; @@ -327,6 +330,10 @@ public record TagValue(TagKey tag) implements Value { @Override public Collection getFluids() { + if (GTCEu.Mods.isKubeJSLoaded()) { + var resolved = KJSHelpers.getFluidsDuringLoad(this.tag); + if (resolved != null) return resolved; + } ArrayList list = Lists.newArrayList(); for (Holder holder : BuiltInRegistries.FLUID.getTagOrEmpty(this.tag)) { list.add(holder.value()); diff --git a/src/main/java/com/gregtechceu/gtceu/common/CommonEventListener.java b/src/main/java/com/gregtechceu/gtceu/common/CommonEventListener.java index f5bfa619e5e..6d1cd99446d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/CommonEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/common/CommonEventListener.java @@ -233,8 +233,8 @@ public static void onMobEffectEvent(MobEffectEvent.Applicable event) { @SubscribeEvent public static void onLeftClickBlock(PlayerInteractEvent.LeftClickBlock event) { var machine = MetaMachine.getMachine(event.getLevel(), event.getPos()); - if (machine != null) event.setCanceled(machine.onLeftClick(event.getEntity(), event.getLevel(), event.getHand(), - event.getPos(), event.getFace())); + if (machine != null) + event.setCanceled(machine.onLeftClick(event.getEntity(), event.getHand(), event.getFace())); } @SubscribeEvent diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java index 4adfabd4de4..be3caf82361 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java @@ -79,8 +79,6 @@ public CableBlockEntity(BlockEntityType type, BlockPos pos, BlockState blockS } } else if (cap == GTCapability.CAPABILITY_COVERABLE) { return GTCapability.CAPABILITY_COVERABLE.orEmpty(cap, LazyOptional.of(this::getCoverContainer)); - } else if (cap == GTCapability.CAPABILITY_TOOLABLE) { - return GTCapability.CAPABILITY_TOOLABLE.orEmpty(cap, LazyOptional.of(() -> this)); } return super.getCapability(cap, side); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/DuctPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/DuctPipeBlockEntity.java index efcf4eb4d6e..3bcefb105e7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/DuctPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/DuctPipeBlockEntity.java @@ -56,8 +56,6 @@ public static void onBlockEntityRegister(BlockEntityType du LazyOptional.of(() -> handlers.getOrDefault(side, defaultHandler))); } else if (cap == GTCapability.CAPABILITY_COVERABLE) { return GTCapability.CAPABILITY_COVERABLE.orEmpty(cap, LazyOptional.of(this::getCoverContainer)); - } else if (cap == GTCapability.CAPABILITY_TOOLABLE) { - return GTCapability.CAPABILITY_TOOLABLE.orEmpty(cap, LazyOptional.of(() -> this)); } return super.getCapability(cap, side); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/FluidPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/FluidPipeBlockEntity.java index e35d87c2c81..ba6aa0648f6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/FluidPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/FluidPipeBlockEntity.java @@ -141,8 +141,6 @@ public LazyOptional getCapability(Capability capability, @Nullable Dir } } else if (capability == GTCapability.CAPABILITY_COVERABLE) { return GTCapability.CAPABILITY_COVERABLE.orEmpty(capability, LazyOptional.of(this::getCoverContainer)); - } else if (capability == GTCapability.CAPABILITY_TOOLABLE) { - return GTCapability.CAPABILITY_TOOLABLE.orEmpty(capability, LazyOptional.of(() -> this)); } return super.getCapability(capability, facing); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/ItemPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/ItemPipeBlockEntity.java index c3743878966..c756537a1a8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/ItemPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/ItemPipeBlockEntity.java @@ -71,8 +71,6 @@ public static void onBlockEntityRegister(BlockEntityType it } } else if (cap == GTCapability.CAPABILITY_COVERABLE) { return GTCapability.CAPABILITY_COVERABLE.orEmpty(cap, LazyOptional.of(this::getCoverContainer)); - } else if (cap == GTCapability.CAPABILITY_TOOLABLE) { - return GTCapability.CAPABILITY_TOOLABLE.orEmpty(cap, LazyOptional.of(() -> this)); } return super.getCapability(cap, side); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java index fa11317d696..d18182c1b39 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java @@ -59,8 +59,6 @@ public static void onBlockEntityRegister(BlockEntityType c LazyOptional.of(() -> handlers.getOrDefault(side, defaultHandler))); } else if (cap == GTCapability.CAPABILITY_COVERABLE) { return GTCapability.CAPABILITY_COVERABLE.orEmpty(cap, LazyOptional.of(this::getCoverContainer)); - } else if (cap == GTCapability.CAPABILITY_TOOLABLE) { - return GTCapability.CAPABILITY_TOOLABLE.orEmpty(cap, LazyOptional.of(() -> this)); } return super.getCapability(cap, side); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java index e6f2adf0243..5d3c389bcf2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java @@ -106,7 +106,7 @@ private int transferExact(IFluidHandler source, IFluidHandler destination, int p continue; int insertableAmount = destination.fill(drained.copy(), FluidAction.SIMULATE); - if (insertableAmount <= 0) + if (insertableAmount != supplyAmount) continue; drained.setAmount(insertableAmount); diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ShutterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ShutterCover.java index ee5a75ba8bc..ce81276db77 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ShutterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ShutterCover.java @@ -6,19 +6,16 @@ import com.gregtechceu.gtceu.api.cover.CoverDefinition; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.items.IItemHandlerModifiable; import lombok.Getter; import lombok.Setter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -32,13 +29,13 @@ public class ShutterCover extends CoverBehavior implements IControllable { @Setter private boolean workingEnabled = true; - public ShutterCover(@NotNull CoverDefinition definition, @NotNull ICoverable coverableView, - @NotNull Direction attachedSide) { + public ShutterCover(CoverDefinition definition, ICoverable coverableView, + Direction attachedSide) { super(definition, coverableView, attachedSide); } @Override - public InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, BlockHitResult hitResult) { + public InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { return InteractionResult.FAIL; } @@ -48,10 +45,10 @@ public boolean canPipePassThrough() { } @Override - public InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, BlockHitResult hitResult) { + public InteractionResult onSoftMalletClick(ExtendedUseOnContext context) { this.workingEnabled = !this.workingEnabled; - if (!playerIn.level().isClientSide) { - playerIn.sendSystemMessage(Component.translatable(isWorkingEnabled() ? + if (!coverHolder.isRemote()) { + context.getPlayer().sendSystemMessage(Component.translatable(isWorkingEnabled() ? "cover.shutter.message.enabled" : "cover.shutter.message.disabled")); } return InteractionResult.SUCCESS; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java index cfb13b85cd1..b92624160d3 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java @@ -7,16 +7,14 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.phys.BlockHitResult; import lombok.Getter; import lombok.Setter; @@ -72,8 +70,8 @@ private void toggleInvertedWithNotification() { } @Override - public InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, BlockHitResult hitResult) { - InteractionResult superResult = super.onScrewdriverClick(playerIn, hand, hitResult); + public InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { + InteractionResult superResult = super.onScrewdriverClick(context); if (superResult != InteractionResult.PASS) { return superResult; } @@ -83,7 +81,7 @@ public InteractionResult onScrewdriverClick(Player playerIn, InteractionHand han String translationKey = isInverted() ? "cover.detector_base.message_inverted_state" : "cover.detector_base.message_normal_state"; - playerIn.sendSystemMessage(Component.translatable(translationKey)); + context.getPlayer().sendSystemMessage(Component.translatable(translationKey)); } return InteractionResult.SUCCESS; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/AbstractEnderLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/AbstractEnderLinkCover.java index 93a42abeefe..6b18ad85412 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/AbstractEnderLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/AbstractEnderLinkCover.java @@ -38,9 +38,11 @@ import com.gregtechceu.gtceu.utils.serialization.network.IByteBufAdapter; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; import lombok.AccessLevel; import lombok.Getter; @@ -207,6 +209,22 @@ private void setDescription(String description) { if (getEntry() != null) getEntry().setDescription(description); } + @Override + public CompoundTag copyConfig(CompoundTag tag) { + tag.putString("colorStr", colorStr); + tag.putInt("permission", getPermission().ordinal()); + tag.putInt("io", getIo().ordinal()); + return super.copyConfig(tag); + } + + @Override + public void pasteConfig(ServerPlayer player, CompoundTag tag) { + setColorStr(tag.getString("colorStr")); + setPermission(Permissions.values()[tag.getInt("permission")]); + setIo(IO.values()[tag.getInt("io")]); + super.pasteConfig(player, tag); + } + private List getVirtualEntries() { return VirtualEnderRegistry.get((ServerLevel) coverHolder.getLevel()).getEntries(getOwner(), getEntryType()) .values().stream().toList(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java index 2d27688e13d..734d7073ac8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java @@ -20,12 +20,17 @@ import com.gregtechceu.gtceu.utils.GTTransferUtils; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidUtil; import lombok.Getter; import org.jetbrains.annotations.Nullable; +import java.util.List; + import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @@ -113,4 +118,25 @@ private int doTransferFluids(int platformTransferLimit) { } return 0; } + + @Override + public CompoundTag copyConfig(CompoundTag tag) { + tag.put("filter", filterHandler.getFilterItem().serializeNBT()); + return super.copyConfig(tag); + } + + @Override + public void pasteConfig(ServerPlayer player, CompoundTag tag) { + filterHandler.setFilterItem(ItemStack.of(tag.getCompound("filter"))); + super.pasteConfig(player, tag); + } + + @Override + public List getAdditionalDrops() { + var list = super.getAdditionalDrops(); + if (!filterHandler.getFilterItem().isEmpty()) { + list.add(filterHandler.getFilterItem()); + } + return list; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java index 06f98d4d559..e72c2236bdc 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java @@ -19,12 +19,16 @@ import com.gregtechceu.gtceu.utils.GTTransferUtils; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.IItemHandler; import lombok.Getter; import org.jetbrains.annotations.Nullable; +import java.util.List; + public class EnderItemLinkCover extends AbstractEnderLinkCover { @Getter @@ -101,4 +105,25 @@ protected IWidget createVirtualEntryWidget(PanelSyncManager manager, VirtualEntr public @Nullable IItemHandler getOwnItemHandler() { return coverHolder.getItemHandlerCap(attachedSide, false); } + + @Override + public CompoundTag copyConfig(CompoundTag tag) { + tag.put("filter", filterHandler.getFilterItem().serializeNBT()); + return super.copyConfig(tag); + } + + @Override + public void pasteConfig(ServerPlayer player, CompoundTag tag) { + filterHandler.setFilterItem(ItemStack.of(tag.getCompound("filter"))); + super.pasteConfig(player, tag); + } + + @Override + public List getAdditionalDrops() { + var list = super.getAdditionalDrops(); + if (!filterHandler.getFilterItem().isEmpty()) { + list.add(filterHandler.getFilterItem()); + } + return list; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/FluidVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/FluidVoidingCover.java index 2369890bb05..7a9aba67faf 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/FluidVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/FluidVoidingCover.java @@ -11,6 +11,7 @@ import com.gregtechceu.gtceu.client.mui.screen.UISettings; import com.gregtechceu.gtceu.common.cover.PumpCover; import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.GTMath; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -19,12 +20,10 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; @@ -96,13 +95,13 @@ public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManage } @Override - public InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, BlockHitResult hitResult) { + public InteractionResult onSoftMalletClick(ExtendedUseOnContext context) { if (!isRemote()) { setWorkingEnabled(!isWorkingEnabled); - playerIn.sendSystemMessage(Component.translatable(isWorkingEnabled() ? + context.getPlayer().sendSystemMessage(Component.translatable(isWorkingEnabled() ? "cover.voiding.message.enabled" : "cover.voiding.message.disabled")); } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); + return InteractionResult.sidedSuccess(isRemote()); } // TODO: Decide grid behavior diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/ItemVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/ItemVoidingCover.java index a4bcfdbacbe..a176dda87b3 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/ItemVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/ItemVoidingCover.java @@ -12,6 +12,7 @@ import com.gregtechceu.gtceu.client.mui.screen.UISettings; import com.gregtechceu.gtceu.common.cover.ConveyorCover; import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -19,12 +20,10 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.items.IItemHandler; import org.jetbrains.annotations.NotNull; @@ -101,13 +100,13 @@ protected String getUITitle() { } @Override - public InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, BlockHitResult hitResult) { + public InteractionResult onSoftMalletClick(ExtendedUseOnContext context) { if (!isRemote()) { setWorkingEnabled(!isWorkingEnabled); - playerIn.sendSystemMessage(Component.translatable(isWorkingEnabled() ? + context.getPlayer().sendSystemMessage(Component.translatable(isWorkingEnabled() ? "cover.voiding.message.enabled" : "cover.voiding.message.disabled")); } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); + return InteractionResult.sidedSuccess(isRemote()); } // TODO: Decide grid behavior diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java index f9f1ee60555..6678fa7ea87 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java @@ -221,8 +221,7 @@ private static IntSyncValue createCircuitSlotSyncValue(Consumer circu return IntCircuitBehaviour.getCircuitConfiguration(circuitGetter.get()); }, (v) -> circuitSetter.accept(v < 0 ? ItemStack.EMPTY : - IntCircuitBehaviour.stack(v, - circuitGetter.get().isEmpty() ? 1 : circuitGetter.get().getCount()))); + IntCircuitBehaviour.stack(v))); } public static ModularPanel createCircuitSlotPanel(IntSyncValue circuitSyncValue, PanelSyncManager syncManager) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/IntCircuitBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/IntCircuitBehaviour.java index a3aed30e864..c9020e43e56 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/IntCircuitBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/IntCircuitBehaviour.java @@ -1,6 +1,8 @@ package com.gregtechceu.gtceu.common.item.behavior; import com.gregtechceu.gtceu.api.item.component.IAddInformation; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; import com.gregtechceu.gtceu.api.mui.base.IItemUIHolder; import com.gregtechceu.gtceu.api.mui.factory.PlayerInventoryGuiData; import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; @@ -8,15 +10,19 @@ import com.gregtechceu.gtceu.client.mui.screen.UISettings; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; +import com.gregtechceu.gtceu.config.ConfigHolder; import com.lowdragmc.lowdraglib.gui.factory.HeldItemUIFactory; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; +import net.minecraft.world.InteractionResult; 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.entity.BlockEntity; import org.jetbrains.annotations.Nullable; @@ -27,11 +33,7 @@ public class IntCircuitBehaviour implements IAddInformation, IItemUIHolder { public static final int CIRCUIT_MAX = 32; public static ItemStack stack(int configuration) { - return stack(configuration, 1); - } - - public static ItemStack stack(int configuration, int count) { - var stack = GTItems.PROGRAMMED_CIRCUIT.asStack(count); + var stack = GTItems.PROGRAMMED_CIRCUIT.asStack(); setCircuitConfiguration(stack, configuration); return stack; } @@ -90,4 +92,21 @@ public void appendHoverText(ItemStack stack, @Nullable Level level, List data, PanelSyncManager syncManager, UISettings settings) { return GTMuiWidgets.createCircuitSlotPanel(data::setUsedItemStack, data::getUsedItemStack, syncManager); } + + @Override + public InteractionResult useOn(UseOnContext context) { + var stack = context.getItemInHand(); + int circuitSetting = getCircuitConfiguration(stack); + BlockEntity entity = context.getLevel().getBlockEntity(context.getClickedPos()); + if (entity instanceof MetaMachine machine && context.isSecondaryUseActive()) { + if (machine instanceof IHasCircuitSlot circuitMachine && + circuitMachine.getCircuitInventory().getSlots() > 0) { + setCircuitConfiguration(circuitMachine.getCircuitInventory().getStackInSlot(0), circuitSetting); + } + if (!ConfigHolder.INSTANCE.machines.ghostCircuit) + stack.shrink(1); + return InteractionResult.SUCCESS; + } + return IItemUIHolder.super.useOn(context); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/MachineConfigCopyBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/MachineConfigCopyBehaviour.java index 64776f5f582..433646b4769 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/MachineConfigCopyBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/MachineConfigCopyBehaviour.java @@ -12,7 +12,6 @@ import net.minecraft.ChatFormatting; import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; @@ -69,7 +68,7 @@ public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { var blockEntity = context.getLevel().getBlockEntity(context.getClickedPos()); var player = context.getPlayer(); - if (player == null || player instanceof LocalPlayer) return InteractionResult.PASS; + if (!(player instanceof ServerPlayer)) return InteractionResult.PASS; if (blockEntity instanceof MetaMachine mm && !MachineOwner.canOpenOwnerMachine(context.getPlayer(), mm)) return InteractionResult.FAIL; @@ -108,7 +107,7 @@ public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { if (tag == null) return InteractionResult.FAIL; List items = new ArrayList<>(); - tag.getList("itemsToPaste", CompoundTag.TAG_COMPOUND).forEach(t -> { + tag.getList(ITEMS_TO_PASTE, CompoundTag.TAG_COMPOUND).forEach(t -> { if (t instanceof CompoundTag c) items.add(ItemStack.of(c)); }); @@ -304,9 +303,9 @@ else if (tag.getBoolean(ALLOW_FLUID_IN_FROM_OUT)) if (tag.contains(CIRCUIT)) tooltip.add(Component.translatable("behaviour.setting.tooltip.circuit_config") .append(Component.literal(Integer.toString(tag.getInt(CIRCUIT))).withStyle(ChatFormatting.YELLOW))); - if (tag.contains("itemsToPaste")) { + if (tag.contains(ITEMS_TO_PASTE)) { List items = new ArrayList<>(); - tag.getList("itemsToPaste", CompoundTag.TAG_COMPOUND).forEach(t -> { + tag.getList(ITEMS_TO_PASTE, CompoundTag.TAG_COMPOUND).forEach(t -> { if (t instanceof CompoundTag c) items.add(ItemStack.of(c)); }); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ConverterMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ConverterMachine.java index 6f2cf812f04..e8a87c5ffec 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ConverterMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ConverterMachine.java @@ -8,6 +8,7 @@ import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.common.machine.trait.ConverterTrait; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -15,12 +16,10 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BooleanProperty; -import net.minecraft.world.phys.BlockHitResult; import org.jetbrains.annotations.Nullable; @@ -58,12 +57,11 @@ public int tintColor(int index) { // ****** Interaction ******// ////////////////////////////////////// @Override - public InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction facing, - BlockHitResult hitResult) { + public InteractionResult onSoftMalletClick(ExtendedUseOnContext context) { if (!isRemote()) { if (getConverterTrait().isFeToEu()) { setFeToEu(false); - playerIn.sendSystemMessage( + context.getPlayer().sendSystemMessage( Component.translatable("gtceu.machine.energy_converter.message_conversion_eu", getConverterTrait().getAmps(), getConverterTrait().getVoltage(), FeCompat.toFeLong( @@ -71,7 +69,7 @@ public InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand FeCompat.ratio(false)))); } else { setFeToEu(true); - playerIn.sendSystemMessage( + context.getPlayer().sendSystemMessage( Component.translatable("gtceu.machine.energy_converter.message_conversion_native", FeCompat.toFeLong( getConverterTrait().getVoltage() * getConverterTrait().getAmps(), diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java index 4d3f886fcd6..6d98a81d5e8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java @@ -28,16 +28,14 @@ import com.gregtechceu.gtceu.common.machine.trait.miner.MinerLogic; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.ISubscription; import net.minecraft.ChatFormatting; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.phys.BlockHitResult; import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import lombok.Getter; @@ -182,15 +180,14 @@ public boolean drainInput(boolean simulate) { // ******* Interaction *******// ////////////////////////////////////// @Override - protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { + protected InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { if (isRemote()) return InteractionResult.SUCCESS; if (!this.isActive()) { int currentRadius = getRecipeLogic().getCurrentRadius(); if (currentRadius == 1) getRecipeLogic().setCurrentRadius(getRecipeLogic().getMaximumRadius()); - else if (playerIn.isShiftKeyDown()) + else if (context.getPlayer().isShiftKeyDown()) getRecipeLogic().setCurrentRadius(Math.max(1, Math.round(currentRadius / 2.0f))); else getRecipeLogic().setCurrentRadius(Math.max(1, currentRadius - 1)); @@ -198,10 +195,10 @@ else if (playerIn.isShiftKeyDown()) getRecipeLogic().resetArea(true); int workingArea = IMiner.getWorkingArea(getRecipeLogic().getCurrentRadius()); - playerIn.sendSystemMessage( + context.getPlayer().sendSystemMessage( Component.translatable("gtceu.universal.tooltip.working_area", workingArea, workingArea)); } else { - playerIn.sendSystemMessage(Component.translatable("gtceu.multiblock.large_miner.errorradius")); + context.getPlayer().sendSystemMessage(Component.translatable("gtceu.multiblock.large_miner.errorradius")); } return InteractionResult.SUCCESS; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/TransformerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/TransformerMachine.java index ee341176a5b..ef710fb96ad 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/TransformerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/TransformerMachine.java @@ -9,15 +9,12 @@ import com.gregtechceu.gtceu.api.sync_system.annotations.ClientFieldChangeListener; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.state.properties.BooleanProperty; -import net.minecraft.world.phys.BlockHitResult; import lombok.Getter; import lombok.Setter; @@ -115,11 +112,10 @@ public void setTransformUp(boolean isTransformUp) { } @Override - protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { + protected InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { if (!isRemote()) { setTransformUp(!isTransformUp()); - playerIn.sendSystemMessage(Component.translatable( + context.getPlayer().sendSystemMessage(Component.translatable( isTransformUp() ? "gtceu.machine.transformer.message_transform_up" : "gtceu.machine.transformer.message_transform_down", energyContainer.getInputVoltage(), energyContainer.getInputAmperage(), diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java index 4828888116c..108f2419497 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java @@ -16,6 +16,7 @@ import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -25,7 +26,6 @@ import net.minecraft.core.Direction; 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.entity.player.Player; import net.minecraft.world.level.block.entity.BlockEntity; @@ -33,7 +33,6 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BooleanProperty; -import net.minecraft.world.phys.BlockHitResult; import it.unimi.dsi.fastutil.objects.Object2BooleanFunction; import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; @@ -232,13 +231,12 @@ public void setWorkingEnabled(boolean workingEnabled) { } @Override - protected @NotNull InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { + protected InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { if (!isRemote()) { isRandomTickMode = !isRandomTickMode; setRenderState(getRenderState().setValue(GTMachineModelProperties.IS_RANDOM_TICK_MODE, isRandomTickMode)); syncDataHolder.markClientSyncFieldDirty("isRandomTickMode"); - playerIn.sendSystemMessage(Component.translatable(isRandomTickMode ? + context.getPlayer().sendSystemMessage(Component.translatable(isRandomTickMode ? "gtceu.machine.world_accelerator.mode_entity" : "gtceu.machine.world_accelerator.mode_tile")); scheduleRenderUpdate(); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java index 1aecbed33cf..85f043b3f45 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java @@ -81,7 +81,6 @@ import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; import lombok.Getter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -125,7 +124,6 @@ public CleanroomMachine(BlockEntityCreationInfo info) { } @Override - @NotNull public CleanroomLogic getRecipeLogic() { return (CleanroomLogic) super.getRecipeLogic(); } @@ -287,8 +285,8 @@ public void updateStructureDimensions() { * @param direction the direction to move * @return if a block is a valid wall block at pos moved in direction */ - public boolean isBlockEdge(@NotNull Level world, @NotNull BlockPos.MutableBlockPos pos, - @NotNull Direction direction) { + public boolean isBlockEdge(Level world, BlockPos.MutableBlockPos pos, + Direction direction) { var state = world.getBlockState(pos.move(direction)); return state == getCasingState() || state == getGlassState(); } @@ -299,13 +297,12 @@ public boolean isBlockEdge(@NotNull Level world, @NotNull BlockPos.MutableBlockP * @param direction the direction to move * @return if a block is a valid floor block at pos moved in direction */ - public boolean isBlockFloor(@NotNull Level world, @NotNull BlockPos.MutableBlockPos pos, - @NotNull Direction direction) { + public boolean isBlockFloor(Level world, BlockPos.MutableBlockPos pos, + Direction direction) { var state = world.getBlockState(pos.move(direction)); return state == getCasingState() || state == getGlassState() || state.is(CustomTags.CLEANROOM_FLOORS); } - @NotNull @Override public BlockPattern getPattern() { // return the default structure, even if there is no valid size found @@ -410,17 +407,14 @@ public BlockPattern getPattern() { } // protected to allow easy addition of addon "cleanrooms" - @NotNull protected BlockState getCasingState() { return GTBlocks.PLASTCRETE.getDefaultState(); } - @NotNull protected BlockState getGlassState() { return GTBlocks.CLEANROOM_GLASS.getDefaultState(); } - @NotNull protected static TraceabilityPredicate doorPredicate() { return Predicates.custom(blockWorldState -> blockWorldState.getBlockState().is(CustomTags.CLEANROOM_DOORS), () -> new BlockInfo[] { new BlockInfo(Blocks.IRON_DOOR.defaultBlockState()), new BlockInfo( @@ -431,7 +425,6 @@ private TraceabilityPredicate getValidFloorBlocks() { return Predicates.blockTag(CustomTags.CLEANROOM_FLOORS); } - @NotNull protected TraceabilityPredicate innerPredicate() { return new TraceabilityPredicate(blockWorldState -> { Set receivers = blockWorldState.getMatchContext().getOrCreate("cleanroomReceiver", @@ -616,7 +609,7 @@ public Widget getMainTextPanel(PanelSyncManager syncManager, int width, int h listWidget.child(IKey.lang(Component.translatable("gtceu.multiblock.dimensions.0")) .asWidget() .setEnabledIf((widget) -> isFormed.getBoolValue())); - listWidget.child(IKey.dynamic(() -> distComponent.getValue()) + listWidget.child(IKey.dynamic(distComponent::getValue) .asWidget() .setEnabledIf((widget) -> isFormed.getBoolValue())); @@ -635,7 +628,6 @@ public void adjustCleanAmount(int amount) { cleanroomProviderTrait.setActive(this.cleanAmount >= CLEAN_AMOUNT_THRESHOLD); } - @NotNull @Override public List getDataInfo(PortableScannerBehavior.DisplayMode mode) { if (mode == PortableScannerBehavior.DisplayMode.SHOW_ALL || diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/LargeMinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/LargeMinerMachine.java index 68ec81f4f3d..21d322dc03c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/LargeMinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/LargeMinerMachine.java @@ -18,24 +18,21 @@ import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.common.item.behavior.PortableScannerBehavior; import com.gregtechceu.gtceu.common.machine.trait.miner.LargeMinerLogic; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.Block; -import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; import lombok.Getter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -232,8 +229,7 @@ public boolean drainInput(boolean simulate) { // ******* Interaction *******// ////////////////////////////////////// @Override - public InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction facing, - BlockHitResult hitResult) { + public InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { if (isRemote() || !this.isFormed()) return InteractionResult.SUCCESS; @@ -246,8 +242,9 @@ public InteractionResult onScrewdriverClick(Player playerIn, InteractionHand han getRecipeLogic().setCurrentRadius(currentRadius - CHUNK_LENGTH); } int workingAreaChunks = getRecipeLogic().getCurrentRadius() * 2 / CHUNK_LENGTH; - playerIn.sendSystemMessage(Component.translatable("gtceu.universal.tooltip.working_area_chunks", - workingAreaChunks, workingAreaChunks)); + context.getPlayer() + .sendSystemMessage(Component.translatable("gtceu.universal.tooltip.working_area_chunks", + workingAreaChunks, workingAreaChunks)); } else { if (currentRadius - CHUNK_LENGTH / 2 <= 0) { getRecipeLogic().setCurrentRadius(getRecipeLogic().getMaximumRadius()); @@ -255,17 +252,16 @@ public InteractionResult onScrewdriverClick(Player playerIn, InteractionHand han getRecipeLogic().setCurrentRadius(currentRadius - CHUNK_LENGTH / 2); } int workingArea = IMiner.getWorkingArea(getRecipeLogic().getCurrentRadius()); - playerIn.sendSystemMessage( + context.getPlayer().sendSystemMessage( Component.translatable("gtceu.universal.tooltip.working_area", workingArea, workingArea)); } getRecipeLogic().resetArea(true); } else { - playerIn.sendSystemMessage(Component.translatable("gtceu.multiblock.large_miner.errorradius")); + context.getPlayer().sendSystemMessage(Component.translatable("gtceu.multiblock.large_miner.errorradius")); } return InteractionResult.SUCCESS; } - @NotNull @Override public List getDataInfo(PortableScannerBehavior.DisplayMode mode) { if (mode == PortableScannerBehavior.DisplayMode.SHOW_ALL || diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/MultiblockTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/MultiblockTankMachine.java index 2ccc4ce4edd..3656e176e66 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/MultiblockTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/MultiblockTankMachine.java @@ -23,18 +23,13 @@ import com.gregtechceu.gtceu.client.mui.screen.UISettings; import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.FormattingUtil; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import lombok.Getter; import org.jetbrains.annotations.NotNull; @@ -59,9 +54,8 @@ public MultiblockTankMachine(BlockEntityCreationInfo info, int capacity, @Nullab } @Override - public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit) { - var superResult = super.onUse(state, world, pos, player, hand, hit); + public InteractionResult onUse(ExtendedUseOnContext context) { + var superResult = super.onUse(context); if (superResult != InteractionResult.PASS) return superResult; if (!isFormed()) return InteractionResult.FAIL; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DiodePartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DiodePartMachine.java index 96a0d8dc021..20f559bf544 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DiodePartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DiodePartMachine.java @@ -9,16 +9,14 @@ import com.gregtechceu.gtceu.api.sync_system.annotations.ClientFieldChangeListener; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.util.StringRepresentable; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.state.properties.EnumProperty; -import net.minecraft.world.phys.BlockHitResult; import lombok.Getter; @@ -129,12 +127,11 @@ public boolean isFacingValid(Direction facing) { } @Override - protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { + protected InteractionResult onSoftMalletClick(ExtendedUseOnContext context) { cycleAmpMode(); if (!isRemote()) { this.scheduleRenderUpdate(); - playerIn.sendSystemMessage(Component.translatable("gtceu.machine.diode.message", amps)); + context.getPlayer().sendSystemMessage(Component.translatable("gtceu.machine.diode.message", amps)); return InteractionResult.SUCCESS; } return InteractionResult.CONSUME; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java index 23324c45d19..28a9faf5678 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java @@ -36,6 +36,7 @@ import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.common.mui.GTGuis; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; @@ -46,13 +47,10 @@ import net.minecraft.network.chat.Component; import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidType; @@ -231,14 +229,13 @@ public void setWorkingEnabled(boolean workingEnabled) { } @Override - protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - InteractionResult superResult = super.onScrewdriverClick(playerIn, hand, gridSide, hitResult); + protected InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { + InteractionResult superResult = super.onScrewdriverClick(context); if (superResult != InteractionResult.PASS) return superResult; if (io == IO.BOTH) return InteractionResult.PASS; - if (playerIn.isShiftKeyDown()) { + if (context.getPlayer().isShiftKeyDown()) { if (swapIO()) { - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); + return InteractionResult.sidedSuccess(getLevel().isClientSide); } } return InteractionResult.PASS; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java index ba0efe5e22c..c850b350644 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java @@ -22,7 +22,7 @@ import com.gregtechceu.gtceu.api.mui.value.sync.SyncHandlers; import com.gregtechceu.gtceu.api.mui.widgets.SlotGroupWidget; import com.gregtechceu.gtceu.api.mui.widgets.ToggleButton; -import com.gregtechceu.gtceu.api.mui.widgets.layout.Column; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; import com.gregtechceu.gtceu.api.mui.widgets.layout.Grid; import com.gregtechceu.gtceu.api.mui.widgets.slot.ItemSlot; import com.gregtechceu.gtceu.api.mui.widgets.slot.SlotGroup; @@ -36,6 +36,7 @@ import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.common.mui.GTGuis; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; @@ -47,13 +48,10 @@ import net.minecraft.network.chat.Style; import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import lombok.AccessLevel; import lombok.Getter; @@ -262,14 +260,13 @@ public void setWorkingEnabled(boolean workingEnabled) { } @Override - protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - InteractionResult superResult = super.onScrewdriverClick(playerIn, hand, gridSide, hitResult); + protected InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { + InteractionResult superResult = super.onScrewdriverClick(context); if (superResult != InteractionResult.PASS) return superResult; if (io == IO.BOTH) return InteractionResult.PASS; - if (playerIn.isShiftKeyDown()) { + if (context.getPlayer().isShiftKeyDown()) { if (swapIO()) { - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); + return InteractionResult.sidedSuccess(isRemote()); } } return InteractionResult.PASS; @@ -342,7 +339,7 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet backgroundTexture = GTGuiTextures.BACKGROUND; } - panel.child(new Column() + panel.child(Flow.col() .coverChildren() .rightRel(1.0f) .reverseLayout(true) @@ -373,43 +370,4 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet return panel; } - - /* - * public void attachConfigurators(ConfiguratorPanel configuratorPanel) { - * if (this.io == IO.IN) { - * IDistinctPart.super.attachConfigurators(configuratorPanel); - * if (hasCircuitSlot && isCircuitSlotEnabled()) { - * configuratorPanel.attachConfigurators(new CircuitFancyConfigurator(circuitInventory.storage)); - * } - * } else { - * super.attachConfigurators(configuratorPanel); - * } - * } - * - * @Override - * public Widget createUIWidget() { - * int rowSize = (int) Math.sqrt(getInventorySize()); - * int colSize = rowSize; - * if (getInventorySize() == 8) { - * rowSize = 4; - * colSize = 2; - * } - * var group = new WidgetGroup(0, 0, 18 * rowSize + 16, 18 * colSize + 16); - * var container = new WidgetGroup(4, 4, 18 * rowSize + 8, 18 * colSize + 8); - * int index = 0; - * for (int y = 0; y < colSize; y++) { - * for (int x = 0; x < rowSize; x++) { - * container.addWidget( - * new SlotWidget(getInventory().storage, index++, 4 + x * 18, 4 + y * 18, true, io.support(IO.IN)) - * .setBackgroundTexture(GuiTextures.SLOT) - * .setIngredientIO(this.io == IO.IN ? IngredientIO.INPUT : IngredientIO.OUTPUT)); - * } - * } - * - * container.setBackground(GuiTextures.BACKGROUND_INVERSE); - * group.addWidget(container); - * - * return group; - * } - */ } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java index ca374963189..990b3a2d241 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java @@ -33,13 +33,13 @@ import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.widget.*; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.HoverEvent; import net.minecraft.network.chat.Style; @@ -48,9 +48,6 @@ import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.wrapper.InvWrapper; @@ -340,17 +337,17 @@ public float getTimeMultiplier() { ////////////////////////////////////// // ******* INTERACTION *******// ////////////////////////////////////// + @Override - public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit) { + public InteractionResult onUseWithItem(ExtendedUseOnContext context) { if (hasMaintenanceProblems()) { - if (consumeDuctTape(player, hand)) { + if (consumeDuctTape(context.getPlayer(), context.getHand())) { fixAllMaintenanceProblems(); setTaped(true); return InteractionResult.SUCCESS; } } - return super.onUse(state, world, pos, player, hand, hit); + return super.onUseWithItem(context); } ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java index 0b320d91c3d..d0fadbcd3a2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java @@ -30,18 +30,13 @@ import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; import com.gregtechceu.gtceu.common.item.behavior.TurbineRotorBehaviour; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.ISubscription; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import lombok.Getter; import org.jetbrains.annotations.NotNull; @@ -133,7 +128,7 @@ static int getBaseEfficiency() { // ****** Rotor Holder ******// ////////////////////////////////////// - public @NotNull Material getRotorMaterial() { + public Material getRotorMaterial() { // handles clients trying to get the material before server data sync // noinspection ConstantValue if (rotorMaterial == null) { @@ -228,14 +223,13 @@ public void setRotorStack(ItemStack rotorStack) { } @Override - public InteractionResult onUse(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit) { - var superResult = super.onUse(state, level, pos, player, hand, hit); + public InteractionResult onUse(ExtendedUseOnContext context) { + var superResult = super.onUse(context); if (superResult != InteractionResult.PASS) return superResult; - if (!isRemote() && getRotorSpeed() > 0 && !player.isCreative()) { + if (!isRemote() && getRotorSpeed() > 0 && !context.getPlayer().isCreative()) { TurbineRotorBehaviour behaviour = TurbineRotorBehaviour.getBehaviour(getRotorStack()); if (behaviour != null) { - player.hurt(GTDamageTypes.TURBINE.source(level), behaviour.getDamage(getRotorStack())); + context.getPlayer().hurt(GTDamageTypes.TURBINE.source(level), behaviour.getDamage(getRotorStack())); } return InteractionResult.FAIL; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java index abc8a92bb14..0a14d74bfc4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java @@ -3,15 +3,10 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import lombok.Getter; import lombok.Setter; @@ -48,12 +43,12 @@ public AdvancedMonitorPartMachine(BlockEntityCreationInfo info) { } @Override - public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit) { - if (hit.getDirection() != getFrontFacing()) return super.onUse(state, world, pos, player, hand, hit); + public InteractionResult onUse(ExtendedUseOnContext context) { + if (context.getClickedFace() != getFrontFacing()) return super.onUse(context); + var hitLocation = context.getHitResult().getLocation(); clicked = true; clickedThisFrame = true; - Vector2d clickPos = getMousePos(hit); + Vector2d clickPos = getMousePos(context.getHitResult()); clickPosX = clickPos.x(); clickPosY = clickPos.y(); return InteractionResult.SUCCESS; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CharcoalPileIgniterMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CharcoalPileIgniterMachine.java index b7a05fa2d02..43e6b0580a0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CharcoalPileIgniterMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CharcoalPileIgniterMachine.java @@ -15,6 +15,7 @@ import com.gregtechceu.gtceu.common.data.GTBlocks; import com.gregtechceu.gtceu.common.item.behavior.LighterBehavior; import com.gregtechceu.gtceu.data.recipe.CustomTags; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.lowdragmc.lowdraglib.utils.BlockInfo; @@ -27,22 +28,17 @@ import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.tags.BlockTags; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import it.unimi.dsi.fastutil.longs.Long2BooleanMap; import it.unimi.dsi.fastutil.longs.Long2BooleanOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; -import org.jetbrains.annotations.NotNull; import java.util.*; @@ -90,7 +86,7 @@ public void onStructureFormed() { } @Override - public @NotNull CharcoalRecipeLogic getRecipeLogic() { + public CharcoalRecipeLogic getRecipeLogic() { return (CharcoalRecipeLogic) super.getRecipeLogic(); } @@ -312,12 +308,11 @@ private void convertLogBlocks() { } @Override - public InteractionResult onUse(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit) { - if (!isFormed() || hasAir) { - return super.onUse(state, level, pos, player, hand, hit); - } - ItemStack stack = player.getItemInHand(hand); + public InteractionResult onUse(ExtendedUseOnContext context) { + var stack = context.getItemInHand(); + var player = context.getPlayer(); + var hand = context.getHand(); + if (!stack.is(CustomTags.TOOLS_IGNITER)) { return InteractionResult.PASS; } @@ -344,13 +339,13 @@ public InteractionResult onUse(BlockState state, Level level, BlockPos pos, Play if (shouldActivate) { getRecipeLogic().setStatus(RecipeLogic.Status.WORKING); - level.playSound(null, pos, + level.playSound(null, getBlockPos(), stack.is(Items.FIRE_CHARGE) ? SoundEvents.FIRECHARGE_USE : SoundEvents.FLINTANDSTEEL_USE, SoundSource.BLOCKS, 1.0f, 1.0f); return InteractionResult.CONSUME; } } - return super.onUse(state, level, pos, player, hand, hit); + return super.onUse(context); } public static class CharcoalRecipeLogic extends RecipeLogic { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CokeOvenMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CokeOvenMachine.java index 80827654aea..6f486238d8a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CokeOvenMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CokeOvenMachine.java @@ -19,6 +19,7 @@ import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -27,12 +28,7 @@ import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.util.RandomSource; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.fluids.FluidUtil; import javax.annotation.ParametersAreNonnullByDefault; @@ -121,17 +117,16 @@ public void animateTick(RandomSource random) { } @Override - public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit) { + public InteractionResult onUseWithItem(ExtendedUseOnContext context) { if (!isRemote()) { - if (super.onUse(state, world, pos, player, hand, hit) == InteractionResult.SUCCESS) { + if (super.onUseWithItem(context) == InteractionResult.SUCCESS) { return InteractionResult.SUCCESS; } - if (FluidUtil.interactWithFluidHandler(player, hand, exportFluids)) { + if (FluidUtil.interactWithFluidHandler(context.getPlayer(), context.getHand(), exportFluids)) { return InteractionResult.SUCCESS; } return InteractionResult.PASS; } - return super.onUse(state, world, pos, player, hand, hit); + return super.onUseWithItem(context); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/package-info.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/package-info.java new file mode 100644 index 00000000000..4ea37be3296 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.common.machine.multiblock.primitive; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamLiquidBoilerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamLiquidBoilerMachine.java index e954c354858..069f6fbb5b7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamLiquidBoilerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamLiquidBoilerMachine.java @@ -19,18 +19,13 @@ import com.gregtechceu.gtceu.client.mui.screen.UISettings; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.util.RandomSource; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.fluids.FluidType; import net.minecraftforge.fluids.FluidUtil; @@ -133,13 +128,12 @@ protected void randomDisplayTick(RandomSource random, float x, float y, float z) } @Override - public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit) { + public InteractionResult onUseWithItem(ExtendedUseOnContext context) { if (!isRemote()) { - if (FluidUtil.interactWithFluidHandler(player, hand, fuelTank)) { + if (FluidUtil.interactWithFluidHandler(context.getPlayer(), context.getHand(), fuelTank)) { return InteractionResult.SUCCESS; } } - return super.onUse(state, world, pos, player, hand, hit); + return super.onUseWithItem(context); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java index 18ca26f21f4..b1e9d12d6c7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java @@ -21,19 +21,14 @@ import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.common.mui.GTGuis; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BooleanProperty; -import net.minecraft.world.phys.BlockHitResult; import lombok.Getter; import org.jetbrains.annotations.Nullable; @@ -94,21 +89,21 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet } @Override - public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit) { - ItemStack stack = player.getItemInHand(hand); - if (player.isCrouching() && !isTaped) { - if (stack.is(GTItems.DUCT_TAPE.asItem()) || stack.is(GTItems.BASIC_TAPE.asItem())) { + public InteractionResult onUseWithItem(ExtendedUseOnContext context) { + var stack = context.getItemInHand(); + var player = context.getPlayer(); + if (stack.is(GTItems.DUCT_TAPE.asItem()) || stack.is(GTItems.BASIC_TAPE.asItem())) { + if (player != null && player.isCrouching() && !isTaped) { if (!player.isCreative()) { stack.shrink(1); } isTaped = true; setRenderState(getRenderState().setValue(GTMachineModelProperties.IS_TAPED, isTaped)); syncDataHolder.markClientSyncFieldDirty("isTaped"); - return InteractionResult.sidedSuccess(world.isClientSide); + return InteractionResult.sidedSuccess(context.getLevel().isClientSide); } } - return super.onUse(state, world, pos, player, hand, hit); + return super.onUseWithItem(context); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java index 7242f1f966b..ed44ef0533e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java @@ -4,20 +4,15 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.widget.*; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.items.ItemHandlerHelper; import lombok.Getter; @@ -80,10 +75,11 @@ public void loadFromItem(CompoundTag tag) { } @Override - public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit) { - var heldItem = player.getItemInHand(hand); - if (hit.getDirection() == getFrontFacing() && !isRemote()) { + public InteractionResult onUseWithItem(ExtendedUseOnContext context) { + var heldItem = context.getItemInHand(); + var player = context.getPlayer(); + + if (context.getClickedFace() == getFrontFacing() && !isRemote()) { // Clear item if empty hand + shift-rclick if (heldItem.isEmpty() && player.isCrouching() && !stored.isEmpty()) { return updateStored(ItemStack.EMPTY); @@ -91,13 +87,13 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play // If held item can stack with stored item, delete held item if (!heldItem.isEmpty() && ItemHandlerHelper.canItemStacksStack(stored, heldItem)) { - player.setItemInHand(hand, ItemStack.EMPTY); + player.setItemInHand(context.getHand(), ItemStack.EMPTY); return InteractionResult.SUCCESS; } else if (!heldItem.isEmpty()) { // If held item is different than stored item, update stored item return updateStored(heldItem); } } - return super.onUse(state, world, pos, player, hand, hit); + return super.onUseWithItem(context); } /* diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java index 7e485409624..47235f00e11 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java @@ -10,17 +10,14 @@ import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; import com.gregtechceu.gtceu.client.mui.screen.UISettings; import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; + +import com.lowdragmc.lowdraglib.gui.widget.*; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.items.ItemHandlerHelper; @@ -79,30 +76,22 @@ private void setmBPerCycle(String value) { } @Override - public void saveToItem(@NotNull CompoundTag tag) { + public void saveToItem(CompoundTag tag) { tag.putInt("mBPerCycle", mBPerCycle); tag.putInt("ticksPerCycle", ticksPerCycle); } @Override - public void loadFromItem(@NotNull CompoundTag tag) { + public void loadFromItem(CompoundTag tag) { mBPerCycle = tag.getInt("mBPerCycle"); ticksPerCycle = tag.getInt("ticksPerCycle"); } @Override - public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit) { - var heldItem = player.getItemInHand(hand); - if (hit.getDirection() == getFrontFacing() && !isRemote()) { - // Clear fluid if empty + shift-rclick - if (heldItem.isEmpty()) { - if (player.isCrouching() && !stored.isEmpty()) { - return updateStored(FluidStack.EMPTY); - } - return InteractionResult.PASS; - } - + public InteractionResult onUseWithItem(ExtendedUseOnContext context) { + var heldItem = context.getItemInHand(); + var player = context.getPlayer(); + if (context.getClickedFace() == getFrontFacing() && !isRemote()) { // If no fluid set and held-item has fluid, set fluid if (stored.isEmpty()) { return FluidUtil.getFluidContained(heldItem) @@ -121,7 +110,7 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play } if (!result.isEmpty()) { - player.setItemInHand(hand, result); + player.setItemInHand(context.getHand(), result); return InteractionResult.SUCCESS; } else { return FluidUtil.getFluidContained(heldItem) @@ -129,7 +118,19 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play .orElse(InteractionResult.PASS); } } - return super.onUse(state, world, pos, player, hand, hit); + return super.onUseWithItem(context); + } + + @Override + public InteractionResult onUse(ExtendedUseOnContext context) { + if (context.getClickedFace() == getFrontFacing() && !isRemote()) { + // Clear fluid if empty + shift-rclick + if (context.getPlayer().isCrouching() && !stored.isEmpty()) { + return updateStored(FluidStack.EMPTY); + } + return InteractionResult.PASS; + } + return super.onUse(context); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java index 83398fdd0be..1f604cc8e0f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java @@ -10,17 +10,12 @@ import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.ISubscription; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidUtil; @@ -124,19 +119,17 @@ public boolean savePickClone() { } @Override - public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit) { + public InteractionResult onUseWithItem(ExtendedUseOnContext context) { if (!isRemote()) { - if (FluidUtil.interactWithFluidHandler(player, hand, cache)) { + if (FluidUtil.interactWithFluidHandler(context.getPlayer(), context.getHand(), cache)) { return InteractionResult.SUCCESS; } } - return super.onUse(state, world, pos, player, hand, hit); + return super.onUseWithItem(context); } @Override - protected InteractionResult onScrewdriverClick(Player player, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { + protected InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { autoOutput.setAllowAutoOutputItems(!autoOutput.isAutoOutputItems()); return InteractionResult.SUCCESS; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index bd4ddd559b7..9c1109d9189 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java @@ -33,10 +33,7 @@ import com.gregtechceu.gtceu.client.mui.screen.UISettings; import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; -import com.gregtechceu.gtceu.utils.FormattingUtil; -import com.gregtechceu.gtceu.utils.GTMath; -import com.gregtechceu.gtceu.utils.GTTransferUtils; -import com.gregtechceu.gtceu.utils.GTUtil; +import com.gregtechceu.gtceu.utils.*; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.*; @@ -49,11 +46,9 @@ import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -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.AABB; -import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemHandlerHelper; @@ -186,16 +181,18 @@ public void setWorkingEnabled(boolean isWorkingAllowed) { ////////////////////////////////////// @Override - public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit) { - if (hit.getDirection() == getFrontFacing() && !isRemote()) { - // Check to see if the hit is within the glass frame of the chest + public InteractionResult onUseWithItem(ExtendedUseOnContext context) { + if (context.getClickedFace() == getFrontFacing() && !isRemote()) { + var hit = context.getHitResult(); + var aabb = new AABB(hit.getBlockPos()).deflate(0.12); var hitVector = hit.getLocation().relative(getFrontFacing(), -0.5); if (!aabb.contains(hitVector)) return InteractionResult.PASS; - var held = player.getMainHandItem(); - if (!held.isEmpty() && cache.canInsert(held)) { // push + var held = context.getItemInHand(); + var player = context.getPlayer(); + + if (cache.canInsert(held)) { // push var remaining = cache.insertItem(0, held, false); player.setItemInHand(InteractionHand.MAIN_HAND, remaining); return InteractionResult.SUCCESS; @@ -208,8 +205,10 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play } INTERACTION_LOGGER.put(player.getUUID(), System.currentTimeMillis()); return InteractionResult.SUCCESS; + } - return super.onUse(state, world, pos, player, hand, hit); + + return super.onUseWithItem(context); } private static boolean isDoubleHit(UUID uuid) { @@ -217,7 +216,7 @@ private static boolean isDoubleHit(UUID uuid) { } @Override - public boolean onLeftClick(Player player, Level world, InteractionHand hand, BlockPos pos, + public boolean onLeftClick(Player player, InteractionHand hand, @Nullable Direction direction) { if (direction == getFrontFacing() && !isRemote()) { if (GTToolType.WRENCH.matchTags.stream().anyMatch(player.getItemInHand(hand)::is)) return false; @@ -225,12 +224,12 @@ public boolean onLeftClick(Player player, Level world, InteractionHand hand, Blo var drained = cache.extractItem(0, player.isShiftKeyDown() ? stored.getMaxStackSize() : 1, false); if (!drained.isEmpty()) { if (!player.addItem(drained)) { - Block.popResourceFromFace(world, getBlockPos(), getFrontFacing(), drained); + Block.popResourceFromFace(getLevel(), getBlockPos(), getFrontFacing(), drained); } } } } - return super.onLeftClick(player, world, hand, pos, direction); + return super.onLeftClick(player, hand, direction); } public boolean isLocked() { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java index 2535d215dfa..86f6e258f0d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java @@ -32,20 +32,15 @@ import com.gregtechceu.gtceu.client.mui.screen.UISettings; import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTMath; import com.gregtechceu.gtceu.utils.GTTransferUtils; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fluids.IFluidTank; @@ -163,14 +158,13 @@ public void setWorkingEnabled(boolean isWorkingAllowed) { ////////////////////////////////////// @Override - public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit) { - if (hit.getDirection() == getFrontFacing() && !isRemote()) { - if (FluidUtil.interactWithFluidHandler(player, hand, cache)) { + public InteractionResult onUseWithItem(ExtendedUseOnContext context) { + if (context.getClickedFace() == getFrontFacing() && !isRemote()) { + if (FluidUtil.interactWithFluidHandler(context.getPlayer(), context.getHand(), cache)) { return InteractionResult.SUCCESS; } } - return super.onUse(state, world, pos, player, hand, hit); + return super.onUseWithItem(context); } public boolean isLocked() { diff --git a/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java b/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java index 75ace433779..26da2a0bc53 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java +++ b/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java @@ -177,6 +177,11 @@ public static void generateGTDynamicTags(Map new ArrayList<>()).addAll(entries); + } + if (entry.tagPrefix() == TagPrefix.frameGt) { tagMap.computeIfAbsent(CustomTags.SLOW_WALKABLE_BLOCKS.location(), path -> new ArrayList<>()) .addAll(entries); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/xaerominimap/MinimapFBORendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/xaerominimap/MinimapFBORendererMixin.java index 0fdd7ce067e..2ca0c9b1d9f 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/xaerominimap/MinimapFBORendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/xaerominimap/MinimapFBORendererMixin.java @@ -11,14 +11,14 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import xaero.common.IXaeroMinimap; +import xaero.common.HudMod; import xaero.common.minimap.MinimapProcessor; import xaero.common.minimap.render.MinimapFBORenderer; import xaero.common.minimap.render.MinimapRenderer; import xaero.hud.minimap.Minimap; import xaero.hud.minimap.compass.render.CompassRenderer; import xaero.hud.minimap.element.render.map.MinimapElementMapRendererHandler; -import xaero.hud.minimap.waypoint.render.WaypointsGuiRenderer; +import xaero.hud.minimap.waypoint.render.WaypointMapRenderer; // TODO move to xaeros api once that exists @Mixin(value = MinimapFBORenderer.class, remap = false) @@ -30,9 +30,9 @@ public abstract class MinimapFBORendererMixin extends MinimapRenderer { @Unique private OreVeinElementRenderer gtceu$oreVeinElementRenderer; - public MinimapFBORendererMixin(IXaeroMinimap modMain, Minecraft mc, WaypointsGuiRenderer waypointsGuiRenderer, + public MinimapFBORendererMixin(HudMod modMain, Minecraft mc, WaypointMapRenderer waypointMapRenderer, Minimap minimap, CompassRenderer compassRenderer) { - super(modMain, mc, waypointsGuiRenderer, minimap, compassRenderer); + super(modMain, mc, waypointMapRenderer, minimap, compassRenderer); } @Inject(method = "loadFrameBuffer", diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/xaeroworldmap/GuiMapMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/xaeroworldmap/GuiMapMixin.java index 2d95e391d87..f8713ac854b 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/xaeroworldmap/GuiMapMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/xaeroworldmap/GuiMapMixin.java @@ -18,6 +18,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import xaero.lib.client.gui.widget.Tooltip; import xaero.map.MapProcessor; import xaero.map.gui.*; @@ -118,7 +119,7 @@ protected GuiMapMixin(Screen parent, Screen escape, MapProcessor mapProcessor, E ButtonState.toggleButton(button); init(minecraft, width, height); }, - () -> new CursorBox("gtceu.button." + button.name)); + () -> new Tooltip("gtceu.button." + button.name)); addButton(mapButton); offset++; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingBusPartMachine.java index aca45bf8812..256b50ff13e 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingBusPartMachine.java @@ -31,16 +31,13 @@ import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEItemSlot; import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAESlot; import com.gregtechceu.gtceu.integration.ae2.slot.IConfigurableSlotList; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.phys.BlockHitResult; import appeng.api.config.Actionable; import appeng.api.networking.IGrid; @@ -313,15 +310,14 @@ protected Flow createButtonColumn(ModularPanel panel, PanelSyncManager syncManag } @Override - protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { + protected InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { if (!isRemote()) { setAutoPull(!autoPull); if (autoPull) { - playerIn.sendSystemMessage( + context.getPlayer().sendSystemMessage( Component.translatable("gtceu.machine.me.stocking_auto_pull_enabled")); } else { - playerIn.sendSystemMessage( + context.getPlayer().sendSystemMessage( Component.translatable("gtceu.machine.me.stocking_auto_pull_disabled")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingHatchPartMachine.java index 5e1ee801a17..a692d5e621e 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingHatchPartMachine.java @@ -32,15 +32,12 @@ import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAESlot; import com.gregtechceu.gtceu.integration.ae2.slot.IConfigurableSlotList; import com.gregtechceu.gtceu.integration.ae2.utils.AEUtil; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.fluids.FluidStack; import appeng.api.config.Actionable; @@ -300,15 +297,14 @@ protected Flow createButtonColumn(ModularPanel panel, PanelSyncManager syncManag //////////////////////////////// @Override - protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { + protected InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { if (!isRemote()) { setAutoPull(!autoPull); if (autoPull) { - playerIn.sendSystemMessage( + context.getPlayer().sendSystemMessage( Component.translatable("gtceu.machine.me.stocking_auto_pull_enabled")); } else { - playerIn.sendSystemMessage( + context.getPlayer().sendSystemMessage( Component.translatable("gtceu.machine.me.stocking_auto_pull_disabled")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/GTRecipeSchema.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/GTRecipeSchema.java index 7704d092f7b..74758b76dfb 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/GTRecipeSchema.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/GTRecipeSchema.java @@ -24,6 +24,8 @@ import com.gregtechceu.gtceu.common.item.behavior.IntCircuitBehaviour; import com.gregtechceu.gtceu.common.recipe.condition.*; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.core.mixins.IngredientAccessor; +import com.gregtechceu.gtceu.core.mixins.TagValueAccessor; import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; import com.gregtechceu.gtceu.integration.kjs.recipe.components.CapabilityMap; import com.gregtechceu.gtceu.integration.kjs.recipe.components.ExtendedOutputItem; @@ -792,6 +794,15 @@ private void validateItems(@NotNull String type, InputItem... items) { if (stack == null || stack.isEmpty()) { throw new RecipeExceptionJS(String.format("Invalid or empty %s item (recipe ID: %s)", type, id)); } + if (stack.ingredient.getItems().length == 0) { + String tagInfo = ""; + var values = ((IngredientAccessor) stack.ingredient).getValues(); + if (values.length == 1 && values[0] instanceof Ingredient.TagValue tagValue) { + tagInfo = " (empty or unknown tag: #" + ((TagValueAccessor) tagValue).getTag().location() + ")"; + } + throw new RecipeExceptionJS( + String.format("Invalid or empty %s item (recipe ID: %s)%s", type, id, tagInfo)); + } } } @@ -839,6 +850,15 @@ private void validateFluids(@NotNull String type, GTRecipeComponents.FluidIngred String.format("Invalid or empty %s fluid (recipe ID: %s)", type, id)); } } + if (fluid.ingredient().getStacks().length == 0) { + String tagInfo = ""; + var values = fluid.ingredient().values; + if (values.length == 1 && values[0] instanceof FluidIngredient.TagValue tagValue) { + tagInfo = " (empty or unknown tag: #" + tagValue.tag().location() + ")"; + } + throw new RecipeExceptionJS(String.format( + "Invalid or empty %s fluid (recipe ID: %s)%s", type, id, tagInfo)); + } } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/KJSHelpers.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/KJSHelpers.java index 78cc410e131..b21b6d29c43 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/KJSHelpers.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/KJSHelpers.java @@ -3,12 +3,20 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.recipe.ingredient.EnergyStack; +import net.minecraft.core.Holder; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.material.Fluid; + +import com.google.common.collect.Lists; +import dev.latvian.mods.kubejs.item.ingredient.TagContext; +import dev.latvian.mods.kubejs.recipe.RecipesEventJS; import dev.latvian.mods.kubejs.util.MapJS; import dev.latvian.mods.kubejs.util.UtilsJS; import dev.latvian.mods.rhino.Wrapper; import it.unimi.dsi.fastutil.longs.LongLongPair; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; @@ -104,4 +112,21 @@ public static EnergyStack parseEnergyStack(Object o) { } return LongLongPair.of(voltage, amperage); } + + /** + * Resolves a fluid tag using KubeJS's TagContext during recipe (re)loading, since the server registry + * hasn't bound the tags yet. Returns null if a recipe event is not currently active. + * Analogous to KubeJS' TagContext::patchIngredientTags for items. + */ + @Nullable + public static ArrayList getFluidsDuringLoad(TagKey tag) { + if (RecipesEventJS.instance == null) return null; + + var holders = TagContext.INSTANCE.getValue().getTag(tag); + ArrayList list = Lists.newArrayList(); + for (Holder holder : holders) { + list.add(holder.value()); + } + return list; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/fluid/FluidChunkHighlighter.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/fluid/FluidChunkHighlighter.java index 8f9cf1068d9..72a3a1b5655 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/fluid/FluidChunkHighlighter.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/fluid/FluidChunkHighlighter.java @@ -12,7 +12,7 @@ import net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions; import xaero.common.minimap.highlight.ChunkHighlighter; -import xaero.common.minimap.info.render.compile.InfoDisplayCompiler; +import xaero.hud.minimap.info.render.compile.InfoDisplayCompiler; public class FluidChunkHighlighter extends ChunkHighlighter { @@ -63,7 +63,8 @@ protected int[] getColors(ResourceKey dimension, int chunkX, int chunkZ) } @Override - public void addChunkHighlightTooltips(InfoDisplayCompiler compiler, ResourceKey dimension, int chunkX, + public void addChunkHighlightTooltips(InfoDisplayCompiler compiler, + ResourceKey dimension, int chunkX, int chunkZ, int width) {} @Override diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementReader.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementReader.java index 16a3bd67ca8..f7e7a851109 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementReader.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementReader.java @@ -7,6 +7,7 @@ import xaero.hud.minimap.element.render.MinimapElementReader; import xaero.map.WorldMap; +import xaero.map.common.config.option.WorldMapProfiledConfigOptions; public class OreVeinElementReader extends MinimapElementReader { @@ -42,12 +43,16 @@ public int getInteractionBoxRight(OreVeinElement element, OreVeinElementContext @Override public int getInteractionBoxTop(OreVeinElement element, OreVeinElementContext context, float partialTicks) { - return WorldMap.settings.waypointBackgrounds ? -41 : -12; + boolean flag = WorldMap.INSTANCE.getConfigs().getClientConfigManager() + .getEffective(WorldMapProfiledConfigOptions.WAYPOINT_BACKGROUNDS); + return flag ? -41 : -12; } @Override public int getInteractionBoxBottom(OreVeinElement element, OreVeinElementContext context, float partialTicks) { - return WorldMap.settings.waypointBackgrounds ? 0 : 12; + boolean flag = WorldMap.INSTANCE.getConfigs().getClientConfigManager() + .getEffective(WorldMapProfiledConfigOptions.WAYPOINT_BACKGROUNDS); + return flag ? 0 : 12; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementRenderProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementRenderProvider.java index 647e8176a91..b147141dd97 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementRenderProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementRenderProvider.java @@ -9,6 +9,7 @@ import xaero.hud.minimap.element.render.MinimapElementRenderLocation; import xaero.hud.minimap.element.render.MinimapElementRenderProvider; import xaero.map.WorldMap; +import xaero.map.common.config.option.WorldMapProfiledConfigOptions; import java.util.Iterator; @@ -20,7 +21,8 @@ public OreVeinElementRenderProvider() {} @Override public void begin(MinimapElementRenderLocation location, OreVeinElementContext context) { - if (WorldMap.settings.waypoints) { + if (WorldMap.INSTANCE.getConfigs().getClientConfigManager().getEffective( + WorldMapProfiledConfigOptions.WAYPOINT_BACKGROUNDS)) { ResourceKey currentDim = Minecraft.getInstance().level.dimension(); this.iterator = XaerosRenderer.oreElements.row(currentDim).values().iterator(); } else { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/gui/GuiTexturedButtonWithSize.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/gui/GuiTexturedButtonWithSize.java index 89eccff77f5..cb3874ec127 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/gui/GuiTexturedButtonWithSize.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/gui/GuiTexturedButtonWithSize.java @@ -4,7 +4,7 @@ import net.minecraft.resources.ResourceLocation; import com.mojang.blaze3d.systems.RenderSystem; -import xaero.map.gui.CursorBox; +import xaero.lib.client.gui.widget.Tooltip; import xaero.map.gui.GuiTexturedButton; import java.util.function.Supplier; @@ -16,7 +16,7 @@ public class GuiTexturedButtonWithSize extends GuiTexturedButton { public GuiTexturedButtonWithSize(int x, int y, int w, int h, int textureX, int textureY, int textureW, int textureH, int spriteW, int spriteH, ResourceLocation texture, OnPress onPress, - Supplier tooltip) { + Supplier tooltip) { super(x, y, w, h, textureX, textureY, textureW, textureH, texture, onPress, tooltip); this.spriteW = spriteW; this.spriteH = spriteH; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementReader.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementReader.java index 88e3a010b71..e7db60ba262 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementReader.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementReader.java @@ -8,9 +8,10 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; +import xaero.lib.client.gui.widget.Tooltip; import xaero.map.WorldMap; +import xaero.map.common.config.option.WorldMapProfiledConfigOptions; import xaero.map.element.MapElementReader; -import xaero.map.gui.CursorBox; import xaero.map.gui.IRightClickableElement; import xaero.map.gui.dropdown.rightclick.RightClickOption; @@ -58,12 +59,16 @@ public int getInteractionBoxRight(OreVeinElement element, OreVeinElementContext @Override public int getInteractionBoxTop(OreVeinElement element, OreVeinElementContext context, float partialTicks) { - return WorldMap.settings.waypointBackgrounds ? -41 : -12; + boolean flag = WorldMap.INSTANCE.getConfigs().getClientConfigManager() + .getEffective(WorldMapProfiledConfigOptions.WAYPOINT_BACKGROUNDS); + return flag ? -41 : -12; } @Override public int getInteractionBoxBottom(OreVeinElement element, OreVeinElementContext context, float partialTicks) { - return WorldMap.settings.waypointBackgrounds ? 0 : 12; + boolean flag = WorldMap.INSTANCE.getConfigs().getClientConfigManager() + .getEffective(WorldMapProfiledConfigOptions.WAYPOINT_BACKGROUNDS); + return flag ? 0 : 12; } @Override @@ -146,10 +151,10 @@ public int getRenderBoxBottom(OreVeinElement element, OreVeinElementContext cont } @Override - public CursorBox getTooltip(OreVeinElement element, OreVeinElementContext context, boolean overMenu) { + public Tooltip getTooltip(OreVeinElement element, OreVeinElementContext context, boolean overMenu) { List components = OreRenderLayer.getTooltip(element.getName(), element.getVein()); // Xaeros requires spaces before/after newlines (see xaero.map.misc.TextSplitter) String joined = components.stream().map(Component::getString).collect(Collectors.joining(" \n ")); - return new CursorBox(joined); + return new Tooltip(joined); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementRenderProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementRenderProvider.java index 3c88a08e864..b83b73418c3 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementRenderProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementRenderProvider.java @@ -7,6 +7,7 @@ import net.minecraft.world.level.Level; import xaero.map.WorldMap; +import xaero.map.common.config.option.WorldMapProfiledConfigOptions; import xaero.map.element.MapElementRenderProvider; import java.util.Iterator; @@ -18,13 +19,15 @@ public class OreVeinElementRenderProvider extends MapElementRenderProvider currentDim = Minecraft.getInstance().level.dimension(); this.iterator = XaerosRenderer.oreElements.row(currentDim).values() .stream() .map(element -> new OreVeinElement(element.getVein(), element.getName())) .iterator(); - context.worldmapWaypointsScale = WorldMap.settings.worldmapWaypointsScale; + context.worldmapWaypointsScale = WorldMap.INSTANCE.getConfigs().getClientConfigManager() + .getEffective(WorldMapProfiledConfigOptions.WAYPOINT_SCALE).floatValue(); } else { this.iterator = null; } diff --git a/src/main/java/com/gregtechceu/gtceu/utils/ExtendedUseOnContext.java b/src/main/java/com/gregtechceu/gtceu/utils/ExtendedUseOnContext.java new file mode 100644 index 00000000000..6a869bc2fbb --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/utils/ExtendedUseOnContext.java @@ -0,0 +1,37 @@ +package com.gregtechceu.gtceu.utils; + +import com.gregtechceu.gtceu.api.capability.ICoverable; +import com.gregtechceu.gtceu.api.item.tool.GTToolType; +import com.gregtechceu.gtceu.api.item.tool.ToolHelper; + +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.phys.BlockHitResult; + +import lombok.Getter; +import org.jetbrains.annotations.UnknownNullability; +import org.jetbrains.annotations.Unmodifiable; + +import java.util.Set; + +public class ExtendedUseOnContext extends UseOnContext { + + @Getter + private final Direction gridSide; + @Getter + @Unmodifiable + private final Set toolType; + + public ExtendedUseOnContext(Player player, InteractionHand hand, BlockHitResult hitResult) { + super(player, hand, hitResult); + gridSide = ICoverable.determineGridSideHit(hitResult); + toolType = ToolHelper.getToolTypes(getItemInHand()); + } + + @Override + public @UnknownNullability Player getPlayer() { + return super.getPlayer(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/utils/GTTransferUtils.java b/src/main/java/com/gregtechceu/gtceu/utils/GTTransferUtils.java index 9df9137d39e..643d173da1b 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/GTTransferUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/GTTransferUtils.java @@ -315,7 +315,7 @@ public static boolean extractItemsFromPlayerInv(Player player, List i for (var stack : items) { var found = ContainerHelper.clearOrCountMatchingItems(inventory, (s) -> s.is(stack.getItem()), stack.getCount(), simulate); - if (found != stack.getCount()) return false; + if (found < stack.getCount()) return false; } if (!simulate) player.inventoryMenu.broadcastChanges();