From d605cd50280fe1f1d6422a58d2555011ed5e1ad5 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Mon, 28 Dec 2020 17:17:31 +0800 Subject: [PATCH] Add RegistrySupplier to ease registry delegation --- .../architectury/registry/Registry.java | 17 ++- .../registry/RegistrySupplier.java | 83 +++++++++++ .../registry/fabric/RegistriesImpl.java | 53 ++++++- .../registry/forge/RegistriesImpl.java | 133 ++++++++++++++++-- 4 files changed, 271 insertions(+), 15 deletions(-) create mode 100644 common/src/main/java/me/shedaniel/architectury/registry/RegistrySupplier.java diff --git a/common/src/main/java/me/shedaniel/architectury/registry/Registry.java b/common/src/main/java/me/shedaniel/architectury/registry/Registry.java index c8f2c1b6..536ae8d4 100644 --- a/common/src/main/java/me/shedaniel/architectury/registry/Registry.java +++ b/common/src/main/java/me/shedaniel/architectury/registry/Registry.java @@ -21,6 +21,7 @@ package me.shedaniel.architectury.registry; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Map; @@ -29,9 +30,21 @@ import java.util.Set; import java.util.function.Supplier; public interface Registry extends Iterable { - Supplier delegate(ResourceLocation id); + @NotNull + default Supplier delegate(ResourceLocation id) { + return delegateSupplied(id); + } - Supplier register(ResourceLocation id, Supplier supplier); + @NotNull + RegistrySupplier delegateSupplied(ResourceLocation id); + + @NotNull + default Supplier register(ResourceLocation id, Supplier supplier) { + return registerSupplied(id, supplier); + } + + @NotNull + RegistrySupplier registerSupplied(ResourceLocation id, Supplier supplier); @Nullable ResourceLocation getId(T obj); diff --git a/common/src/main/java/me/shedaniel/architectury/registry/RegistrySupplier.java b/common/src/main/java/me/shedaniel/architectury/registry/RegistrySupplier.java new file mode 100644 index 00000000..014e9f68 --- /dev/null +++ b/common/src/main/java/me/shedaniel/architectury/registry/RegistrySupplier.java @@ -0,0 +1,83 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020 shedaniel + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package me.shedaniel.architectury.registry; + +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; +import java.util.function.Consumer; +import java.util.function.Supplier; +import java.util.stream.Stream; + +public interface RegistrySupplier extends Supplier { + @NotNull + ResourceLocation getRegistryId(); + + @NotNull + ResourceLocation getId(); + + boolean isPresent(); + + @Nullable + default T getOrNull() { + if (isPresent()) { + return get(); + } + return null; + } + + @NotNull + default Optional toOptional() { + return Optional.ofNullable(getOrNull()); + } + + default void ifPresent(Consumer action) { + if (isPresent()) { + action.accept(get()); + } + } + + default void ifPresentOrElse(Consumer action, Runnable emptyAction) { + if (isPresent()) { + action.accept(get()); + } else { + emptyAction.run(); + } + } + + @NotNull + default Stream stream() { + if (!isPresent()) { + return Stream.empty(); + } else { + return Stream.of(get()); + } + } + + default T orElse(T other) { + return isPresent() ? get() : other; + } + + default T orElseGet(Supplier supplier) { + return isPresent() ? get() : supplier.get(); + } +} diff --git a/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/RegistriesImpl.java b/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/RegistriesImpl.java index 66d9b255..7e6bdfad 100644 --- a/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/RegistriesImpl.java +++ b/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/RegistriesImpl.java @@ -19,15 +19,20 @@ package me.shedaniel.architectury.registry.fabric; +import com.google.common.base.Objects; import me.shedaniel.architectury.registry.Registries; import me.shedaniel.architectury.registry.Registry; +import me.shedaniel.architectury.registry.RegistrySupplier; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.LazyLoadedValue; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.Iterator; +import java.util.Map; +import java.util.Optional; +import java.util.Set; import java.util.function.Supplier; public class RegistriesImpl { @@ -69,15 +74,53 @@ public class RegistriesImpl { } @Override - public Supplier delegate(ResourceLocation id) { + public @NotNull RegistrySupplier delegateSupplied(ResourceLocation id) { LazyLoadedValue value = new LazyLoadedValue<>(() -> get(id)); - return value::get; + return new RegistrySupplier() { + @Override + public @NotNull ResourceLocation getRegistryId() { + return delegate.key().location(); + } + + @Override + public @NotNull ResourceLocation getId() { + return id; + } + + @Override + public boolean isPresent() { + return contains(id); + } + + @Override + public T get() { + return value.get(); + } + + @Override + public int hashCode() { + return Objects.hashCode(getRegistryId(), getId()); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (!(obj instanceof RegistrySupplier)) return false; + RegistrySupplier other = (RegistrySupplier) obj; + return other.getRegistryId().equals(getRegistryId()) && other.getId().equals(getId()); + } + + @Override + public String toString() { + return getRegistryId().toString() + "@" + id.toString(); + } + }; } @Override - public Supplier register(ResourceLocation id, Supplier supplier) { + public @NotNull RegistrySupplier registerSupplied(ResourceLocation id, Supplier supplier) { net.minecraft.core.Registry.register(delegate, id, supplier.get()); - return delegate(id); + return delegateSupplied(id); } @Override diff --git a/forge/src/main/java/me/shedaniel/architectury/registry/forge/RegistriesImpl.java b/forge/src/main/java/me/shedaniel/architectury/registry/forge/RegistriesImpl.java index 0b268c69..ae999099 100644 --- a/forge/src/main/java/me/shedaniel/architectury/registry/forge/RegistriesImpl.java +++ b/forge/src/main/java/me/shedaniel/architectury/registry/forge/RegistriesImpl.java @@ -19,11 +19,13 @@ package me.shedaniel.architectury.registry.forge; +import com.google.common.base.Objects; import com.google.common.collect.HashBasedTable; import com.google.common.collect.Table; import me.shedaniel.architectury.platform.forge.EventBuses; import me.shedaniel.architectury.registry.Registries; import me.shedaniel.architectury.registry.Registry; +import me.shedaniel.architectury.registry.RegistrySupplier; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.LazyLoadedValue; @@ -34,6 +36,7 @@ import net.minecraftforge.fml.RegistryObject; import net.minecraftforge.registries.IForgeRegistry; import net.minecraftforge.registries.IForgeRegistryEntry; import net.minecraftforge.registries.RegistryManager; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; import java.lang.reflect.Type; @@ -106,15 +109,53 @@ public class RegistriesImpl { } @Override - public Supplier delegate(ResourceLocation id) { + public @NotNull RegistrySupplier delegateSupplied(ResourceLocation id) { LazyLoadedValue value = new LazyLoadedValue<>(() -> get(id)); - return value::get; + return new RegistrySupplier() { + @Override + public @NotNull ResourceLocation getRegistryId() { + return delegate.key().location(); + } + + @Override + public @NotNull ResourceLocation getId() { + return id; + } + + @Override + public boolean isPresent() { + return contains(id); + } + + @Override + public T get() { + return value.get(); + } + + @Override + public int hashCode() { + return Objects.hashCode(getRegistryId(), getId()); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (!(obj instanceof RegistrySupplier)) return false; + RegistrySupplier other = (RegistrySupplier) obj; + return other.getRegistryId().equals(getRegistryId()) && other.getId().equals(getId()); + } + + @Override + public String toString() { + return getRegistryId().toString() + "@" + id.toString(); + } + }; } @Override - public Supplier register(ResourceLocation id, Supplier supplier) { + public @NotNull RegistrySupplier registerSupplied(ResourceLocation id, Supplier supplier) { net.minecraft.core.Registry.register(delegate, id, supplier.get()); - return delegate(id); + return delegateSupplied(id); } @Override @@ -175,16 +216,92 @@ public class RegistriesImpl { } @Override - public Supplier delegate(ResourceLocation id) { + public @NotNull RegistrySupplier delegateSupplied(ResourceLocation id) { LazyLoadedValue value = new LazyLoadedValue<>(() -> get(id)); - return value::get; + return new RegistrySupplier() { + @Override + public @NotNull ResourceLocation getRegistryId() { + return delegate.getRegistryName(); + } + + @Override + public @NotNull ResourceLocation getId() { + return id; + } + + @Override + public boolean isPresent() { + return contains(id); + } + + @Override + public T get() { + return value.get(); + } + + @Override + public int hashCode() { + return Objects.hashCode(getRegistryId(), getId()); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (!(obj instanceof RegistrySupplier)) return false; + RegistrySupplier other = (RegistrySupplier) obj; + return other.getRegistryId().equals(getRegistryId()) && other.getId().equals(getId()); + } + + @Override + public String toString() { + return getRegistryId().toString() + "@" + id.toString(); + } + }; } @Override - public Supplier register(ResourceLocation id, Supplier supplier) { + public @NotNull RegistrySupplier registerSupplied(ResourceLocation id, Supplier supplier) { RegistryObject registryObject = RegistryObject.of(id, delegate); registry.put(delegate.getRegistrySuperType(), registryObject, () -> supplier.get().setRegistryName(id)); - return registryObject; + return new RegistrySupplier() { + @Override + public @NotNull ResourceLocation getRegistryId() { + return delegate.getRegistryName(); + } + + @Override + public @NotNull ResourceLocation getId() { + return registryObject.getId(); + } + + @Override + public boolean isPresent() { + return registryObject.isPresent(); + } + + @Override + public T get() { + return (T) registryObject.get(); + } + + @Override + public int hashCode() { + return Objects.hashCode(getRegistryId(), getId()); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (!(obj instanceof RegistrySupplier)) return false; + RegistrySupplier other = (RegistrySupplier) obj; + return other.getRegistryId().equals(getRegistryId()) && other.getId().equals(getId()); + } + + @Override + public String toString() { + return getRegistryId().toString() + "@" + id.toString(); + } + }; } @Override