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.jetbrains.annotations.NotNull;
31
32//? if neoforge {
33/*import javax.annotation.ParametersAreNonnullByDefault;
34*///?}
35import java.util.List;
36import java.util.Objects;
37import java.util.Optional;
38import java.util.function.Consumer;
39
40//? if neoforge {
41/*@ParametersAreNonnullByDefault
42*///?}
43public class TransfiniteKeyItem extends Item implements PortalDataHolder.Destinable {
44 public TransfiniteKeyItem(Properties settings) {
45 super(settings);
46 }
47
48 //? if >1.21 {
49 @Override
50 public DataComponentPatch getPortalComponents(InfinityPortalBlockEntity ipbe) {
51 ResourceLocation id = ipbe.getDimension();
52 int color = (ipbe.getLevel() instanceof ServerLevel w) ?
53 PortalColorApplier.of(id, w.getServer()).apply(BlockPos.ZERO) :
54 (int)InfinityMethods.getNumericFromId(id);
55 return DataComponentPatch.builder()
56 .set(ModComponentTypes.DESTINATION.get(), id)
57 .set(ModComponentTypes.COLOR.get(), color & 0xFFFFFF)
58 //? if >1.21.4 {
59 .set(DataComponents.CUSTOM_MODEL_DATA, getDataForClientItem(id, color & 0xFFFFFF))
60 //?}
61 .build();
62 }
63
64 @Override
65 public Optional<DataComponentPatch> getIridComponents(ItemEntity entity) {
66 return Optional.of(DataComponentPatch.builder()
67 .remove(ModComponentTypes.DESTINATION.get())
68 .remove(ModComponentTypes.COLOR.get())
69 .build());
70 }
71 //?} else {
72 /*@Override
73 public CompoundTag getPortalComponents(InfinityPortalBlockEntity ipbe) {
74 ResourceLocation id = ipbe.getDimension();
75 int color = (ipbe.getLevel() instanceof ServerLevel w) ?
76 PortalColorApplier.of(id, w.getServer()).apply(BlockPos.ZERO) :
77 (int)InfinityMethods.getNumericFromId(id);
78 var c = new CompoundTag();
79 c.putString(ModComponentTypes.DESTINATION, id.toString());
80 c.putInt(ModComponentTypes.COLOR, color & 0xFFFFFF);
81 return c;
82 }
83
84 @Override
85 public Optional<CompoundTag> getIridComponents(ItemEntity entity) {
86 return Optional.of(new CompoundTag());
87 }
88 *///?}
89
90 @NotNull
91 @Override
92 public ResourceLocation getDestination(ItemStack stack) {
93 return Objects.requireNonNullElse(VersionMethods.getDimensionIdentifier(stack),
94 VersionMethods.id(InfinityMethods.ofRandomDim)); // no destination component -> randomize
95 }
96
97 @Override
98 public ItemStack getStack() {
99 return getDefaultInstance();
100 }
101
102 @Override
103 public void appendHoverText(ItemStack stack,
104 //? if >1.21 {
105 TooltipContext
106 //?} else {
107 /*Level
108 *///?}
109 context,
110 //? if >1.21.2 {
111 TooltipDisplay tooltipDisplay, Consumer<Component> tooltipAdder
112 //?} else {
113 /*List<Component> tooltip
114 *///?}
115 , TooltipFlag type) {
116 //? if >1.21.2 {
117 super.appendHoverText(stack, context, tooltipDisplay, tooltipAdder, type);
118 //?} else {
119 /*super.appendHoverText(stack, context, tooltip, type);
120 Consumer<Component> tooltipAdder = tooltip::add;
121 *///?}
122 ResourceLocation dimension = VersionMethods.getDimensionIdentifier(stack);
123 MutableComponent mutableText = (dimension != null)
124 ? InfinityMethods.getDimensionNameAsText(dimension)
125 : Component.translatable("tooltip.infinity.key.randomise");
126 tooltipAdder.accept(mutableText.withStyle(ChatFormatting.GRAY));
127 }
128
129 //? if >1.21.4 {
130 public CustomModelData getDataForClientItem(ItemStack stack) {
131 return getDataForClientItem(stack.getComponents().getOrDefault(ModComponentTypes.DESTINATION.get(), InfinityMethods.getId("random")), stack.getComponents().getOrDefault(ModComponentTypes.COLOR.get(), 0));
132 }
133
134 public CustomModelData getDataForClientItem(ResourceLocation dimension, int color) {
135 String data;
136 if (dimension.getPath().contains("generated")) {
137 data = "generated";
138 } else if (dimension.equals(ResourceLocation.withDefaultNamespace("end"))) {
139 data = "end";
140 } else if (dimension.equals(InfinityMethods.getId("pride"))) {
141 data = "pride";
142 } else if (InfinityMod.provider.easterizer.isEaster(dimension.getPath()) || !dimension.getNamespace().equals("infinity")) {
143 data = "golden";
144 } else {
145 data = "random";
146 }
147 return new CustomModelData(List.of(), List.of(), List.of(data), List.of(color));
148 }
149 //?}
150}