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