/* * Copyright (c) Forge Development LLC and contributors * SPDX-License-Identifier: LGPL-2.1-only */ package net.minecraftforge.registries; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.OptionalInt; import java.util.Set; import java.util.function.Function; import java.util.stream.Stream; import com.mojang.serialization.DataResult; import net.minecraft.core.Holder; import net.minecraft.core.HolderSet; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.core.MappedRegistry; import net.minecraft.core.Registry; import net.minecraft.util.RandomSource; import org.apache.commons.lang3.Validate; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Lifecycle; import org.jetbrains.annotations.Nullable; class NamespacedWrapper extends MappedRegistry implements ILockableRegistry, IHolderHelperHolder { private static final Logger LOGGER = LogManager.getLogger(); private final ForgeRegistry delegate; private final NamespacedHolderHelper holders; private boolean locked = false; private Lifecycle elementsLifecycle = Lifecycle.experimental(); public NamespacedWrapper(ForgeRegistry owner, Function> holderLookup) { super(owner.getRegistryKey(), Lifecycle.experimental(), holderLookup); this.delegate = owner; this.holders = new NamespacedHolderHelper<>(owner, this, null, holderLookup); } @Override public Holder registerMapping(int id, ResourceKey key, T value, Lifecycle lifecycle) { if (locked) throw new IllegalStateException("Can not register to a locked registry. Modder should use Forge Register methods."); Validate.notNull(value); markKnown(); this.elementsLifecycle = this.elementsLifecycle.add(lifecycle); T oldValue = get(key); int realId = this.delegate.add(id, key.location(), value); if (realId != id && id != -1) LOGGER.warn("Registered object did not get ID it asked for. Name: {} Expected: {} Got: {}", key, id, realId); return this.holders.onAdded(RegistryManager.ACTIVE, realId, key, value, oldValue); } @Override public Holder register(ResourceKey key, T value, Lifecycle lifecycle) { return registerMapping(-1, key, value, lifecycle); } @Override public Holder registerOrOverride(OptionalInt id, ResourceKey key, T value, Lifecycle lifecycle) { int wanted = -1; if (id.isPresent() && byId(id.getAsInt()) != null) wanted = id.getAsInt(); return registerMapping(wanted, key, value, lifecycle); } // Reading Functions @Override @Nullable public T get(@Nullable ResourceLocation name) { return this.delegate.getRaw(name); //get without default } @Override public Optional getOptional(@Nullable ResourceLocation name) { return Optional.ofNullable( this.delegate.getRaw(name)); //get without default } @Override @Nullable public T get(@Nullable ResourceKey name) { return name == null ? null : this.delegate.getRaw(name.location()); //get without default } @Override @Nullable public ResourceLocation getKey(T value) { return this.delegate.getKey(value); } @Override public Optional> getResourceKey(T p_122755_) { return this.delegate.getResourceKey(p_122755_); } @Override public boolean containsKey(ResourceLocation key) { return this.delegate.containsKey(key); } @Override public boolean containsKey(ResourceKey key) { return this.delegate.getRegistryName().equals(key.registry()) && containsKey(key.location()); } @Override public int getId(@Nullable T value) { return this.delegate.getID(value); } @Override @Nullable public T byId(int id) { return this.delegate.getValue(id); } @Override public Lifecycle lifecycle(T value) { return Lifecycle.stable(); } @Override public Lifecycle elementsLifecycle() { return this.elementsLifecycle; } @Override public Iterator iterator() { return this.delegate.iterator(); } @Override public Set keySet() { return this.delegate.getKeys(); } @Override public Set> registryKeySet() { return this.delegate.getResourceKeys(); } @Override public Set, T>> entrySet() { return this.delegate.getEntries(); } @Override public boolean isEmpty() { return this.delegate.isEmpty(); } @Override public int size() { return this.delegate.size(); } @Override public NamespacedHolderHelper getHolderHelper() { return this.holders; } @Override public Optional> getHolder(int id) { return this.holders.getHolder(id); } @Override public Optional> getHolder(ResourceKey key) { return this.holders.getHolder(key); } @Override public DataResult> getOrCreateHolder(ResourceKey key) { return this.holders.getOrCreateHolder(key); } @Override public Holder getOrCreateHolderOrThrow(ResourceKey key) { return this.holders.getOrCreateHolderOrThrow(key); } @Override public Optional> getRandom(RandomSource rand) { return this.holders.getRandom(rand); } @Override public Stream> holders() { return this.holders.holders(); } @Override public boolean isKnownTagName(TagKey name) { return this.holders.isKnownTagName(name); } @Override public Stream, HolderSet.Named>> getTags() { return this.holders.getTags(); } @Override public HolderSet.Named getOrCreateTag(TagKey name) { return this.holders.getOrCreateTag(name); } @Override public Stream> getTagNames() { return this.holders.getTagNames(); } @Override public Registry freeze() { return this.holders.freeze(); } @Override public Holder.Reference createIntrusiveHolder(T value) { return this.holders.createIntrusiveHolder(value); } @Override public Optional> getTag(TagKey name) { return this.holders.getTag(name); } @Override public void bindTags(Map, List>> newTags) { this.holders.bindTags(newTags); } @Override public void resetTags() { this.holders.resetTags(); } @Deprecated @Override public void unfreeze() { this.holders.unfreeze(); } /** @deprecated Forge: For internal use only. Use the Register events when registering values. */ @Deprecated @Override public void lock(){ this.locked = true; } public static class Factory implements IForgeRegistry.CreateCallback, IForgeRegistry.AddCallback { public static final ResourceLocation ID = new ResourceLocation("forge", "registry_defaulted_wrapper"); @Override public void onCreate(IForgeRegistryInternal owner, RegistryManager stage) { ForgeRegistry fowner = (ForgeRegistry)owner; owner.setSlaveMap(ID, new NamespacedWrapper(fowner, fowner.getBuilder().getVanillaHolder())); } @Override @SuppressWarnings("unchecked") public void onAdd(IForgeRegistryInternal owner, RegistryManager stage, int id, ResourceKey key, V value, V oldValue) { owner.getSlaveMap(ID, NamespacedWrapper.class).holders.onAdded(stage, id, key, value, oldValue); } } }