package net.minecraft.core; import com.mojang.serialization.Lifecycle; import java.util.Optional; import net.minecraft.resources.Identifier; import net.minecraft.resources.ResourceKey; import net.minecraft.util.RandomSource; import org.jspecify.annotations.Nullable; public class DefaultedMappedRegistry extends MappedRegistry implements DefaultedRegistry { private final Identifier defaultKey; private Holder.Reference defaultValue; public DefaultedMappedRegistry( final String defaultKey, final ResourceKey> key, final Lifecycle lifecycle, final boolean intrusiveHolders ) { super(key, lifecycle, intrusiveHolders); this.defaultKey = Identifier.parse(defaultKey); } @Override public Holder.Reference register(final ResourceKey key, final T value, final RegistrationInfo registrationInfo) { Holder.Reference result = super.register(key, value, registrationInfo); if (this.defaultKey.equals(key.identifier())) { this.defaultValue = result; } return result; } @Override public int getId(@Nullable final T thing) { int id = super.getId(thing); return id == -1 ? super.getId(this.defaultValue.value()) : id; } @Override public Identifier getKey(final T thing) { Identifier k = super.getKey(thing); return k == null ? this.defaultKey : k; } @Override public T getValue(@Nullable final Identifier key) { T t = super.getValue(key); return t == null ? this.defaultValue.value() : t; } @Override public Optional getOptional(@Nullable final Identifier key) { return Optional.ofNullable(super.getValue(key)); } @Override public Optional> getAny() { return Optional.ofNullable(this.defaultValue); } @Override public T byId(final int id) { T t = super.byId(id); return t == null ? this.defaultValue.value() : t; } @Override public Optional> getRandom(final RandomSource random) { return super.getRandom(random).or(() -> Optional.of(this.defaultValue)); } @Override public Identifier getDefaultKey() { return this.defaultKey; } }