{"body":"package net.minecraftforge.registries;\n\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Random;\nimport java.util.Set;\n\nimport javax.annotation.Nullable;\n\nimport org.apache.commons.lang3.Validate;\n\nimport net.minecraft.util.ResourceLocation;\nimport net.minecraft.util.registry.RegistryNamespaced;\nimport net.minecraftforge.fml.common.registry.IForgeRegistryEntry;\n\npublic class NamespacedWrapper<V extends IForgeRegistryEntry<V>> extends RegistryNamespaced<ResourceLocation, V> implements ILockableRegistry\n{\n    private boolean locked = false;\n    private ForgeRegistry<V> delegate;\n\n    @Override\n    public void register(int id, ResourceLocation key, V value)\n    {\n        if (locked)\n            throw new IllegalStateException(\"Can not register to a locked registry. Modder should use Forge Register methods.\");\n\n        Validate.notNull(value);\n\n        if (value.getRegistryName() == null)\n            value.setRegistryName(key);\n\n        this.delegate.add(id, value);\n    }\n\n    @Override\n    public void putObject(ResourceLocation key, V value)\n    {\n        if (locked)\n            throw new IllegalStateException(\"Can not register to a locked registry. Modder should use Forge Register methods.\");\n\n        Validate.notNull(key);\n        Validate.notNull(value);\n\n        if (value.getRegistryName() == null)\n            value.setRegistryName(null);\n\n        this.delegate.add(-1, value);\n    }\n\n\n    // Reading Functions\n    @Override\n    @Nullable\n    public V getObject(@Nullable ResourceLocation name)\n    {\n        return this.delegate.getValue(name);\n    }\n\n    @Override\n    @Nullable\n    public ResourceLocation getNameForObject(V value)\n    {\n        return this.delegate.getKey(value);\n    }\n\n    @Override\n    public boolean containsKey(ResourceLocation key)\n    {\n        return this.delegate.containsKey(key);\n    }\n\n    @Override\n    public int getIDForObject(@Nullable V value)\n    {\n        return this.delegate.getID(value);\n    }\n\n    @Override\n    @Nullable\n    public V getObjectById(int id)\n    {\n        return this.delegate.getValue(id);\n    }\n\n    @Override\n    public Iterator<V> iterator()\n    {\n        return this.delegate.iterator();\n    }\n\n    @Override\n    public Set<ResourceLocation> getKeys()\n    {\n        return this.delegate.getKeys();\n    }\n\n    @Override\n    @Nullable\n    public V getRandomObject(Random random)\n    {\n        List<V> lst = this.delegate.getValues();\n        if (lst.isEmpty())\n            return null;\n        return lst.get(random.nextInt(lst.size()));\n    }\n\n    //internal\n    @Override //We override all public methods, this should be fine as null.\n    protected Map<ResourceLocation, V> createUnderlyingMap(){ return null; }\n\n    @Override\n    public void lock(){ this.locked = true; }\n}\n","name":"","extension":"txt","url":"https://www.irccloud.com/pastebin/rYJbwHOj","modified":1497653147,"id":"rYJbwHOj","size":2802,"lines":114,"own_paste":false,"theme":"","date":1497653147}