Skip to content

Commit b1a980f

Browse files
authored
* Fix FabricMC#363 * Add newlines before/after `:::` * Test latest Add ItemTooltipCallback and ComponentTooltipAppenderRegistry references * 1.21.10 * 1.21.8 (I hope this works) * spotlessApply Why am I doing this manually * Credit myself (lol) * spotlessApply on the other two versions
1 parent 54fcb23 commit b1a980f

File tree

15 files changed

+204
-0
lines changed

15 files changed

+204
-0
lines changed

develop/items/custom-data-components.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ title: Custom Data Components
33
description: Learn how to add custom data to your items using the new 1.20.5 component system.
44
authors:
55
- Romejanic
6+
- ekulxam
67
---
78

89
As your items grow more complex, you may find yourself needing to store custom data associated with each item. The game allows you to store persistent data within an `ItemStack`, and as of 1.20.5 the way we do that is by using **Data Components**.
@@ -78,6 +79,22 @@ public void appendHoverText(ItemStack stack, TooltipContext context, TooltipDisp
7879
}
7980
```
8081

82+
::: warning
83+
84+
As of 1.21.5, `appendHoverText` has been deprecated. It is now recommended to implement `TooltipProvider` as such. This will require the [creation of a custom component class](#advanced-data-components).
85+
86+
@[code transcludeWith=::1](@/reference/latest/src/main/java/com/example/docs/component/ComponentWithTooltip.java)
87+
88+
Then, you can register the `TooltipProvider` via `ComponentTooltipAppenderRegistry`. This is called in `onInitialize` in the `ModInitializer`.
89+
90+
@[code lang=java transcludeWith=#tooltip_provider](@/reference/latest/src/main/java/com/example/docs/ExampleMod.java)
91+
92+
Alternatively, you can use `ItemTooltipCallback` to replace `appendHoverText`. This is called in `onInitializeClient` in the `ClientModInitializer`.
93+
94+
@[code lang=java transcludeWith=#tooltip_provider_client](@/reference/latest/src/client/java/com/example/docs/ExampleModClient.java)
95+
96+
:::
97+
8198
Don't forget to update your lang file (`/assets/example-mod/lang/en_us.json`) and add these two lines:
8299

83100
```json

reference/1.21.10/src/client/java/com/example/docs/ExampleModClient.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package com.example.docs;
22

3+
import net.minecraft.ChatFormatting;
34
import net.minecraft.client.particle.EndRodParticle;
5+
import net.minecraft.network.chat.Component;
46

57
import net.fabricmc.api.ClientModInitializer;
8+
import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback;
69
import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry;
710

11+
import com.example.docs.component.ModComponents;
12+
813
public class ExampleModClient implements ClientModInitializer {
914
@Override
1015
public void onInitializeClient() {
@@ -14,5 +19,12 @@ public void onInitializeClient() {
1419
// For this example, we will use the end rod particle behaviour.
1520
ParticleFactoryRegistry.getInstance().register(ExampleMod.SPARKLE_PARTICLE, EndRodParticle.Provider::new);
1621
// #particle_register_client
22+
23+
// #tooltip_provider_client
24+
ItemTooltipCallback.EVENT.register((stack, context, type, tooltip) -> {
25+
int count = stack.get(ModComponents.CLICK_COUNT_COMPONENT);
26+
tooltip.add(Component.translatable("item.example-mod.counter.info", count).withStyle(ChatFormatting.GOLD));
27+
});
28+
// #tooltip_provider_client
1729
}
1830
}

reference/1.21.10/src/main/java/com/example/docs/ExampleMod.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44
import org.slf4j.LoggerFactory;
55

66
import net.minecraft.core.Registry;
7+
import net.minecraft.core.component.DataComponents;
78
import net.minecraft.core.particles.SimpleParticleType;
89
import net.minecraft.core.registries.BuiltInRegistries;
910
import net.minecraft.resources.ResourceLocation;
1011

1112
import net.fabricmc.api.ModInitializer;
13+
import net.fabricmc.fabric.api.item.v1.ComponentTooltipAppenderRegistry;
1214
import net.fabricmc.fabric.api.particle.v1.FabricParticleTypes;
1315

16+
import com.example.docs.component.ModComponents;
17+
1418
//#entrypoint
1519
public class ExampleMod implements ModInitializer {
1620
// This logger is used to write text to the console and the log file.
@@ -40,5 +44,9 @@ public void onInitialize() {
4044
Registry.register(BuiltInRegistries.PARTICLE_TYPE, ResourceLocation.fromNamespaceAndPath(MOD_ID, "sparkle_particle"), SPARKLE_PARTICLE);
4145
//#particle_register_main
4246
//#entrypoint
47+
48+
// #tooltip_provider
49+
ComponentTooltipAppenderRegistry.addAfter(DataComponents.DAMAGE, ModComponents.COMPONENT_WITH_TOOLTIP);
50+
// #tooltip_provider
4351
}
4452
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.example.docs.component;
2+
3+
import java.util.function.Consumer;
4+
5+
import com.mojang.serialization.Codec;
6+
7+
import net.minecraft.ChatFormatting;
8+
import net.minecraft.core.component.DataComponentGetter;
9+
import net.minecraft.network.chat.Component;
10+
import net.minecraft.world.item.Item.TooltipContext;
11+
import net.minecraft.world.item.TooltipFlag;
12+
import net.minecraft.world.item.component.TooltipProvider;
13+
14+
//::1
15+
public record ComponentWithTooltip(int clickCount) implements TooltipProvider {
16+
//::1
17+
public static final Codec<ComponentWithTooltip> CODEC = Codec.INT.xmap(ComponentWithTooltip::new, ComponentWithTooltip::clickCount);
18+
19+
//::1
20+
@Override
21+
public void addToTooltip(TooltipContext tooltip, Consumer<Component> textConsumer, TooltipFlag type, DataComponentGetter components) {
22+
textConsumer.accept(Component.translatable("item.example-mod.counter.info", this.clickCount).withStyle(ChatFormatting.GOLD));
23+
}
24+
}
25+
//::1

reference/1.21.10/src/main/java/com/example/docs/component/ModComponents.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ public class ModComponents {
2121
);
2222
//::2
2323

24+
public static final DataComponentType<ComponentWithTooltip> COMPONENT_WITH_TOOLTIP = Registry.register(
25+
BuiltInRegistries.DATA_COMPONENT_TYPE,
26+
ResourceLocation.fromNamespaceAndPath(ExampleMod.MOD_ID, "click_count_with_tooltip"),
27+
DataComponentType.<ComponentWithTooltip>builder().persistent(ComponentWithTooltip.CODEC).build()
28+
);
29+
2430
//::3
2531
public static final DataComponentType<MyCustomComponent> MY_CUSTOM_COMPONENT = Registry.register(
2632
BuiltInRegistries.DATA_COMPONENT_TYPE,

reference/1.21.8/src/client/java/com/example/docs/FabricDocsReferenceClient.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package com.example.docs;
22

33
import net.minecraft.client.particle.EndRodParticle;
4+
import net.minecraft.text.Text;
5+
import net.minecraft.util.Formatting;
46

57
import net.fabricmc.api.ClientModInitializer;
8+
import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback;
69
import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry;
710

11+
import com.example.docs.component.ModComponents;
12+
813
public class FabricDocsReferenceClient implements ClientModInitializer {
914
@Override
1015
public void onInitializeClient() {
@@ -14,5 +19,12 @@ public void onInitializeClient() {
1419
// For this example, we will use the end rod particle behaviour.
1520
ParticleFactoryRegistry.getInstance().register(FabricDocsReference.SPARKLE_PARTICLE, EndRodParticle.Factory::new);
1621
// #particle_register_client
22+
23+
// #tooltip_provider_client
24+
ItemTooltipCallback.EVENT.register((stack, context, type, tooltip) -> {
25+
int count = stack.get(ModComponents.CLICK_COUNT_COMPONENT);
26+
tooltip.add(Text.translatable("item.fabric-docs-reference.counter.info", count).formatted(Formatting.GOLD));
27+
});
28+
// #tooltip_provider_client
1729
}
1830
}

reference/1.21.8/src/main/java/com/example/docs/FabricDocsReference.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,18 @@
33
import org.slf4j.Logger;
44
import org.slf4j.LoggerFactory;
55

6+
import net.minecraft.component.DataComponentTypes;
67
import net.minecraft.particle.SimpleParticleType;
78
import net.minecraft.registry.Registries;
89
import net.minecraft.registry.Registry;
910
import net.minecraft.util.Identifier;
1011

1112
import net.fabricmc.api.ModInitializer;
13+
import net.fabricmc.fabric.api.item.v1.ComponentTooltipAppenderRegistry;
1214
import net.fabricmc.fabric.api.particle.v1.FabricParticleTypes;
1315

16+
import com.example.docs.component.ModComponents;
17+
1418
//#entrypoint
1519
public class FabricDocsReference implements ModInitializer {
1620
// This logger is used to write text to the console and the log file.
@@ -40,5 +44,9 @@ public void onInitialize() {
4044
Registry.register(Registries.PARTICLE_TYPE, Identifier.of(MOD_ID, "sparkle_particle"), SPARKLE_PARTICLE);
4145
//#particle_register_main
4246
//#entrypoint
47+
48+
// #tooltip_provider
49+
ComponentTooltipAppenderRegistry.addAfter(DataComponentTypes.DAMAGE, ModComponents.COMPONENT_WITH_TOOLTIP);
50+
// #tooltip_provider
4351
}
4452
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.example.docs.component;
2+
3+
import java.util.function.Consumer;
4+
5+
import com.mojang.serialization.Codec;
6+
7+
import net.minecraft.component.ComponentsAccess;
8+
import net.minecraft.item.Item;
9+
import net.minecraft.item.tooltip.TooltipAppender;
10+
import net.minecraft.item.tooltip.TooltipType;
11+
import net.minecraft.text.Text;
12+
import net.minecraft.util.Formatting;
13+
14+
//::1
15+
public record ComponentWithTooltip(int clickCount) implements TooltipAppender {
16+
//::1
17+
public static final Codec<ComponentWithTooltip> CODEC = Codec.INT.xmap(ComponentWithTooltip::new, ComponentWithTooltip::clickCount);
18+
19+
//::1
20+
@Override
21+
public void appendTooltip(Item.TooltipContext context, Consumer<Text> textConsumer, TooltipType type, ComponentsAccess components) {
22+
textConsumer.accept(Text.translatable("item.fabric-docs-reference.counter.info", this.clickCount).formatted(Formatting.GOLD));
23+
}
24+
}
25+
//::1

reference/1.21.8/src/main/java/com/example/docs/component/ModComponents.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ public class ModComponents {
2121
);
2222
//::2
2323

24+
public static final ComponentType<ComponentWithTooltip> COMPONENT_WITH_TOOLTIP = Registry.register(
25+
Registries.DATA_COMPONENT_TYPE,
26+
Identifier.of(FabricDocsReference.MOD_ID, "click_count_with_tooltip"),
27+
ComponentType.<ComponentWithTooltip>builder().codec(ComponentWithTooltip.CODEC).build()
28+
);
29+
2430
//::3
2531
public static final ComponentType<MyCustomComponent> MY_CUSTOM_COMPONENT = Registry.register(
2632
Registries.DATA_COMPONENT_TYPE,

reference/latest/src/client/java/com/example/docs/ExampleModClient.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package com.example.docs;
22

3+
import net.minecraft.ChatFormatting;
34
import net.minecraft.client.particle.EndRodParticle;
5+
import net.minecraft.network.chat.Component;
46

57
import net.fabricmc.api.ClientModInitializer;
8+
import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback;
69
import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry;
710

11+
import com.example.docs.component.ModComponents;
12+
813
public class ExampleModClient implements ClientModInitializer {
914
@Override
1015
public void onInitializeClient() {
@@ -14,5 +19,12 @@ public void onInitializeClient() {
1419
// For this example, we will use the end rod particle behaviour.
1520
ParticleFactoryRegistry.getInstance().register(ExampleMod.SPARKLE_PARTICLE, EndRodParticle.Provider::new);
1621
// #particle_register_client
22+
23+
// #tooltip_provider_client
24+
ItemTooltipCallback.EVENT.register((stack, context, type, tooltip) -> {
25+
int count = stack.get(ModComponents.CLICK_COUNT_COMPONENT);
26+
tooltip.add(Component.translatable("item.example-mod.counter.info", count).withStyle(ChatFormatting.GOLD));
27+
});
28+
// #tooltip_provider_client
1729
}
1830
}

0 commit comments

Comments
 (0)