Skip to content

Commit 08dc08b

Browse files
committed
Replace appendHoverText with component-based tooltips
We have several items (e.g. ComputerItem), which only exist for their custom tooltip implementation. We remove these, and replace them vanilla-style component-based tooltips (TooltipProvider). The implementation here is a little janky — as the vanilla list of components is hard-coded, and neither mod loader offers a way to extend it. For now we just use the generic mod-loader tooltip hook — this probably would be easier with a mixin, but let's do things Properly. It would be nice to fully remove DiskItem (we only keep this around for doesSneakBypassUse), but that can be a future task.
1 parent 8f4d403 commit 08dc08b

File tree

21 files changed

+114
-196
lines changed

21 files changed

+114
-196
lines changed

projects/common/src/client/java/dan200/computercraft/client/ClientRegistry.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import dan200.computercraft.shared.computer.core.ComputerState;
2626
import dan200.computercraft.shared.computer.core.ServerContext;
2727
import dan200.computercraft.shared.computer.inventory.AbstractComputerMenu;
28-
import dan200.computercraft.shared.media.items.DiskItem;
2928
import dan200.computercraft.shared.turtle.TurtleOverlay;
3029
import net.minecraft.Util;
3130
import net.minecraft.client.Minecraft;
@@ -164,7 +163,7 @@ public static void registerExtraModels(Consumer<ResourceLocation> register, Coll
164163

165164
public static void registerItemColours(BiConsumer<ItemColor, ItemLike> register) {
166165
register.accept(
167-
(stack, layer) -> layer == 1 ? DiskItem.getColour(stack) : -1,
166+
(stack, layer) -> layer == 1 ? DyedItemColor.getOrDefault(stack, Colour.WHITE.getARGB()) : -1,
168167
ModRegistry.Items.DISK.get()
169168
);
170169

projects/common/src/client/java/dan200/computercraft/client/integration/jei/JEIComputerCraft.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import dan200.computercraft.api.turtle.TurtleSide;
99
import dan200.computercraft.shared.ModRegistry;
1010
import dan200.computercraft.shared.integration.RecipeModHelpers;
11-
import dan200.computercraft.shared.media.items.DiskItem;
1211
import dan200.computercraft.shared.pocket.items.PocketComputerItem;
1312
import dan200.computercraft.shared.turtle.items.TurtleItem;
1413
import mezz.jei.api.IModPlugin;
@@ -23,6 +22,7 @@
2322
import net.minecraft.core.RegistryAccess;
2423
import net.minecraft.resources.ResourceLocation;
2524
import net.minecraft.world.item.ItemStack;
25+
import net.minecraft.world.item.component.DyedItemColor;
2626

2727
import java.util.List;
2828

@@ -100,7 +100,7 @@ public void onRuntimeAvailable(IJeiRuntime runtime) {
100100
/**
101101
* Distinguishes disks by colour.
102102
*/
103-
private static final IIngredientSubtypeInterpreter<ItemStack> diskSubtype = (stack, ctx) -> Integer.toString(DiskItem.getColour(stack));
103+
private static final IIngredientSubtypeInterpreter<ItemStack> diskSubtype = (stack, ctx) -> Integer.toString(DyedItemColor.getOrDefault(stack, -1));
104104

105105
private static RegistryAccess getRegistryAccess() {
106106
return Minecraft.getInstance().level.registryAccess();

projects/common/src/main/java/dan200/computercraft/shared/CommonHooks.java

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@
1313
import dan200.computercraft.shared.peripheral.monitor.MonitorWatcher;
1414
import dan200.computercraft.shared.util.DropConsumer;
1515
import dan200.computercraft.shared.util.TickScheduler;
16+
import net.minecraft.core.component.DataComponentType;
17+
import net.minecraft.core.component.DataComponents;
1618
import net.minecraft.core.registries.Registries;
19+
import net.minecraft.network.chat.Component;
1720
import net.minecraft.resources.ResourceKey;
1821
import net.minecraft.resources.ResourceLocation;
1922
import net.minecraft.server.MinecraftServer;
@@ -25,9 +28,8 @@
2528
import net.minecraft.world.InteractionResult;
2629
import net.minecraft.world.entity.Entity;
2730
import net.minecraft.world.entity.player.Player;
28-
import net.minecraft.world.item.CreativeModeTab;
29-
import net.minecraft.world.item.CreativeModeTabs;
30-
import net.minecraft.world.item.ItemStack;
31+
import net.minecraft.world.item.*;
32+
import net.minecraft.world.item.component.TooltipProvider;
3133
import net.minecraft.world.level.Level;
3234
import net.minecraft.world.level.block.Blocks;
3335
import net.minecraft.world.level.block.LecternBlock;
@@ -40,8 +42,10 @@
4042
import net.minecraft.world.phys.BlockHitResult;
4143
import org.jspecify.annotations.Nullable;
4244

45+
import java.util.List;
4346
import java.util.Set;
4447
import java.util.function.BiConsumer;
48+
import java.util.function.Consumer;
4549

4650
/**
4751
* Event listeners for server/common code.
@@ -163,4 +167,42 @@ public static void onBuildCreativeTab(ResourceKey<CreativeModeTab> key, Creative
163167
out.accept(ModRegistry.Items.COMPUTER_COMMAND.get());
164168
}
165169
}
170+
171+
public static void onItemTooltip(ItemStack stack, Item.TooltipContext context, TooltipFlag flags, List<Component> out) {
172+
var appender = new TooltipAppender(out);
173+
addToTooltip(stack, ModRegistry.DataComponents.PRINTOUT.get(), context, appender, flags);
174+
addToTooltip(stack, ModRegistry.DataComponents.TREASURE_DISK.get(), context, appender, flags);
175+
176+
// Disk and computer IDs require some conditional logic, so we don't bother using TooltipProvider.
177+
178+
var diskId = stack.get(ModRegistry.DataComponents.DISK_ID.get());
179+
if (diskId != null && flags.isAdvanced()) diskId.addToTooltip("gui.computercraft.tooltip.disk_id", appender);
180+
181+
var computerId = stack.get(ModRegistry.DataComponents.COMPUTER_ID.get());
182+
if (computerId != null && (flags.isAdvanced() || !stack.has(DataComponents.CUSTOM_NAME))) {
183+
computerId.addToTooltip("gui.computercraft.tooltip.computer_id", appender);
184+
}
185+
}
186+
187+
/**
188+
* Inserts additional tooltip items directly after the custom name, rather than at the very end.
189+
*/
190+
private static final class TooltipAppender implements Consumer<Component> {
191+
private final List<Component> out;
192+
private int index = 1;
193+
194+
private TooltipAppender(List<Component> out) {
195+
this.out = out;
196+
}
197+
198+
@Override
199+
public void accept(Component component) {
200+
out.add(index++, component);
201+
}
202+
}
203+
204+
private static <T extends TooltipProvider> void addToTooltip(ItemStack stack, DataComponentType<T> component, Item.TooltipContext context, Consumer<Component> out, TooltipFlag flags) {
205+
var provider = stack.get(component);
206+
if (provider != null) provider.addToTooltip(context, out, flags);
207+
}
166208
}

projects/common/src/main/java/dan200/computercraft/shared/ModRegistry.java

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@
3535
import dan200.computercraft.shared.computer.core.ComputerFamily;
3636
import dan200.computercraft.shared.computer.core.ServerComputer;
3737
import dan200.computercraft.shared.computer.inventory.ComputerMenuWithoutInventory;
38-
import dan200.computercraft.shared.computer.items.ComputerItem;
39-
import dan200.computercraft.shared.computer.items.CommandComputerItem;
4038
import dan200.computercraft.shared.computer.items.ServerComputerReference;
4139
import dan200.computercraft.shared.config.Config;
4240
import dan200.computercraft.shared.data.BlockNamedEntityLootCondition;
@@ -112,10 +110,7 @@
112110
import net.minecraft.network.codec.StreamCodec;
113111
import net.minecraft.world.flag.FeatureFlags;
114112
import net.minecraft.world.inventory.MenuType;
115-
import net.minecraft.world.item.BlockItem;
116-
import net.minecraft.world.item.CreativeModeTab;
117-
import net.minecraft.world.item.Item;
118-
import net.minecraft.world.item.ItemStack;
113+
import net.minecraft.world.item.*;
119114
import net.minecraft.world.item.component.DyedItemColor;
120115
import net.minecraft.world.item.crafting.CustomRecipe;
121116
import net.minecraft.world.item.crafting.Recipe;
@@ -262,9 +257,9 @@ private static <B extends Block, I extends Item> RegistryEntry<I> ofBlock(Regist
262257
return REGISTRY.register(parent.id().getPath(), () -> supplier.apply(parent.get(), properties()));
263258
}
264259

265-
public static final RegistryEntry<ComputerItem> COMPUTER_NORMAL = ofBlock(Blocks.COMPUTER_NORMAL, ComputerItem::new);
266-
public static final RegistryEntry<ComputerItem> COMPUTER_ADVANCED = ofBlock(Blocks.COMPUTER_ADVANCED, ComputerItem::new);
267-
public static final RegistryEntry<ComputerItem> COMPUTER_COMMAND = ofBlock(Blocks.COMPUTER_COMMAND, CommandComputerItem::new);
260+
public static final RegistryEntry<BlockItem> COMPUTER_NORMAL = ofBlock(Blocks.COMPUTER_NORMAL, BlockItem::new);
261+
public static final RegistryEntry<BlockItem> COMPUTER_ADVANCED = ofBlock(Blocks.COMPUTER_ADVANCED, BlockItem::new);
262+
public static final RegistryEntry<GameMasterBlockItem> COMPUTER_COMMAND = ofBlock(Blocks.COMPUTER_COMMAND, GameMasterBlockItem::new);
268263

269264
public static final RegistryEntry<PocketComputerItem> POCKET_COMPUTER_NORMAL = REGISTRY.register("pocket_computer_normal",
270265
() -> new PocketComputerItem(properties().stacksTo(1), ComputerFamily.NORMAL));
@@ -276,8 +271,8 @@ private static <B extends Block, I extends Item> RegistryEntry<I> ofBlock(Regist
276271

277272
public static final RegistryEntry<DiskItem> DISK =
278273
REGISTRY.register("disk", () -> new DiskItem(properties().stacksTo(1)));
279-
public static final RegistryEntry<TreasureDiskItem> TREASURE_DISK =
280-
REGISTRY.register("treasure_disk", () -> new TreasureDiskItem(properties().stacksTo(1)));
274+
public static final RegistryEntry<DiskItem> TREASURE_DISK =
275+
REGISTRY.register("treasure_disk", () -> new DiskItem(properties().stacksTo(1)));
281276

282277
private static Item.Properties printoutProperties() {
283278
return properties().stacksTo(1).component(DataComponents.PRINTOUT.get(), PrintoutData.EMPTY);
@@ -315,20 +310,13 @@ private static <T> RegistryEntry<DataComponentType<T>> register(String name, Una
315310

316311
/**
317312
* The id of a computer.
318-
*
319-
* @see ComputerItem
320-
* @see PocketComputerItem
321313
*/
322314
public static final RegistryEntry<DataComponentType<NonNegativeId>> COMPUTER_ID = register("computer_id", b -> b
323315
.persistent(NonNegativeId.CODEC).networkSynchronized(NonNegativeId.STREAM_CODEC)
324316
);
325317

326318
/**
327319
* The storage capacity of a computer or disk.
328-
*
329-
* @see ComputerItem
330-
* @see PocketComputerItem
331-
* @see DiskItem
332320
*/
333321
public static final RegistryEntry<DataComponentType<StorageCapacity>> STORAGE_CAPACITY = register("storage_capacity", b -> b
334322
.persistent(StorageCapacity.CODEC).networkSynchronized(StorageCapacity.STREAM_CODEC)
@@ -397,18 +385,13 @@ private static <T> RegistryEntry<DataComponentType<T>> register(String name, Una
397385

398386
/**
399387
* Information about a treasure disk's mount.
400-
*
401-
* @see TreasureDiskItem
402-
* @see TreasureDisk
403388
*/
404389
public static final RegistryEntry<DataComponentType<TreasureDisk>> TREASURE_DISK = register("treasure_disk", b -> b
405390
.persistent(TreasureDisk.CODEC).networkSynchronized(TreasureDisk.STREAM_CODEC)
406391
);
407392

408393
/**
409394
* The id of a disk.
410-
*
411-
* @see DiskItem
412395
*/
413396
public static final RegistryEntry<DataComponentType<NonNegativeId>> DISK_ID = register("disk_id", b -> b
414397
.persistent(NonNegativeId.CODEC).networkSynchronized(NonNegativeId.STREAM_CODEC)

projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/CommandComputerBlock.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
* permission.
1717
*
1818
* @param <T> The type of the computer block entity.
19-
* @see dan200.computercraft.shared.computer.items.CommandComputerItem
2019
*/
2120
public class CommandComputerBlock<T extends ComputerBlockEntity> extends ComputerBlock<T> implements GameMasterBlock {
2221
private static final MapCodec<CommandComputerBlock<?>> CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group(

projects/common/src/main/java/dan200/computercraft/shared/computer/items/CommandComputerItem.java

Lines changed: 0 additions & 29 deletions
This file was deleted.

projects/common/src/main/java/dan200/computercraft/shared/computer/items/ComputerItem.java

Lines changed: 0 additions & 33 deletions
This file was deleted.

projects/common/src/main/java/dan200/computercraft/shared/media/MountMedia.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@
88
import dan200.computercraft.api.filesystem.Mount;
99
import dan200.computercraft.api.media.IMedia;
1010
import dan200.computercraft.shared.ModRegistry;
11-
import dan200.computercraft.shared.computer.items.ComputerItem;
1211
import dan200.computercraft.shared.config.ConfigSpec;
13-
import dan200.computercraft.shared.media.items.DiskItem;
1412
import dan200.computercraft.shared.util.DataComponentUtil;
1513
import dan200.computercraft.shared.util.NonNegativeId;
1614
import dan200.computercraft.shared.util.StorageCapacity;
@@ -27,12 +25,12 @@
2725
*/
2826
public final class MountMedia implements IMedia {
2927
/**
30-
* A {@link MountMedia} implementation for {@linkplain ComputerItem computers}.
28+
* A {@link MountMedia} implementation for {@linkplain ModRegistry.DataComponents#COMPUTER_ID computers}.
3129
*/
3230
public static final IMedia COMPUTER = new MountMedia("computer", ModRegistry.DataComponents.COMPUTER_ID, false, ConfigSpec.computerSpaceLimit);
3331

3432
/**
35-
* A {@link MountMedia} implementation for {@linkplain DiskItem disks}.
33+
* A {@link MountMedia} implementation for {@linkplain ModRegistry.Items#DISK disks}.
3634
*/
3735
public static final IMedia DISK = new MountMedia("disk", ModRegistry.DataComponents.DISK_ID, true, ConfigSpec.floppySpaceLimit);
3836

Lines changed: 6 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,27 @@
1-
// Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission.
1+
// SPDX-FileCopyrightText: 2025 The CC: Tweaked Developers
22
//
3-
// SPDX-License-Identifier: LicenseRef-CCPL
3+
// SPDX-License-Identifier: MPL-2.0
44

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

77
import dan200.computercraft.annotations.ForgeOverride;
8-
import dan200.computercraft.core.util.Colour;
9-
import dan200.computercraft.shared.ModRegistry;
10-
import dan200.computercraft.shared.util.NonNegativeId;
11-
import net.minecraft.ChatFormatting;
8+
import dan200.computercraft.shared.peripheral.diskdrive.DiskDriveBlock;
129
import net.minecraft.core.BlockPos;
13-
import net.minecraft.network.chat.Component;
1410
import net.minecraft.world.entity.player.Player;
1511
import net.minecraft.world.item.Item;
1612
import net.minecraft.world.item.ItemStack;
17-
import net.minecraft.world.item.TooltipFlag;
18-
import net.minecraft.world.item.component.DyedItemColor;
1913
import net.minecraft.world.level.LevelReader;
2014

21-
import java.util.List;
22-
15+
/**
16+
* An item that can be shift-right-clicked into a {@link DiskDriveBlock}.
17+
*/
2318
public class DiskItem extends Item {
2419
public DiskItem(Properties settings) {
2520
super(settings);
2621
}
2722

28-
@Override
29-
public void appendHoverText(ItemStack stack, TooltipContext context, List<Component> list, TooltipFlag options) {
30-
if (options.isAdvanced()) {
31-
var id = stack.get(ModRegistry.DataComponents.DISK_ID.get());
32-
if (id != null) {
33-
list.add(Component.translatable("gui.computercraft.tooltip.disk_id", id.id())
34-
.withStyle(ChatFormatting.GRAY));
35-
}
36-
}
37-
}
38-
3923
@ForgeOverride
4024
public boolean doesSneakBypassUse(ItemStack stack, LevelReader world, BlockPos pos, Player player) {
4125
return true;
4226
}
43-
44-
public static int getDiskID(ItemStack stack) {
45-
return NonNegativeId.getId(stack.get(ModRegistry.DataComponents.DISK_ID.get()));
46-
}
47-
48-
public static int getColour(ItemStack stack) {
49-
return DyedItemColor.getOrDefault(stack, Colour.WHITE.getARGB());
50-
}
5127
}

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,16 @@
1212
import dan200.computercraft.shared.ModRegistry;
1313
import io.netty.buffer.ByteBuf;
1414
import net.minecraft.core.component.DataComponentHolder;
15+
import net.minecraft.network.chat.Component;
1516
import net.minecraft.network.codec.ByteBufCodecs;
1617
import net.minecraft.network.codec.StreamCodec;
18+
import net.minecraft.world.item.Item;
19+
import net.minecraft.world.item.TooltipFlag;
20+
import net.minecraft.world.item.component.TooltipProvider;
1721

1822
import java.util.Arrays;
1923
import java.util.List;
24+
import java.util.function.Consumer;
2025
import java.util.stream.Stream;
2126

2227
/**
@@ -27,7 +32,7 @@
2732
* @see PrintoutItem
2833
* @see dan200.computercraft.shared.ModRegistry.DataComponents#PRINTOUT
2934
*/
30-
public record PrintoutData(String title, List<Line> lines) implements PrintoutContents {
35+
public record PrintoutData(String title, List<Line> lines) implements PrintoutContents, TooltipProvider {
3136
public static final int LINE_LENGTH = 25;
3237
public static final int LINES_PER_PAGE = 21;
3338
public static final int MAX_PAGES = 16;
@@ -71,6 +76,11 @@ public record PrintoutData(String title, List<Line> lines) implements PrintoutCo
7176
PrintoutData::new
7277
);
7378

79+
@Override
80+
public void addToTooltip(Item.TooltipContext context, Consumer<Component> out, TooltipFlag flag) {
81+
if (!title().isEmpty()) out.accept(Component.literal(title()));
82+
}
83+
7484
/**
7585
* A single line on our printed pages.
7686
*

0 commit comments

Comments
 (0)