Skip to content

Commit 27f2ab3

Browse files
committed
Clean up disk <-> drive right clicking
Oh dear. I'd originally set out to *remove* logic from DiskItem — we're so close to being able to remove this item in 1.21! However, while looking at this code, I realised I could remove the whole Forge-specific doesSneakBypassUse. We now remove the use hook on the block, and override useOn on the item. Obvious in retrospect!
1 parent 5a43273 commit 27f2ab3

File tree

5 files changed

+29
-66
lines changed

5 files changed

+29
-66
lines changed

projects/common/src/main/java/dan200/computercraft/shared/media/items/DiskItem.java

+6-7
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,18 @@
44

55
package dan200.computercraft.shared.media.items;
66

7-
import dan200.computercraft.annotations.ForgeOverride;
87
import dan200.computercraft.core.util.Colour;
98
import dan200.computercraft.shared.ModRegistry;
109
import dan200.computercraft.shared.common.IColouredItem;
10+
import dan200.computercraft.shared.peripheral.diskdrive.DiskDriveBlock;
1111
import net.minecraft.ChatFormatting;
12-
import net.minecraft.core.BlockPos;
1312
import net.minecraft.network.chat.Component;
14-
import net.minecraft.world.entity.player.Player;
13+
import net.minecraft.world.InteractionResult;
1514
import net.minecraft.world.item.Item;
1615
import net.minecraft.world.item.ItemStack;
1716
import net.minecraft.world.item.TooltipFlag;
17+
import net.minecraft.world.item.context.UseOnContext;
1818
import net.minecraft.world.level.Level;
19-
import net.minecraft.world.level.LevelReader;
2019
import org.jspecify.annotations.Nullable;
2120

2221
import java.util.List;
@@ -47,9 +46,9 @@ public void appendHoverText(ItemStack stack, @Nullable Level world, List<Compone
4746
}
4847
}
4948

50-
@ForgeOverride
51-
public boolean doesSneakBypassUse(ItemStack stack, LevelReader world, BlockPos pos, Player player) {
52-
return true;
49+
@Override
50+
public InteractionResult useOn(UseOnContext context) {
51+
return DiskDriveBlock.defaultUseItemOn(context);
5352
}
5453

5554
public static int getDiskID(ItemStack stack) {

projects/common/src/main/java/dan200/computercraft/shared/media/items/TreasureDiskItem.java

+6-7
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,16 @@
44

55
package dan200.computercraft.shared.media.items;
66

7-
import dan200.computercraft.annotations.ForgeOverride;
87
import dan200.computercraft.core.util.Colour;
98
import dan200.computercraft.shared.ModRegistry;
10-
import net.minecraft.core.BlockPos;
9+
import dan200.computercraft.shared.peripheral.diskdrive.DiskDriveBlock;
1110
import net.minecraft.network.chat.Component;
12-
import net.minecraft.world.entity.player.Player;
11+
import net.minecraft.world.InteractionResult;
1312
import net.minecraft.world.item.Item;
1413
import net.minecraft.world.item.ItemStack;
1514
import net.minecraft.world.item.TooltipFlag;
15+
import net.minecraft.world.item.context.UseOnContext;
1616
import net.minecraft.world.level.Level;
17-
import net.minecraft.world.level.LevelReader;
1817
import org.jspecify.annotations.Nullable;
1918

2019
import java.util.List;
@@ -34,9 +33,9 @@ public void appendHoverText(ItemStack stack, @Nullable Level world, List<Compone
3433
if (!label.isEmpty()) list.add(Component.literal(label));
3534
}
3635

37-
@ForgeOverride
38-
public boolean doesSneakBypassUse(ItemStack stack, LevelReader world, BlockPos pos, Player player) {
39-
return true;
36+
@Override
37+
public InteractionResult useOn(UseOnContext context) {
38+
return DiskDriveBlock.defaultUseItemOn(context);
4039
}
4140

4241
public static ItemStack create(String subPath, int colourIndex) {

projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDriveBlock.java

+17-14
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@
66

77
import dan200.computercraft.shared.ModRegistry;
88
import dan200.computercraft.shared.common.HorizontalContainerBlock;
9-
import dan200.computercraft.shared.platform.PlatformHelper;
109
import net.minecraft.core.BlockPos;
1110
import net.minecraft.core.Direction;
12-
import net.minecraft.world.InteractionHand;
1311
import net.minecraft.world.InteractionResult;
14-
import net.minecraft.world.entity.player.Player;
12+
import net.minecraft.world.item.Item;
13+
import net.minecraft.world.item.context.UseOnContext;
1514
import net.minecraft.world.level.Level;
1615
import net.minecraft.world.level.block.BaseEntityBlock;
1716
import net.minecraft.world.level.block.Block;
@@ -21,7 +20,6 @@
2120
import net.minecraft.world.level.block.state.BlockState;
2221
import net.minecraft.world.level.block.state.StateDefinition;
2322
import net.minecraft.world.level.block.state.properties.EnumProperty;
24-
import net.minecraft.world.phys.BlockHitResult;
2523
import org.jspecify.annotations.Nullable;
2624

2725
public class DiskDriveBlock extends HorizontalContainerBlock {
@@ -42,21 +40,26 @@ protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockSt
4240
properties.add(FACING, STATE);
4341
}
4442

45-
@Override
46-
@Deprecated
47-
public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
48-
if (player.isCrouching() && level.getBlockEntity(pos) instanceof DiskDriveBlockEntity drive) {
49-
// Try to put a disk into the drive
50-
var disk = player.getItemInHand(hand);
51-
if (disk.isEmpty()) return InteractionResult.PASS;
43+
/**
44+
* A default implementation of {@link Item#useOn(UseOnContext)} for items that can be placed into a drive.
45+
*
46+
* @param context The context of this item usage action.
47+
* @return Whether the item was placed or not.
48+
*/
49+
public static InteractionResult defaultUseItemOn(UseOnContext context) {
50+
if (context.getPlayer() == null || !context.getPlayer().isSecondaryUseActive()) return InteractionResult.PASS;
5251

53-
if (!level.isClientSide && drive.getDiskStack().isEmpty() && PlatformHelper.get().getMedia(disk) != null) {
54-
drive.setDiskStack(disk.split(1));
52+
var level = context.getLevel();
53+
var blockPos = context.getClickedPos();
54+
var blockState = level.getBlockState(blockPos);
55+
if (blockState.is(ModRegistry.Blocks.DISK_DRIVE.get()) && blockState.getValue(STATE) == DiskDriveState.EMPTY) {
56+
if (!level.isClientSide && level.getBlockEntity(blockPos) instanceof DiskDriveBlockEntity drive && drive.getDiskStack().isEmpty()) {
57+
drive.setDiskStack(context.getItemInHand().split(1));
5558
}
5659
return InteractionResult.sidedSuccess(level.isClientSide);
5760
}
5861

59-
return super.use(state, level, pos, player, hand, hit);
62+
return InteractionResult.PASS;
6063
}
6164

6265
@Nullable

projects/fabric/src/main/java/dan200/computercraft/shared/ComputerCraft.java

-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
2626
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
2727
import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents;
28-
import net.fabricmc.fabric.api.event.player.UseBlockCallback;
2928
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
3029
import net.fabricmc.fabric.api.lookup.v1.block.BlockApiLookup;
3130
import net.fabricmc.fabric.api.lookup.v1.item.ItemApiLookup;
@@ -87,7 +86,6 @@ public static void init() {
8786
ServerChunkEvents.CHUNK_UNLOAD.register((l, c) -> CommonHooks.onServerChunkUnload(c));
8887

8988
PlayerBlockBreakEvents.BEFORE.register(FabricCommonHooks::onBlockDestroy);
90-
UseBlockCallback.EVENT.register(FabricCommonHooks::useOnBlock);
9189

9290
LootTableEvents.MODIFY.register((resourceManager, lootManager, id, tableBuilder, source) -> {
9391
var pool = CommonHooks.getExtraLootPool(id);

projects/fabric/src/main/java/dan200/computercraft/shared/FabricCommonHooks.java

-36
Original file line numberDiff line numberDiff line change
@@ -4,52 +4,16 @@
44

55
package dan200.computercraft.shared;
66

7-
import dan200.computercraft.shared.media.items.DiskItem;
8-
import dan200.computercraft.shared.media.items.TreasureDiskItem;
97
import dan200.computercraft.shared.peripheral.modem.wired.CableBlock;
108
import net.minecraft.core.BlockPos;
11-
import net.minecraft.server.level.ServerPlayer;
12-
import net.minecraft.server.level.ServerPlayerGameMode;
13-
import net.minecraft.world.InteractionHand;
14-
import net.minecraft.world.InteractionResult;
159
import net.minecraft.world.entity.player.Player;
16-
import net.minecraft.world.item.ItemStack;
1710
import net.minecraft.world.level.Level;
1811
import net.minecraft.world.level.block.entity.BlockEntity;
1912
import net.minecraft.world.level.block.state.BlockState;
20-
import net.minecraft.world.phys.BlockHitResult;
2113
import org.jspecify.annotations.Nullable;
2214

2315
public class FabricCommonHooks {
2416
public static boolean onBlockDestroy(Level level, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity) {
2517
return !(state.getBlock() instanceof CableBlock cable) || !cable.onCustomDestroyBlock(state, level, pos, player);
2618
}
27-
28-
/**
29-
* Allow placing disks/treasure disks into disk drives by clicking on them.
30-
*
31-
* @param player The player placing the block.
32-
* @param level The current level.
33-
* @param hand The player's hand.
34-
* @param hitResult The hit collision.
35-
* @return Whether this interaction succeeded.
36-
* @see ServerPlayerGameMode#useItemOn(ServerPlayer, Level, ItemStack, InteractionHand, BlockHitResult) The original source of this logic.
37-
*/
38-
public static InteractionResult useOnBlock(Player player, Level level, InteractionHand hand, BlockHitResult hitResult) {
39-
if (player.isSpectator()) return InteractionResult.PASS;
40-
41-
var block = level.getBlockState(hitResult.getBlockPos());
42-
if (block.getBlock() != ModRegistry.Blocks.DISK_DRIVE.get()) return InteractionResult.PASS;
43-
44-
if (player.isSecondaryUseActive() && doesSneakBypassUse(player.getMainHandItem()) && doesSneakBypassUse(player.getOffhandItem())) {
45-
var result = block.use(level, player, hand, hitResult);
46-
if (result.consumesAction()) return result;
47-
}
48-
49-
return InteractionResult.PASS;
50-
}
51-
52-
private static boolean doesSneakBypassUse(ItemStack stack) {
53-
return stack.isEmpty() || stack.getItem() instanceof DiskItem || stack.getItem() instanceof TreasureDiskItem;
54-
}
5519
}

0 commit comments

Comments
 (0)