Inspired by 2020's April Fools' 20w14infinite Snapshot, this mod brings endless randomly generated dimensions into Minecraft.
at master 143 lines 6.0 kB view raw
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}