11package mekanism .common .tile ;
22
3+ import com .mojang .datafixers .util .Pair ;
4+ import com .mojang .serialization .DataResult ;
5+ import com .mojang .serialization .DataResult .Error ;
6+ import java .util .List ;
7+ import java .util .Optional ;
8+ import mekanism .common .Mekanism ;
9+ import mekanism .common .attachments .BlockData ;
10+ import mekanism .common .registries .MekanismDataComponents ;
311import mekanism .common .registries .MekanismTileEntityTypes ;
412import mekanism .common .tile .base .TileEntityUpdateable ;
513import net .minecraft .core .BlockPos ;
14+ import net .minecraft .core .HolderLookup ;
15+ import net .minecraft .core .component .DataComponentMap ;
16+ import net .minecraft .core .component .DataComponentType ;
17+ import net .minecraft .nbt .CompoundTag ;
18+ import net .minecraft .nbt .NbtOps ;
19+ import net .minecraft .nbt .Tag ;
620import net .minecraft .world .level .block .state .BlockState ;
21+ import org .jetbrains .annotations .NotNull ;
722
23+ //TODO: If we end up with more blocks where we care about the actual backing component, we should abstract some of this up into TileEntityUpdateable
824public class TileEntityCardboardBox extends TileEntityUpdateable {
925
1026 public TileEntityCardboardBox (BlockPos pos , BlockState state ) {
1127 super (MekanismTileEntityTypes .CARDBOARD_BOX , pos , state );
1228 }
29+
30+ @ Override
31+ public List <DataComponentType <?>> getRemapEntries () {
32+ List <DataComponentType <?>> remapEntries = super .getRemapEntries ();
33+ if (!remapEntries .contains (MekanismDataComponents .BLOCK_DATA .get ())) {
34+ remapEntries .add (MekanismDataComponents .BLOCK_DATA .get ());
35+ }
36+ return remapEntries ;
37+ }
38+
39+ @ NotNull
40+ @ Override
41+ public CompoundTag getReducedUpdateTag (@ NotNull HolderLookup .Provider provider ) {
42+ CompoundTag updateTag = super .getReducedUpdateTag (provider );
43+ DataComponentType <BlockData > componentType = MekanismDataComponents .BLOCK_DATA .get ();
44+ if (components ().has (componentType )) {
45+ DataResult <Tag > encoded = componentType .codecOrThrow ().encodeStart (
46+ provider .createSerializationContext (NbtOps .INSTANCE ), components ().get (componentType )
47+ );
48+ Optional <Error <Tag >> error = encoded .error ();
49+ if (error .isPresent ()) {
50+ Mekanism .logger .error ("Failed to encode cardboard box block data: {}" , error .get ().message ());
51+ } else {
52+ updateTag .put (MekanismDataComponents .BLOCK_DATA .getId ().toString (), encoded .getOrThrow ());
53+ }
54+ }
55+ return updateTag ;
56+ }
57+
58+ @ Override
59+ public void handleUpdateTag (@ NotNull CompoundTag tag , @ NotNull HolderLookup .Provider provider ) {
60+ super .handleUpdateTag (tag , provider );
61+ String key = MekanismDataComponents .BLOCK_DATA .getId ().toString ();
62+ if (tag .contains (key )) {
63+ DataComponentType <BlockData > componentType = MekanismDataComponents .BLOCK_DATA .get ();
64+ DataResult <Pair <BlockData , Tag >> decoded = componentType .codecOrThrow ().decode (
65+ provider .createSerializationContext (NbtOps .INSTANCE ), tag .get (key )
66+ );
67+ Optional <Error <Pair <BlockData , Tag >>> error = decoded .error ();
68+ if (error .isPresent ()) {
69+ Mekanism .logger .error ("Failed to decode cardboard box block data: {}" , error .get ().message ());
70+ } else {
71+ BlockData data = decoded .getOrThrow ().getFirst ();
72+ setComponents (DataComponentMap .builder ()
73+ .addAll (components ())
74+ .set (MekanismDataComponents .BLOCK_DATA , data )
75+ .build ());
76+ }
77+ }
78+ }
1379}
0 commit comments