22
33import java .util .Locale ;
44import java .util .Optional ;
5+ import java .util .function .Consumer ;
56
67import com .mojang .serialization .Codec ;
78import com .mojang .serialization .MapCodec ;
89import com .mojang .serialization .codecs .RecordCodecBuilder ;
910
11+ import net .minecraft .ChatFormatting ;
1012import net .minecraft .core .HolderLookup ;
13+ import net .minecraft .core .component .DataComponentGetter ;
1114import net .minecraft .network .RegistryFriendlyByteBuf ;
15+ import net .minecraft .network .chat .CommonComponents ;
16+ import net .minecraft .network .chat .Component ;
1217import net .minecraft .network .codec .StreamCodec ;
1318import net .minecraft .resources .ResourceKey ;
1419import net .minecraft .util .StringRepresentable ;
1520import net .minecraft .world .item .EitherHolder ;
21+ import net .minecraft .world .item .Item ;
22+ import net .minecraft .world .item .TooltipFlag ;
23+ import net .minecraft .world .item .component .TooltipProvider ;
1624import one .devos .nautical .losing_my_marbles .content .LosingMyMarblesRegistries ;
1725import one .devos .nautical .losing_my_marbles .content .marble .data .MarbleInstance ;
1826import one .devos .nautical .losing_my_marbles .content .marble .data .MarbleType ;
1927import one .devos .nautical .losing_my_marbles .framework .network .LosingMyMarblesStreamCodecs ;
2028
21- public sealed interface StoredMarble {
29+ public sealed interface StoredMarble extends TooltipProvider {
2230 Codec <StoredMarble > CODEC = StorageType .CODEC .dispatch (StoredMarble ::type , type -> type .codec );
2331 StreamCodec <RegistryFriendlyByteBuf , StoredMarble > STREAM_CODEC = StorageType .STREAM_CODEC .dispatch (StoredMarble ::type , type -> type .streamCodec );
2432
33+ Component TOOLTIP_HEADER = Component .translatable ("item.losing_my_marbles.stored_marble.tooltip" ).withStyle (ChatFormatting .GRAY );
34+ String INVALID_KEY = "item.losing_my_marbles.stored_marble.invalid" ;
35+
2536 Optional <MarbleInstance > get (HolderLookup .Provider registries );
2637
38+ Component nameForTooltip (HolderLookup .Provider registries );
39+
2740 StorageType type ();
2841
42+ @ Override
43+ default void addToTooltip (Item .TooltipContext context , Consumer <Component > output , TooltipFlag flag , DataComponentGetter components ) {
44+ output .accept (TOOLTIP_HEADER );
45+ output .accept (CommonComponents .space ().append (this .nameForTooltip (context .registries ())));
46+ }
47+
2948 record Type (EitherHolder <MarbleType > holder ) implements StoredMarble {
3049 public static final MapCodec <Type > CODEC = RecordCodecBuilder .mapCodec (i -> i .group (
3150 EitherHolder .codec (LosingMyMarblesRegistries .MARBLE_TYPE , MarbleType .CODEC ).fieldOf ("holder" ).forGetter (Type ::holder )
@@ -45,6 +64,16 @@ public Optional<MarbleInstance> get(HolderLookup.Provider registries) {
4564 return this .holder .unwrap (registries ).map (MarbleInstance ::new );
4665 }
4766
67+ @ Override
68+ public Component nameForTooltip (HolderLookup .Provider registries ) {
69+ return this .holder .contents ().map (
70+ holder -> holder .value ().name (),
71+ key -> registries .get (key )
72+ .map (holder -> holder .value ().name ())
73+ .orElseGet (() -> Component .translatable (INVALID_KEY ).withStyle (ChatFormatting .RED ))
74+ );
75+ }
76+
4877 @ Override
4978 public StorageType type () {
5079 return StorageType .TYPE ;
@@ -66,6 +95,11 @@ public Optional<MarbleInstance> get(HolderLookup.Provider registries) {
6695 return Optional .of (this .instance .copy ());
6796 }
6897
98+ @ Override
99+ public Component nameForTooltip (HolderLookup .Provider registries ) {
100+ return this .instance .type ().name ();
101+ }
102+
69103 @ Override
70104 public StorageType type () {
71105 return StorageType .INSTANCE ;
0 commit comments