package org.bukkit.craftbukkit; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.function.BiFunction; import java.util.stream.Stream; import net.minecraft.core.IRegistry; import net.minecraft.core.IRegistryCustom; import org.bukkit.Keyed; import org.bukkit.NamespacedKey; import org.bukkit.Registry; import org.bukkit.craftbukkit.generator.strucutre.CraftStructure; import org.bukkit.craftbukkit.generator.strucutre.CraftStructureType; import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.generator.structure.Structure; import org.bukkit.generator.structure.StructureType; public class CraftRegistry implements Registry { public static Registry createRegistry(Class bukkitClass, IRegistryCustom registryHolder) { if (bukkitClass == Structure.class) { return new CraftRegistry<>(registryHolder.registryOrThrow(IRegistry.STRUCTURE_REGISTRY), CraftStructure::new); } if (bukkitClass == StructureType.class) { return new CraftRegistry<>(IRegistry.STRUCTURE_TYPES, CraftStructureType::new); } return null; } private final Map cache = new HashMap<>(); private final IRegistry minecraftRegistry; private final BiFunction minecraftToBukkit; public CraftRegistry(IRegistry minecraftRegistry, BiFunction minecraftToBukkit) { this.minecraftRegistry = minecraftRegistry; this.minecraftToBukkit = minecraftToBukkit; } @Override public B get(NamespacedKey namespacedKey) { B cached = cache.get(namespacedKey); if (cached != null) { return cached; } B bukkit = createBukkit(namespacedKey, minecraftRegistry.getOptional(CraftNamespacedKey.toMinecraft(namespacedKey)).orElse(null)); if (bukkit == null) { return null; } cache.put(namespacedKey, bukkit); return bukkit; } @Override public Iterator iterator() { return values().iterator(); } public B createBukkit(NamespacedKey namespacedKey, M minecraft) { if (minecraft == null) { return null; } return minecraftToBukkit.apply(namespacedKey, minecraft); } public Stream values() { return minecraftRegistry.keySet().stream().map(minecraftKey -> get(CraftNamespacedKey.fromMinecraft(minecraftKey))); } }