Inspired by 2020's April Fools' 20w14infinite Snapshot, this mod brings endless randomly generated dimensions into Minecraft.
1package net.lerariemann.infinity.options;
2
3import net.lerariemann.infinity.util.VersionMethods;
4import net.lerariemann.infinity.util.core.NbtUtils;
5import net.minecraft.core.Holder;
6import net.minecraft.core.registries.BuiltInRegistries;
7import net.minecraft.core.registries.Registries;
8import net.minecraft.nbt.CompoundTag;
9import net.minecraft.resources.ResourceKey;
10import net.minecraft.server.level.ServerPlayer;
11import net.minecraft.world.effect.InstantenousMobEffect;
12import net.minecraft.world.effect.MobEffect;
13import net.minecraft.world.effect.MobEffectInstance;
14
15import java.util.Optional;
16
17public record EffectGiver(Holder<MobEffect> id, int duration, int amplifier, int cooldown) {
18 public static Holder<MobEffect> effectOf(String id) {
19 Optional<Holder.Reference<MobEffect>> entry = BuiltInRegistries.MOB_EFFECT
20 //? if >1.21.2 {
21 .get(ResourceKey.create(Registries.MOB_EFFECT, VersionMethods.id(id)));
22 //?} else {
23 /*.getHolder(ResourceKey.create(Registries.MOB_EFFECT, VersionMethods.id(id)));
24 *///?}
25 if (entry.isEmpty() || entry.get().value() instanceof InstantenousMobEffect) return null;
26 return entry.get();
27 }
28
29 public static EffectGiver of(CompoundTag data) {
30 if (data.contains("id")) return new EffectGiver(effectOf(NbtUtils.getString(data, "id")),
31 NbtUtils.getInt(data, "duration", 300),
32 NbtUtils.getInt(data, "amplifier", 0),
33 Math.min(NbtUtils.getInt(data, "cooldown", 100), 100));
34 return new EffectGiver(null, 0,0,200);
35 }
36
37 public void tryGiveEffect(ServerPlayer player) {
38 if (!isEmpty() && player.level().getGameTime() % cooldown == 0) {
39 player.addEffect(new MobEffectInstance(id
40 //? if <1.21
41 /*.value()*/
42 , duration, amplifier));
43 }
44 }
45
46 public boolean isEmpty() {
47 return id == null;
48 }
49}