From bda40229581c98f023f8c6c33496c2d294f349cc Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 5 Jan 2026 16:05:27 +0200 Subject: [PATCH 01/10] remove 3+ unnecessary calls/checks from CommonEventListener#onLeftClickBlock --- .../gregtechceu/gtceu/forge/CommonEventListener.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/forge/CommonEventListener.java b/src/main/java/com/gregtechceu/gtceu/forge/CommonEventListener.java index b458918e134..3e4b1c93b1b 100644 --- a/src/main/java/com/gregtechceu/gtceu/forge/CommonEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/forge/CommonEventListener.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.block.BlockAttributes; -import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IElectricItem; import com.gregtechceu.gtceu.api.capability.IMedicalConditionTracker; @@ -172,11 +171,10 @@ public static void onBlockStartBreak(BlockEvent.BreakEvent event) { @SubscribeEvent public static void onLeftClickBlock(PlayerInteractEvent.LeftClickBlock event) { - var blockState = event.getLevel().getBlockState(event.getPos()); - if (blockState.hasBlockEntity() && blockState.getBlock() instanceof MetaMachineBlock block && - block.getMachine(event.getLevel(), event.getPos()) instanceof IInteractedMachine machine) { - if (machine.onLeftClick(event.getEntity(), event.getLevel(), event.getHand(), event.getPos(), - event.getFace())) { + MetaMachine machine = MetaMachine.getMachine(event.getLevel(), event.getPos()); + if (machine instanceof IInteractedMachine interactedMachine) { + if (interactedMachine.onLeftClick(event.getEntity(), event.getLevel(), event.getHand(), + event.getPos(), event.getFace())) { event.setCanceled(true); } } From d2e1f75c3b570017a8b10488aa99642ee02b9c35 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 5 Jan 2026 16:02:59 +0200 Subject: [PATCH 02/10] remove unused cancel check in CommonEventListener/IGTool --- .../gregtechceu/gtceu/api/item/IGTTool.java | 76 ++++++++----------- .../gtceu/forge/CommonEventListener.java | 6 +- 2 files changed, 34 insertions(+), 48 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java b/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java index c4789e87f7e..e78ae8ce5f7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java @@ -276,60 +276,48 @@ default int getTotalHarvestLevel() { return true; } - default boolean definition$onBlockStartBreak(ItemStack stack, BlockPos pos, Player player) { - if (player.level().isClientSide) return false; + default void definition$onBlockStartBreak(ItemStack stack, BlockPos pos, Player player) { + if (!(player instanceof ServerPlayer serverPlayer)) return; + if (player.isShiftKeyDown()) return; + getBehaviorsComponent(stack).behaviors() .forEach((type, behavior) -> behavior.onBlockStartBreak(stack, pos, player)); - if (!player.isShiftKeyDown()) { - ServerPlayer serverPlayer = (ServerPlayer) player; - int result = -1; - if (isTool(stack, GTToolType.SHEARS)) { - result = shearBlockRoutine(serverPlayer, stack, pos); - } - if (result != 0) { - // prevent exploits with instantly breakable blocks - BlockState state = player.level().getBlockState(pos); - boolean effective = isToolEffective(stack, state, getToolClasses(stack), getTotalHarvestLevel()); - - if (effective) { - if (areaOfEffectBlockBreakRoutine(stack, serverPlayer, pos)) { - if (playSoundOnBlockDestroy()) playSound(player); - } else { - if (result == -1) { - var behavior = getBehaviorsComponent(stack).getBehavior(GTToolBehaviors.TREE_FELLING); - if (behavior != null && behavior.isEnabled() && state.is(BlockTags.LOGS)) { - TreeFellingHelper.fellTree(stack, player.level(), state, pos, player); - } - if (playSoundOnBlockDestroy()) playSound(player); - } else { - return true; - } - } - } + // prevent exploits with instantly breakable blocks + BlockState state = player.level().getBlockState(pos); + + if (!isToolEffective(stack, state)) { + return; + } + if (!areaOfEffectBlockBreakRoutine(stack, serverPlayer, pos)) { + var behavior = getBehaviorsComponent(stack).getBehavior(GTToolBehaviors.TREE_FELLING); + if (behavior != null && behavior.isEnabled() && state.is(BlockTags.LOGS)) { + TreeFellingHelper.fellTree(stack, player.level(), state, pos, player); } } - return false; + if (playSoundOnBlockDestroy()) { + playSound(player); + } } - default boolean definition$mineBlock(ItemStack stack, Level worldIn, BlockState state, BlockPos pos, - LivingEntity entityLiving) { - if (!worldIn.isClientSide) { - getToolStats().getBehaviors() - .forEach(behavior -> behavior.onBlockDestroyed(stack, worldIn, state, pos, entityLiving)); + default void definition$mineBlock(ItemStack stack, Level level, BlockState state, BlockPos pos, + LivingEntity entity) { + if (level.isClientSide) { + return; + } + getToolStats().getBehaviors() + .forEach(behavior -> behavior.onBlockDestroyed(stack, level, state, pos, entity)); - if ((double) state.getDestroySpeed(worldIn, pos) != 0.0D) { - damageItem(stack, entityLiving, getToolStats().getToolDamagePerBlockBreak(stack)); - } - if (entityLiving instanceof Player && playSoundOnBlockDestroy()) { - // sneaking disables AOE, which means it is okay to play the sound - // not checking this means the sound will play for every AOE broken block, which is very loud - if (entityLiving.isShiftKeyDown()) { - playSound((Player) entityLiving); - } + if (state.getDestroySpeed(level, pos) != 0.0) { + damageItem(stack, entity, getToolStats().getToolDamagePerBlockBreak(stack)); + } + if (entity instanceof Player player && playSoundOnBlockDestroy()) { + // sneaking disables AOE, which means it is okay to play the sound + // not checking this means the sound will play for every AOE broken block, which is very loud + if (entity.isShiftKeyDown()) { + playSound(player); } } - return true; } default boolean definition$isValidRepairItem(ItemStack toRepair, ItemStack repair) { diff --git a/src/main/java/com/gregtechceu/gtceu/forge/CommonEventListener.java b/src/main/java/com/gregtechceu/gtceu/forge/CommonEventListener.java index 3e4b1c93b1b..5316a595e7f 100644 --- a/src/main/java/com/gregtechceu/gtceu/forge/CommonEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/forge/CommonEventListener.java @@ -161,11 +161,9 @@ public static void onBlockStartBreak(BlockEvent.BreakEvent event) { return; } - ItemStack toolStack = event.getPlayer().getItemInHand(event.getPlayer().getUsedItemHand()); + ItemStack toolStack = event.getPlayer().getMainHandItem(); if (toolStack.getItem() instanceof IGTTool tool) { - if (tool.definition$onBlockStartBreak(toolStack, event.getPos(), event.getPlayer())) { - event.setCanceled(true); - } + tool.definition$onBlockStartBreak(toolStack, event.getPos(), event.getPlayer()); } } From 4902f9c660498b9896a54475bf76872e3c3d68d5 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 5 Jan 2026 16:03:54 +0200 Subject: [PATCH 03/10] remove duplicate of vanilla destroy speed code in IGTTool/GTToolItem --- .../com/gregtechceu/gtceu/api/item/IGTTool.java | 16 ---------------- .../gtceu/api/item/tool/GTToolItem.java | 17 ++--------------- .../gtceu/api/item/tool/ToolHelper.java | 3 +-- 3 files changed, 3 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java b/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java index e78ae8ce5f7..0d5b1175f68 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java @@ -260,15 +260,6 @@ default int getTotalHarvestLevel() { return getMaterialHarvestLevel() + getToolStats().getBaseQuality(); } - // Item.class methods - default float definition$getDestroySpeed(ItemStack stack, BlockState state) { - if (isToolEffective(stack, state, getToolClasses(stack), getTotalHarvestLevel())) { - return getTotalToolSpeed(); - } - - return getToolStats().isToolEffective(state) ? getToolStats().getTool().getMiningSpeed(state) : 1.0F; - } - default boolean definition$hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { getBehaviorsComponent(stack).behaviors() .forEach((key, behavior) -> behavior.hitEntity(stack, target, attacker)); @@ -738,13 +729,6 @@ default void attachCapabilities(RegisterCapabilitiesEvent event) { } } - default boolean definition$isCorrectToolForDrops(ItemStack stack, BlockState state) { - if (stack.getItem() instanceof IGTTool gtTool) { - return isToolEffective(stack, state, gtTool.getToolClasses(stack), gtTool.getTotalHarvestLevel()); - } - return stack.isCorrectToolForDrops(state); - } - @OnlyIn(Dist.CLIENT) static ItemColor tintColor() { return (itemStack, index) -> { diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolItem.java index a8abbbf8706..3da29189183 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolItem.java @@ -96,7 +96,8 @@ public Component getName(ItemStack stack) { @Override public boolean mineBlock(ItemStack stack, Level level, BlockState state, BlockPos pos, LivingEntity miningEntity) { - return definition$mineBlock(stack, level, state, pos, miningEntity); + definition$mineBlock(stack, level, state, pos, miningEntity); + return true; } @Override @@ -115,20 +116,11 @@ public boolean playSoundOnBlockDestroy() { return toolType.playSoundOnBlockDestroy; } - @Override - public float getDestroySpeed(ItemStack stack, BlockState state) { - return definition$getDestroySpeed(stack, state); - } - @Override public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { return definition$hurtEnemy(stack, target, attacker); } - public boolean onBlockStartBreak(ItemStack stack, BlockPos pos, Player player) { - return definition$onBlockStartBreak(stack, pos, player); - } - @Override public void appendHoverText(ItemStack stack, TooltipContext context, List tooltipComponents, TooltipFlag isAdvanced) { @@ -189,9 +181,4 @@ public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStac public InteractionResultHolder use(Level level, Player player, InteractionHand usedHand) { return definition$use(level, player, usedHand); } - - @Override - public boolean isCorrectToolForDrops(ItemStack stack, BlockState state) { - return this.definition$isCorrectToolForDrops(stack, state); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java index b9e4134d315..c32f4e8d4fb 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java @@ -574,8 +574,7 @@ public static boolean isTool(ItemStack tool, GTToolType... toolClasses) { } // encompasses all vanilla special case tool checks for harvesting - public static boolean isToolEffective(ItemStack stack, BlockState state, Set toolClasses, - int harvestLevel) { + public static boolean isToolEffective(ItemStack stack, BlockState state) { Tool tool = stack.get(DataComponents.TOOL); return tool != null && tool.isCorrectForDrops(state); } From b61c839a3f31dc0a942d2a5e0731d374d7081644 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 5 Jan 2026 16:01:51 +0200 Subject: [PATCH 04/10] merge the 2 methods every event handler in ToolEventHandlers had (they were leftovers from fabric days) --- .../common/item/tool/ToolEventHandlers.java | 158 ++++++++---------- 1 file changed, 71 insertions(+), 87 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/ToolEventHandlers.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/ToolEventHandlers.java index 068f5a0b2cf..973bb7d3fcc 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/ToolEventHandlers.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/ToolEventHandlers.java @@ -48,55 +48,60 @@ public class ToolEventHandlers { /** * Handles returning broken stacks for tools */ - public static void onPlayerDestroyItem(ItemStack original, InteractionHand hand, Player player) { - Item item = original.getItem(); - if (item instanceof IGTTool def) { - ItemStack brokenStack = def.getToolStats().getBrokenStack(); - // Transfer over remaining charge to power units - if (GTCapabilityHelper.getElectricItem(brokenStack) != null && def.isElectric()) { - long remainingCharge = def.getCharge(original); - IElectricItem electricStack = GTCapabilityHelper.getElectricItem(brokenStack); - if (electricStack != null) { - // update the max charge of the item, if possible - // applies to items like power units, which can have different max charges depending on their recipe - if (electricStack instanceof ElectricItem electricItem) { - electricItem.setMaxChargeOverride(def.getMaxCharge(original)); - } + @SubscribeEvent + public static void onPlayerDestroyItem(PlayerDestroyItemEvent event) { + ItemStack original = event.getOriginal(); + InteractionHand hand = event.getHand(); + Player player = event.getEntity(); - electricStack.charge(Math.min(remainingCharge, def.getMaxCharge(original)), def.getElectricTier(), - true, false); + if (!(original.getItem() instanceof IGTTool gtTool)) { + return; + } + ItemStack brokenStack = gtTool.getToolStats().getBrokenStack(); + // Transfer over remaining charge to power units + if (GTCapabilityHelper.getElectricItem(brokenStack) != null && gtTool.isElectric()) { + long remainingCharge = gtTool.getCharge(original); + IElectricItem electricStack = GTCapabilityHelper.getElectricItem(brokenStack); + if (electricStack != null) { + // update the max charge of the item, if possible + // applies to items like power units, which can have different max charges depending on their recipe + if (electricStack instanceof ElectricItem electricItem) { + electricItem.setMaxChargeOverride(gtTool.getMaxCharge(original)); } + + electricStack.charge(Math.min(remainingCharge, gtTool.getMaxCharge(original)), gtTool.getElectricTier(), + true, false); } - if (!brokenStack.isEmpty()) { - if (hand == null) { - if (!player.addItem(brokenStack)) { - player.drop(brokenStack, true); - } - } else { - player.setItemInHand(hand, brokenStack); - } + } + if (brokenStack.isEmpty()) { + return; + } + if (hand == null) { + if (!player.addItem(brokenStack)) { + player.drop(brokenStack, true); } + } else { + player.setItemInHand(hand, brokenStack); } } - public static InteractionResult onPlayerEntityInteract(Player player, InteractionHand hand, Entity target) { - ItemStack itemStack = player.getItemInHand(hand); - Item item = itemStack.getItem(); + /** + * Handle item frame power unit duping + */ + @SubscribeEvent + public static void onPlayerEntityInteract(PlayerInteractEvent.EntityInteract event) { + ItemStack itemStack = event.getItemStack(); - /* - * Handle item frame power unit duping - */ - if (item instanceof IGTTool def) { - if (target instanceof ItemFrame itemFrame) { - ItemStack brokenStack = def.getToolStats().getBrokenStack(); - if (!brokenStack.isEmpty()) { - itemFrame.interact(player, hand); + if (!(itemStack.getItem() instanceof IGTTool gtTool) || !(event.getTarget() instanceof ItemFrame itemFrame)) { + return; + } + ItemStack brokenStack = gtTool.getToolStats().getBrokenStack(); + if (!brokenStack.isEmpty()) { + itemFrame.interact(event.getEntity(), event.getHand()); - return InteractionResult.SUCCESS; - } - } + event.setCanceled(true); + event.setCancellationResult(InteractionResult.SUCCESS); } - return InteractionResult.PASS; } /** @@ -144,7 +149,7 @@ public static List onHarvestDrops(Player player, ItemStack tool, Serv // Place close to the player for sanity reasons (Instead of XYZ=0,0,0) ItemEntity drop = new ItemEntity(level, player.getX(), player.getY(), player.getZ(), dropStack); - if (fireItemPickupEvent(drop, player) && player.addItem(dropStack)) { + if (isPickupAllowedByEvent(drop, player) && player.addItem(dropStack)) { EventHooks.fireItemPickupPost(drop, player, dropStack.copy()); dropItr.remove(); } @@ -156,7 +161,7 @@ public static List onHarvestDrops(Player player, ItemStack tool, Serv return drops; } - public static boolean fireItemPickupEvent(ItemEntity drop, Player player) { + public static boolean isPickupAllowedByEvent(ItemEntity drop, Player player) { return !EventHooks.fireItemPickupPre(drop, player).canPickup().isFalse(); } @@ -165,63 +170,42 @@ public static boolean fireItemPickupEvent(ItemEntity drop, Player player) { * Electric tools can still be repaired with ingots in the anvil, but electric tools cannot * be combined with other GT tools, electric or otherwise. */ - public static boolean onAnvilUpdateEvent(ItemStack left, ItemStack right) { - if (left.getItem() instanceof IGTTool leftTool && right.getItem() instanceof IGTTool rightTool) { - if (leftTool.getToolMaterial(left) != rightTool.getToolMaterial(right)) { - return false; - } - if (leftTool.isElectric() || rightTool.isElectric()) { - return false; - } - } - return true; - } - - @SubscribeEvent - public static void onPlayerDestroyItem(@NotNull PlayerDestroyItemEvent event) { - ToolEventHandlers.onPlayerDestroyItem(event.getOriginal(), event.getHand(), event.getEntity()); - } - @SubscribeEvent - public static void onPlayerEntityInteract(@NotNull PlayerInteractEvent.EntityInteract event) { - InteractionResult result = ToolEventHandlers.onPlayerEntityInteract(event.getEntity(), event.getHand(), - event.getTarget()); - if (result != InteractionResult.PASS) { + public static void onAnvilUpdateEvent(AnvilUpdateEvent event) { + ItemStack left = event.getLeft(); + ItemStack right = event.getRight(); + if (!(left.getItem() instanceof IGTTool leftTool) || !(right.getItem() instanceof IGTTool rightTool)) { + return; + } + if (leftTool.isElectric() || rightTool.isElectric()) { + event.setCanceled(true); + } + if (leftTool.getToolMaterial(left) != rightTool.getToolMaterial(right)) { event.setCanceled(true); - event.setCancellationResult(result); } } @SubscribeEvent - public static void onAnvilUpdateEvent(AnvilUpdateEvent event) { - if (!ToolEventHandlers.onAnvilUpdateEvent(event.getLeft(), event.getRight())) { - event.setCanceled(true); + public static void onPlayerKilledEntity(LivingDropsEvent event) { + Entity entity = event.getSource().getEntity(); + if (!(entity instanceof Player player)) { + return; } - } + ItemStack tool = player.getMainHandItem(); - public static Collection onPlayerKilledEntity(ItemStack tool, Player player, - Collection drops) { - if (tool.has(GTDataComponents.RELOCATE_MOB_DROPS)) { - Iterator dropItr = drops.iterator(); + if (!tool.has(GTDataComponents.RELOCATE_MOB_DROPS)) { + return; + } + Iterator dropItr = event.getDrops().iterator(); - while (dropItr.hasNext()) { - ItemEntity drop = dropItr.next(); - ItemStack dropStack = drop.getItem(); + while (dropItr.hasNext()) { + ItemEntity drop = dropItr.next(); + ItemStack dropStack = drop.getItem(); - if (fireItemPickupEvent(drop, player) || player.addItem(dropStack)) { - EventHooks.fireItemPickupPost(drop, player, dropStack.copy()); - dropItr.remove(); - } + if (isPickupAllowedByEvent(drop, player) && player.addItem(dropStack)) { + EventHooks.fireItemPickupPost(drop, player, dropStack.copy()); + dropItr.remove(); } } - return drops; - } - - @SubscribeEvent - public static void onPlayerKilledEntity(LivingDropsEvent event) { - Entity entity = event.getSource().getEntity(); - if (entity instanceof Player player) { - ToolEventHandlers.onPlayerKilledEntity(player.getMainHandItem(), player, event.getDrops()); - } } } From 85be1fc28de4e2b514b6e85b06e317a4a104dff4 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 5 Jan 2026 15:59:54 +0200 Subject: [PATCH 05/10] use a bit less `var` --- .../com/gregtechceu/gtceu/api/item/tool/ToolHelper.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java index c32f4e8d4fb..76676f07add 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java @@ -190,8 +190,7 @@ public static void damageItem(@NotNull ItemStack stack, @Nullable LivingEntity u if (user != null) { user.breakItem(stack); user.onEquippedItemBroken(stack.getItem(), - user.getSlotForHand( - user.isUsingItem() ? user.getUsedItemHand() : InteractionHand.MAIN_HAND)); + LivingEntity.getSlotForHand(user.isUsingItem() ? user.getUsedItemHand() : InteractionHand.MAIN_HAND)); } stack.shrink(1); } @@ -248,7 +247,7 @@ public static boolean areaOfEffectBlockBreakRoutine(ItemStack stack, ServerPlaye int currentDurability = stack.getDamageValue(); int maximumDurability = stack.getMaxDamage(); int remainingUses = maximumDurability - currentDurability; - var harvestableBlocks = getHarvestableBlocks(stack, player); + List harvestableBlocks = getHarvestableBlocks(stack, player); if (!harvestableBlocks.isEmpty()) { for (BlockPos pos : harvestableBlocks) { if (!destroyBlock(player, stack, pos, pos == targeted)) { @@ -301,7 +300,7 @@ public static List iterateAoE(AoESymmetrical aoeDefinition, Predicate< for (int depth = 0; depth <= aoeDefinition.layer(); depth++) { for (int top = aoeRowEnd; top >= aoeRowStart; top--) { for (int side = -aoeDefinition.column(); side <= aoeDefinition.column(); side++) { - var pos = context.getClickedPos() + BlockPos pos = context.getClickedPos() .relative(depthDirection, depth) .relative(topDirection, top) .relative(sideDirection, side); From d7eee7ec8e29ac4c5baf7960c559bd010a3e8b06 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 5 Jan 2026 15:58:59 +0200 Subject: [PATCH 06/10] fix onion's jank --- .../gregtechceu/gtceu/api/item/tool/ToolHelper.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java index 76676f07add..9f34e24b2ce 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java @@ -250,7 +250,7 @@ public static boolean areaOfEffectBlockBreakRoutine(ItemStack stack, ServerPlaye List harvestableBlocks = getHarvestableBlocks(stack, player); if (!harvestableBlocks.isEmpty()) { for (BlockPos pos : harvestableBlocks) { - if (!destroyBlock(player, stack, pos, pos == targeted)) { + if (!destroyBlock(player, stack, pos, pos.equals(targeted))) { return true; } @@ -473,21 +473,20 @@ public static boolean removeBlock(Level level, ServerPlayer player, BlockPos pos * @return listOfBlockPositions or empty list if none */ public static List getHarvestableBlocks(ItemStack stack, Player player) { - final List NO_BLOCKS = List.of(); - if (!hasBehaviorsComponent(stack)) return NO_BLOCKS; + if (!hasBehaviorsComponent(stack)) return Collections.emptyList(); - var aoeDefinition = getAoEDefinition(stack); + AoESymmetrical aoeDefinition = getAoEDefinition(stack); if (aoeDefinition.isZero()) { - return NO_BLOCKS; + return Collections.emptyList(); } InteractionHand hand = InteractionHand.MAIN_HAND; BlockHitResult hitResult = getPlayerDefaultRaytrace(player); - UseOnContext context = new UseOnContext(player, hand, hitResult); + UseOnContext context = new UseOnContext(player, InteractionHand.MAIN_HAND, hitResult); return getHarvestableBlocks(aoeDefinition, context); } - public static BlockHitResult getPlayerDefaultRaytrace(@NotNull Player player) { + public static BlockHitResult getPlayerDefaultRaytrace(Player player) { return entityPickBlock(player, player.blockInteractionRange(), 1.0f, false); } From 3666128885e5455f6c17d1bb415b7a30b7a3a1c0 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 5 Jan 2026 15:58:36 +0200 Subject: [PATCH 07/10] remove IShearable handling for blocks as (neo)forge never implemented it --- .../gtceu/api/item/tool/ToolHelper.java | 44 ------------------- 1 file changed, 44 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java index 9f34e24b2ce..8c1c21e02e2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java @@ -67,7 +67,6 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.common.CommonHooks; -import net.neoforged.neoforge.common.IShearable; import net.neoforged.neoforge.event.EventHooks; import it.unimi.dsi.fastutil.chars.Char2ReferenceMap; @@ -408,10 +407,6 @@ public static void applyHammerDropConversion(ServerLevel world, BlockPos pos, It public static boolean destroyBlock(ServerPlayer player, ItemStack tool, BlockPos pos, boolean playSound) { DO_BLOCK_BREAK_SOUND_PARTICLES.set(playSound); - // This is *not* a vanilla/forge convention, Forge never added "shears" to ItemShear's tool classes. - if (isTool(tool, GTToolType.SHEARS) && shearBlockRoutine(player, tool, pos) == 0) { - return false; - } Level level = player.level(); // we set this flag when firing the event so the event listener that starts this whole thing doesn't cascade @@ -625,45 +620,6 @@ public static float getDestroySpeed(BlockState state, Set toolClasse return -1; } - /** - * Shearing a Block. - * - * @return -1 if not shearable, otherwise return 0 or 1, 0 if tool is now broken. - */ - public static int shearBlockRoutine(ServerPlayer player, ItemStack tool, BlockPos pos) { - if (!player.isCreative()) { - Level world = player.serverLevel(); - BlockState state = world.getBlockState(pos); - if (state.getBlock() instanceof IShearable shearable) { - if (shearable.isShearable(player, tool, world, pos)) { - List shearedDrops = shearable.onSheared(player, tool, world, pos); - boolean relocateMinedBlocks = tool.has(GTDataComponents.RELOCATE_MINED_BLOCKS); - Iterator iter = shearedDrops.iterator(); - while (iter.hasNext()) { - ItemStack stack = iter.next(); - if (relocateMinedBlocks && player.addItem(stack)) { - iter.remove(); - } else { - float f = 0.7F; - double xo = world.random.nextFloat() * f + 0.15D; - double yo = world.random.nextFloat() * f + 0.15D; - double zo = world.random.nextFloat() * f + 0.15D; - ItemEntity entityItem = new ItemEntity(world, pos.getX() + xo, pos.getY() + yo, - pos.getZ() + zo, stack); - entityItem.setDefaultPickUpDelay(); - world.addFreshEntity(entityItem); - } - } - ToolHelper.damageItem(tool, player, 1); - player.awardStat(Stats.BLOCK_MINED.get((Block) shearable)); - world.setBlock(pos, Blocks.AIR.defaultBlockState(), 11); - return tool.isEmpty() ? 0 : 1; - } - } - } - return -1; - } - // Suppliers for broken tool stacks public static final Supplier SUPPLY_POWER_UNIT_LV = () -> GTItems.POWER_UNIT_LV.get() .getDefaultInstance(); From 52b854c19bd1d36afa42c52e07343e6397db9469 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 5 Jan 2026 15:54:03 +0200 Subject: [PATCH 08/10] remove legacy "constructor" from GTToolItem --- .../java/com/gregtechceu/gtceu/api/item/tool/GTToolItem.java | 5 ----- .../java/com/gregtechceu/gtceu/api/item/tool/GTToolType.java | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolItem.java index 3da29189183..bbc0f6bd939 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolItem.java @@ -54,11 +54,6 @@ public GTToolItem(GTToolType toolType, MaterialToolTier tier, Material material, definition$init(); } - public static GTToolItem create(GTToolType toolType, MaterialToolTier tier, Material material, - IGTToolDefinition definition, Properties properties) { - return new GTToolItem(toolType, tier, material, definition, properties); - } - @Override public ItemStack getDefaultInstance() { return get(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolType.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolType.java index 7784fa72937..2e49088f6f2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolType.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolType.java @@ -593,7 +593,7 @@ public static class Builder { @Setter private char symbol = ' '; @Setter - private ToolConstructor constructor = GTToolItem::create; + private ToolConstructor constructor = GTToolItem::new; @Setter private ResourceLocation modelLocation; private SoundEntry sound; From 286c1d3db1cdc6b1c9bbd1606ae4eca69a323b3c Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 5 Jan 2026 15:52:23 +0200 Subject: [PATCH 09/10] clean up some unnecessary/duplicated nullability annotations --- .../com/gregtechceu/gtceu/api/item/IGTTool.java | 10 ++++------ .../api/item/datacomponents/ToolBehaviors.java | 3 ++- .../gtceu/api/item/tool/MaterialToolTier.java | 2 +- .../gtceu/api/item/tool/ToolHelper.java | 14 +++++--------- .../common/machine/trait/miner/MinerLogic.java | 2 +- 5 files changed, 13 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java b/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java index 0d5b1175f68..2bef9b8d9df 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java @@ -146,7 +146,6 @@ default ToolProperty getToolProperty() { return getMaterial().getProperty(PropertyKey.TOOL); } - @Nullable default DustProperty getDustProperty(ItemStack stack) { return getToolMaterial(stack).getProperty(PropertyKey.DUST); } @@ -396,8 +395,7 @@ private static ItemEnchantments joinEnchants(ItemStack stack, @NotNull ItemEncha .anyMatch(behavior -> behavior.canDisableShield(stack, shield, entity, attacker)); } - default boolean definition$doesSneakBypassUse(@NotNull ItemStack stack, @NotNull BlockGetter world, - @NotNull BlockPos pos, @NotNull Player player) { + default boolean definition$doesSneakBypassUse(ItemStack stack, BlockGetter world, BlockPos pos, Player player) { return getToolStats().doesSneakBypassUse(); } @@ -538,7 +536,7 @@ private static ItemEnchantments joinEnchants(ItemStack stack, @NotNull ItemEncha return true; } - default void definition$fillItemCategory(CreativeModeTab category, @NotNull NonNullList items) { + default void definition$fillItemCategory(CreativeModeTab category, NonNullList items) { if (isElectric()) { items.add(get(Integer.MAX_VALUE)); } else { @@ -546,8 +544,8 @@ private static ItemEnchantments joinEnchants(ItemStack stack, @NotNull ItemEncha } } - default void definition$appendHoverText(@NotNull ItemStack stack, @NotNull Item.TooltipContext context, - @NotNull List tooltip, TooltipFlag flag) { + default void definition$appendHoverText(ItemStack stack, Item.TooltipContext context, + List tooltip, TooltipFlag flag) { if (!(stack.getItem() instanceof IGTTool tool)) return; IGTToolDefinition toolStats = tool.getToolStats(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/datacomponents/ToolBehaviors.java b/src/main/java/com/gregtechceu/gtceu/api/item/datacomponents/ToolBehaviors.java index 6db74617e84..7f04eac4091 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/datacomponents/ToolBehaviors.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/datacomponents/ToolBehaviors.java @@ -10,6 +10,7 @@ import net.minecraft.network.codec.StreamCodec; import com.mojang.serialization.Codec; +import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Unmodifiable; import java.util.Collections; @@ -44,7 +45,7 @@ public boolean hasBehavior(ToolBehaviorType type) { return behaviors.containsKey(type); } - public > T getBehavior(ToolBehaviorType type) { + public > @Nullable T getBehavior(ToolBehaviorType type) { return (T) this.behaviors.get(type); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/MaterialToolTier.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/MaterialToolTier.java index d8be8150d23..495d8792e13 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/MaterialToolTier.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/MaterialToolTier.java @@ -42,7 +42,7 @@ public float getAttackDamageBonus() { } @Override - public @NotNull TagKey getIncorrectBlocksForDrops() { + public TagKey getIncorrectBlocksForDrops() { return CustomTags.INCORRECT_TOOL_TIERS[property.getHarvestLevel()]; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java index 8c1c21e02e2..fc3d01e6dbd 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java @@ -146,7 +146,7 @@ public static boolean canUse(ItemStack stack) { return stack.getDamageValue() <= stack.getMaxDamage(); } - public static void damageItem(@NotNull ItemStack stack, @Nullable LivingEntity user, int damage) { + public static void damageItem(ItemStack stack, @Nullable LivingEntity user, int damage) { if (!(stack.getItem() instanceof IGTTool tool)) { if (user != null) stack.hurtAndBreak(damage, user, EquipmentSlot.MAINHAND); } else { @@ -504,8 +504,7 @@ public static BlockHitResult entityPickBlock(Entity entity, double hitDistance, * @param level the level in which the click happened * @param pos the position that was clicked */ - public static void onActionDone(@Nullable Player player, @NotNull ItemStack stack, - @NotNull Level level, @NotNull Vec3 pos) { + public static void onActionDone(@Nullable Player player, ItemStack stack, Level level, Vec3 pos) { IGTTool tool = (IGTTool) stack.getItem(); ToolHelper.damageItem(stack, player); if (tool.getSound() != null) { @@ -514,7 +513,6 @@ public static void onActionDone(@Nullable Player player, @NotNull ItemStack stac } } - @NotNull public static Set getToolTypes(final ItemStack tool) { Set types = new HashSet<>(); if (tool.getItem() instanceof IGTTool gtTool) { @@ -526,7 +524,6 @@ public static Set getToolTypes(final ItemStack tool) { return types; } - @NotNull public static Set getCraftingToolTypes(ItemStack tool) { Set types = new HashSet<>(); if (tool.getItem() instanceof IGTTool gtTool) { @@ -579,7 +576,7 @@ public static boolean isToolEffective(ItemStack stack, BlockState state) { * @param stack stack to be damaged * @param entity entity that has damaged this stack */ - public static void damageItemWhenCrafting(@NotNull ItemStack stack, @Nullable LivingEntity entity) { + public static void damageItemWhenCrafting(ItemStack stack, @Nullable LivingEntity entity) { int damage = 2; if (stack.getItem() instanceof IGTTool) { damage = ((IGTTool) stack.getItem()).getToolStats().getToolDamagePerCraft(stack); @@ -601,7 +598,7 @@ public static void damageItemWhenCrafting(@NotNull ItemStack stack, @Nullable Li * @param stack stack to be damaged * @param entity entity that has damaged this stack */ - public static void damageItem(@NotNull ItemStack stack, @Nullable LivingEntity entity) { + public static void damageItem(ItemStack stack, @Nullable LivingEntity entity) { damageItem(stack, entity, 1); } @@ -636,8 +633,7 @@ public static float getDestroySpeed(BlockState state, Set toolClasse * @param state the BlockState of the block * @return the silk touch drop */ - @NotNull - public static List getSilkTouchDrop(ServerLevel level, BlockPos origin, @NotNull BlockState state) { + public static List getSilkTouchDrop(ServerLevel level, BlockPos origin, BlockState state) { ItemStack tool = GTMaterialItems.TOOL_ITEMS.get(GTMaterials.Neutronium, GTToolType.PICKAXE).get().get(); // oh wow, this exists now. cool! EnchantmentHelper.enchantItemFromProvider( diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java index 750c7afbe53..84e0bc68a51 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java @@ -595,7 +595,7 @@ private LinkedList getBlocksToMine() { * @param values to find the mean of * @return the mean value */ - private static long mean(@NotNull long[] values) { + private static long mean(long @NotNull [] values) { if (values.length == 0L) return 0L; From 2185339ad81be02b172c139a3b6d36ce393cdf68 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 24 Jan 2026 16:30:30 +0200 Subject: [PATCH 10/10] spotless --- .../java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java | 5 ++--- .../gtceu/common/item/tool/ToolEventHandlers.java | 3 --- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java index fc3d01e6dbd..a7b9bcb20c4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java @@ -49,7 +49,6 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; -import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.Item; @@ -74,7 +73,6 @@ import it.unimi.dsi.fastutil.chars.CharSet; import it.unimi.dsi.fastutil.chars.CharSets; import lombok.experimental.ExtensionMethod; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnmodifiableView; @@ -189,7 +187,8 @@ public static void damageItem(ItemStack stack, @Nullable LivingEntity user, int if (user != null) { user.breakItem(stack); user.onEquippedItemBroken(stack.getItem(), - LivingEntity.getSlotForHand(user.isUsingItem() ? user.getUsedItemHand() : InteractionHand.MAIN_HAND)); + LivingEntity.getSlotForHand( + user.isUsingItem() ? user.getUsedItemHand() : InteractionHand.MAIN_HAND)); } stack.shrink(1); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/ToolEventHandlers.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/ToolEventHandlers.java index 973bb7d3fcc..eed4d04b610 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/ToolEventHandlers.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/ToolEventHandlers.java @@ -35,10 +35,7 @@ import net.neoforged.neoforge.event.entity.player.PlayerDestroyItemEvent; import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; -import org.jetbrains.annotations.NotNull; - import java.util.ArrayList; -import java.util.Collection; import java.util.Iterator; import java.util.List;