Inspired by 2020's April Fools' 20w14infinite Snapshot, this mod brings endless randomly generated dimensions into Minecraft.
1package net.lerariemann.infinity.item;
2
3import net.lerariemann.infinity.InfinityMod;
4import net.lerariemann.infinity.block.entity.InfinityPortalBlockEntity;
5import net.lerariemann.infinity.options.PortalColorApplier;
6import net.lerariemann.infinity.registry.core.ModComponentTypes;
7import net.lerariemann.infinity.util.VersionMethods;
8import net.lerariemann.infinity.util.InfinityMethods;
9import net.minecraft.ChatFormatting;
10import net.minecraft.core.BlockPos;
11//? if >1.21 {
12import net.minecraft.core.component.DataComponentPatch;
13import net.minecraft.core.component.DataComponents;
14//?} else {
15/*import net.minecraft.nbt.CompoundTag;
16import net.minecraft.world.level.Level;
17*///?}
18import net.minecraft.network.chat.Component;
19import net.minecraft.network.chat.MutableComponent;
20import net.minecraft.resources.ResourceLocation;
21import net.minecraft.server.level.ServerLevel;
22import net.minecraft.world.entity.item.ItemEntity;
23import net.minecraft.world.item.Item;
24import net.minecraft.world.item.ItemStack;
25import net.minecraft.world.item.TooltipFlag;
26//? if >1.21.2 {
27import net.minecraft.world.item.component.CustomModelData;
28import net.minecraft.world.item.component.TooltipDisplay;
29//?}
30import org.jspecify.annotations.NonNull;
31
32import java.util.List;
33import java.util.Objects;
34import java.util.Optional;
35import java.util.function.Consumer;
36
37public class TransfiniteKeyItem extends Item implements PortalDataHolder.Destinable {
38 public TransfiniteKeyItem(Properties settings) {
39 super(settings);
40 }
41
42 //? if >1.21 {
43 @Override
44 public DataComponentPatch getPortalComponents(InfinityPortalBlockEntity ipbe) {
45 ResourceLocation id = ipbe.getDimension();
46 int color = (ipbe.getLevel() instanceof ServerLevel w) ?
47 PortalColorApplier.of(id, w.getServer()).apply(BlockPos.ZERO) :
48 (int)InfinityMethods.getNumericFromId(id);
49 return DataComponentPatch.builder()
50 .set(ModComponentTypes.DESTINATION.get(), id)
51 .set(ModComponentTypes.COLOR.get(), color & 0xFFFFFF)
52 //? if >1.21.4 {
53 .set(DataComponents.CUSTOM_MODEL_DATA, getDataForClientItem(id, color & 0xFFFFFF))
54 //?}
55 .build();
56 }
57
58 @Override
59 public Optional<DataComponentPatch> getIridComponents(ItemEntity entity) {
60 return Optional.of(DataComponentPatch.builder()
61 .remove(ModComponentTypes.DESTINATION.get())
62 .remove(ModComponentTypes.COLOR.get())
63 .build());
64 }
65 //?} else {
66 /*@Override
67 public CompoundTag getPortalComponents(InfinityPortalBlockEntity ipbe) {
68 ResourceLocation id = ipbe.getDimension();
69 int color = (ipbe.getLevel() instanceof ServerLevel w) ?
70 PortalColorApplier.of(id, w.getServer()).apply(BlockPos.ZERO) :
71 (int)InfinityMethods.getNumericFromId(id);
72 var c = new CompoundTag();
73 c.putString(ModComponentTypes.DESTINATION, id.toString());
74 c.putInt(ModComponentTypes.COLOR, color & 0xFFFFFF);
75 return c;
76 }
77
78 @Override
79 public Optional<CompoundTag> getIridComponents(ItemEntity entity) {
80 return Optional.of(new CompoundTag());
81 }
82 *///?}
83
84 @Override
85 public ResourceLocation getDestination(ItemStack stack) {
86 return Objects.requireNonNullElse(VersionMethods.getDimensionIdentifier(stack),
87 VersionMethods.id(InfinityMethods.ofRandomDim)); // no destination component -> randomize
88 }
89
90 @Override
91 public ItemStack getStack() {
92 return getDefaultInstance();
93 }
94
95 @Override
96 public void appendHoverText(ItemStack stack,
97 //? if >1.21 {
98 TooltipContext
99 //?} else {
100 /*Level
101 *///?}
102 context,
103 //? if >1.21.2 {
104 TooltipDisplay tooltipDisplay, Consumer<Component> tooltipAdder
105 //?} else {
106 /*List<Component> tooltip
107 *///?}
108 , TooltipFlag type) {
109 //? if >1.21.2 {
110 super.appendHoverText(stack, context, tooltipDisplay, tooltipAdder, type);
111 //?} else {
112 /*super.appendHoverText(stack, context, tooltip, type);
113 Consumer<Component> tooltipAdder = tooltip::add;
114 *///?}
115 ResourceLocation dimension = VersionMethods.getDimensionIdentifier(stack);
116 MutableComponent mutableText = (dimension != null)
117 ? InfinityMethods.getDimensionNameAsText(dimension)
118 : Component.translatable("tooltip.infinity.key.randomise");
119 tooltipAdder.accept(mutableText.withStyle(ChatFormatting.GRAY));
120 }
121
122 //? if >1.21.4 {
123 public CustomModelData getDataForClientItem(ItemStack stack) {
124 return getDataForClientItem(stack.getComponents().getOrDefault(ModComponentTypes.DESTINATION.get(), InfinityMethods.getId("random")), stack.getComponents().getOrDefault(ModComponentTypes.COLOR.get(), 0));
125 }
126
127 public CustomModelData getDataForClientItem(ResourceLocation dimension, int color) {
128 String data;
129 if (dimension.getPath().contains("generated")) {
130 data = "generated";
131 } else if (dimension.equals(ResourceLocation.withDefaultNamespace("end"))) {
132 data = "end";
133 } else if (dimension.equals(InfinityMethods.getId("pride"))) {
134 data = "pride";
135 } else if (InfinityMod.provider.easterizer.isEaster(dimension.getPath()) || !dimension.getNamespace().equals("infinity")) {
136 data = "golden";
137 } else {
138 data = "random";
139 }
140 return new CustomModelData(List.of(), List.of(), List.of(data), List.of(color));
141 }
142 //?}
143}