package net.minecraft.core; import com.mojang.serialization.Lifecycle; import java.util.Optional; import net.minecraft.core.Holder.Reference; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.RandomSource; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class DefaultedMappedRegistry extends MappedRegistry implements DefaultedRegistry { private final ResourceLocation defaultKey; private Reference defaultValue; public DefaultedMappedRegistry(String defaultKey, ResourceKey> key, Lifecycle registryLifecycle, boolean hasIntrusiveHolders) { super(key, registryLifecycle, hasIntrusiveHolders); this.defaultKey = ResourceLocation.parse(defaultKey); } @Override public Reference register(ResourceKey key, T value, RegistrationInfo registrationInfo) { Reference reference = super.register(key, value, registrationInfo); if (this.defaultKey.equals(key.location())) { this.defaultValue = reference; } return reference; } @Override public int getId(@Nullable T value) { int i = super.getId(value); return i == -1 ? super.getId(this.defaultValue.value()) : i; } @NotNull @Override public ResourceLocation getKey(T value) { ResourceLocation resourceLocation = super.getKey(value); return resourceLocation == null ? this.defaultKey : resourceLocation; } @NotNull @Override public T getValue(@Nullable ResourceLocation key) { T object = super.getValue(key); return object == null ? this.defaultValue.value() : object; } @Override public Optional getOptional(@Nullable ResourceLocation name) { return Optional.ofNullable(super.getValue(name)); } @Override public Optional> getAny() { return Optional.ofNullable(this.defaultValue); } @NotNull @Override public T byId(int id) { T object = super.byId(id); return object == null ? this.defaultValue.value() : object; } @Override public Optional> getRandom(RandomSource random) { return super.getRandom(random).or(() -> Optional.of(this.defaultValue)); } @Override public ResourceLocation getDefaultKey() { return this.defaultKey; } }