From d8eaeabf3cf03b2de05c23ce88c3b75548720014 Mon Sep 17 00:00:00 2001 From: LexManos Date: Wed, 26 Aug 2020 09:49:34 -0700 Subject: [PATCH] Wrap vanilla's 'default' biome registry in ForgeRegistry. This should allow registering mod dimensions like in 1.16.1, while the data driven system is fleshed out. --- .../minecraft/network/PacketBuffer.java.patch | 2 +- .../registry/WorldGenRegistries.java.patch | 22 ++++++++++ .../minecraft/world/biome/Biome.java.patch | 9 +++++ .../world/biome/BiomeRegistry.java.patch | 11 +++++ .../registries/ForgeRegistries.java | 6 +++ .../registries/ForgeRegistry.java | 40 ++++++++++++++----- .../minecraftforge/registries/GameData.java | 4 ++ .../registries/IForgeRegistry.java | 8 ++-- .../NamespacedDefaultedWrapper.java | 9 ++++- .../registries/NamespacedWrapper.java | 9 ++++- 10 files changed, 104 insertions(+), 16 deletions(-) create mode 100644 patches/minecraft/net/minecraft/util/registry/WorldGenRegistries.java.patch create mode 100644 patches/minecraft/net/minecraft/world/biome/BiomeRegistry.java.patch diff --git a/patches/minecraft/net/minecraft/network/PacketBuffer.java.patch b/patches/minecraft/net/minecraft/network/PacketBuffer.java.patch index 59774b761..781861186 100644 --- a/patches/minecraft/net/minecraft/network/PacketBuffer.java.patch +++ b/patches/minecraft/net/minecraft/network/PacketBuffer.java.patch @@ -25,7 +25,7 @@ if (p_150788_1_.func_190926_b()) { this.writeBoolean(false); } else { -@@ -300,7 +309,7 @@ +@@ -300,8 +309,8 @@ this.func_150787_b(Item.func_150891_b(item)); this.writeByte(p_150788_1_.func_190916_E()); CompoundNBT compoundnbt = null; diff --git a/patches/minecraft/net/minecraft/util/registry/WorldGenRegistries.java.patch b/patches/minecraft/net/minecraft/util/registry/WorldGenRegistries.java.patch new file mode 100644 index 000000000..089b21ee6 --- /dev/null +++ b/patches/minecraft/net/minecraft/util/registry/WorldGenRegistries.java.patch @@ -0,0 +1,22 @@ +--- a/net/minecraft/util/registry/WorldGenRegistries.java ++++ b/net/minecraft/util/registry/WorldGenRegistries.java +@@ -45,7 +45,7 @@ + return ProcessorLists.field_244102_b; + }); + public static final Registry field_243656_h = func_243667_a(Registry.field_243555_ax, JigsawPatternRegistry::func_244093_a); +- public static final Registry field_243657_i = func_243667_a(Registry.field_239720_u_, () -> { ++ @Deprecated public static final Registry field_243657_i = forge(Registry.field_239720_u_, () -> { + return BiomeRegistry.field_244200_a; + }); + public static final Registry field_243658_j = func_243667_a(Registry.field_243549_ar, DimensionSettings::func_242746_i); +@@ -54,6 +54,10 @@ + return func_243665_a(p_243667_0_, Lifecycle.stable(), p_243667_1_); + } + ++ private static > Registry forge(RegistryKey> key, Supplier def) { ++ return func_243666_a(key, net.minecraftforge.registries.GameData.getWrapper(key, Lifecycle.stable()), def, Lifecycle.stable()); ++ } ++ + private static Registry func_243665_a(RegistryKey> p_243665_0_, Lifecycle p_243665_1_, Supplier p_243665_2_) { + return func_243666_a(p_243665_0_, new SimpleRegistry<>(p_243665_0_, p_243665_1_), p_243665_2_, p_243665_1_); + } diff --git a/patches/minecraft/net/minecraft/world/biome/Biome.java.patch b/patches/minecraft/net/minecraft/world/biome/Biome.java.patch index e1b7c1428..7499bfd4f 100644 --- a/patches/minecraft/net/minecraft/world/biome/Biome.java.patch +++ b/patches/minecraft/net/minecraft/world/biome/Biome.java.patch @@ -1,5 +1,14 @@ --- a/net/minecraft/world/biome/Biome.java +++ b/net/minecraft/world/biome/Biome.java +@@ -53,7 +53,7 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + +-public final class Biome { ++public final class Biome extends net.minecraftforge.registries.ForgeRegistryEntry { + public static final Logger field_150586_aC = LogManager.getLogger(); + public static final Codec field_242418_b = RecordCodecBuilder.create((p_235064_0_) -> { + return p_235064_0_.group(Biome.Climate.field_242459_a.forGetter((p_242446_0_) -> { @@ -200,7 +200,7 @@ } else { if (p_201850_2_.func_177956_o() >= 0 && p_201850_2_.func_177956_o() < 256 && p_201850_1_.func_226658_a_(LightType.BLOCK, p_201850_2_) < 10) { diff --git a/patches/minecraft/net/minecraft/world/biome/BiomeRegistry.java.patch b/patches/minecraft/net/minecraft/world/biome/BiomeRegistry.java.patch new file mode 100644 index 000000000..d61813994 --- /dev/null +++ b/patches/minecraft/net/minecraft/world/biome/BiomeRegistry.java.patch @@ -0,0 +1,11 @@ +--- a/net/minecraft/world/biome/BiomeRegistry.java ++++ b/net/minecraft/world/biome/BiomeRegistry.java +@@ -17,7 +17,7 @@ + } + + public static RegistryKey func_244203_a(int p_244203_0_) { +- return field_244202_c.get(p_244203_0_); ++ return ((net.minecraftforge.registries.ForgeRegistry)net.minecraftforge.registries.ForgeRegistries.BIOMES).getKey(p_244203_0_); + } + + static { diff --git a/src/main/java/net/minecraftforge/registries/ForgeRegistries.java b/src/main/java/net/minecraftforge/registries/ForgeRegistries.java index 56e97ffcb..7c1083aa9 100644 --- a/src/main/java/net/minecraftforge/registries/ForgeRegistries.java +++ b/src/main/java/net/minecraftforge/registries/ForgeRegistries.java @@ -105,6 +105,9 @@ public class ForgeRegistries public static final IForgeRegistry> FOLIAGE_PLACER_TYPES = RegistryManager.ACTIVE.getRegistry(FoliagePlacerType.class); public static final IForgeRegistry> TREE_DECORATOR_TYPES = RegistryManager.ACTIVE.getRegistry(TreeDecoratorType.class); + // Dynamic/Data driven. + public static final IForgeRegistry BIOMES = RegistryManager.ACTIVE.getRegistry(Keys.BIOMES); + // Custom forge registries public static final IForgeRegistry DATA_SERIALIZERS = RegistryManager.ACTIVE.getRegistry(DataSerializerEntry.class); public static final IForgeRegistry> LOOT_MODIFIER_SERIALIZERS = RegistryManager.ACTIVE.getRegistry(GlobalLootModifierSerializer.class); @@ -143,6 +146,9 @@ public class ForgeRegistries public static final RegistryKey>> FOLIAGE_PLACER_TYPES = key("worldgen/foliage_placer_type"); public static final RegistryKey>> TREE_DECORATOR_TYPES = key("worldgen/tree_decorator_type"); + // Vanilla Dynamic + public static final RegistryKey> BIOMES = key("worldgen/biome"); + //Forge public static final RegistryKey> DATA_SERIALIZERS = key("data_serializers"); public static final RegistryKey>> LOOT_MODIFIER_SERIALIZERS = key("forge:loot_modifier_serializers"); diff --git a/src/main/java/net/minecraftforge/registries/ForgeRegistry.java b/src/main/java/net/minecraftforge/registries/ForgeRegistry.java index 9942d5acc..455c0547b 100644 --- a/src/main/java/net/minecraftforge/registries/ForgeRegistry.java +++ b/src/main/java/net/minecraftforge/registries/ForgeRegistry.java @@ -51,7 +51,9 @@ import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.ListNBT; import net.minecraft.nbt.StringNBT; import net.minecraft.network.PacketBuffer; +import net.minecraft.util.RegistryKey; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.registry.Registry; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.event.RegistryEvent.MissingMappings; import org.apache.logging.log4j.LogManager; @@ -59,14 +61,6 @@ import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.MarkerManager; -import net.minecraftforge.registries.IForgeRegistry.AddCallback; -import net.minecraftforge.registries.IForgeRegistry.BakeCallback; -import net.minecraftforge.registries.IForgeRegistry.ClearCallback; -import net.minecraftforge.registries.IForgeRegistry.CreateCallback; -import net.minecraftforge.registries.IForgeRegistry.DummyFactory; -import net.minecraftforge.registries.IForgeRegistry.MissingFactory; -import net.minecraftforge.registries.IForgeRegistry.ValidateCallback; - public class ForgeRegistry> implements IForgeRegistryInternal, IForgeRegistryModifiable { public static Marker REGISTRIES = MarkerManager.getMarker("REGISTRIES"); @@ -75,6 +69,7 @@ public class ForgeRegistry> implements IForgeRe private final RegistryManager stage; private final BiMap ids = HashBiMap.create(); private final BiMap names = HashBiMap.create(); + private final BiMap, V> keys = HashBiMap.create(); private final Class superType; private final Map aliases = Maps.newHashMap(); final Map slaves = Maps.newHashMap(); @@ -101,11 +96,13 @@ public class ForgeRegistry> implements IForgeRe boolean isFrozen = false; private final ResourceLocation name; + private final RegistryKey> key; private final RegistryBuilder builder; ForgeRegistry(RegistryManager stage, ResourceLocation name, RegistryBuilder builder) { this.name = name; + this.key = RegistryKey.func_240904_a_(name); this.builder = builder; this.stage = stage; this.superType = builder.getType(); @@ -167,6 +164,11 @@ public class ForgeRegistry> implements IForgeRe return this.name; } + public RegistryKey> getRegistryKey() + { + return this.key; + } + @Override public Class getRegistrySuperType() { @@ -238,9 +240,9 @@ public class ForgeRegistry> implements IForgeRe } @Override - public Set> getEntries() + public Set, V>> getEntries() { - return Collections.unmodifiableSet(this.names.entrySet()); + return Collections.unmodifiableSet(this.keys.entrySet()); } @SuppressWarnings("unchecked") @@ -285,6 +287,13 @@ public class ForgeRegistry> implements IForgeRe return ret == null ? this.defaultValue : ret; } + @Nullable + public RegistryKey getKey(int id) + { + V value = getValue(id); + return this.keys.inverse().get(value); + } + void validateKey() { if (this.defaultKey != null) @@ -355,6 +364,7 @@ public class ForgeRegistry> implements IForgeRe } this.names.put(key, value); + this.keys.put(RegistryKey.func_240903_a_(this.key, key), value); this.ids.put(idToUse, value); this.availabilityMap.set(idToUse); this.owners.put(new OverrideOwner(owner == null ? key.getPath() : owner, key), value); @@ -418,6 +428,7 @@ public class ForgeRegistry> implements IForgeRe LOGGER.trace(REGISTRIES,"Registry {} dummy: {}", this.superType.getSimpleName(), key); } + @SuppressWarnings("unchecked") private RegistryDelegate getDelegate(V thing) { if (isDelegated) @@ -526,6 +537,7 @@ public class ForgeRegistry> implements IForgeRe this.ids.clear(); this.names.clear(); + this.keys.clear(); this.availabilityMap.clear(0, this.availabilityMap.length()); this.defaultValue = null; this.overrides.clear(); @@ -596,6 +608,7 @@ public class ForgeRegistry> implements IForgeRe this.ids.clear(); this.names.clear(); + this.keys.clear(); this.availabilityMap.clear(0, this.availabilityMap.length()); } @@ -611,6 +624,10 @@ public class ForgeRegistry> implements IForgeRe V value = this.names.remove(key); if (value != null) { + RegistryKey rkey = this.keys.inverse().remove(value); + if (rkey == null) + throw new IllegalStateException("Removed a entry that did not have an associated RegistryKey: " + key + " " + value.toString() + " This should never happen unless hackery!"); + Integer id = this.ids.inverse().remove(value); if (id == null) throw new IllegalStateException("Removed a entry that did not have an associated id: " + key + " " + value.toString() + " This should never happen unless hackery!"); @@ -764,6 +781,9 @@ public class ForgeRegistry> implements IForgeRe if (value == null) throw new IllegalStateException("ContainsKey for " + key + " was true, but removing by name returned no value.. This should never happen unless hackery!"); + RegistryKey rkey = this.keys.inverse().remove(value); // Remove from the RegistryKey -> Value map + if (rkey == null) + throw new IllegalStateException("Removed a entry that did not have an associated RegistryKey: " + key + " " + value.toString() + " This should never happen unless hackery!"); Integer oldid = this.ids.inverse().remove(value); if (oldid == null) diff --git a/src/main/java/net/minecraftforge/registries/GameData.java b/src/main/java/net/minecraftforge/registries/GameData.java index 7d599a4c1..be5547ce6 100644 --- a/src/main/java/net/minecraftforge/registries/GameData.java +++ b/src/main/java/net/minecraftforge/registries/GameData.java @@ -56,6 +56,7 @@ import net.minecraft.util.registry.DefaultedRegistry; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.SimpleRegistry; import net.minecraft.village.PointOfInterestType; +import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.ChunkStatus; import net.minecraft.world.gen.DebugChunkGenerator; import net.minecraft.world.gen.blockplacer.BlockPlacerType; @@ -171,6 +172,9 @@ public class GameData makeRegistry(FOLIAGE_PLACER_TYPES, c(FoliagePlacerType.class)).disableSaving().disableSync().create(); makeRegistry(TREE_DECORATOR_TYPES, c(TreeDecoratorType.class)).disableSaving().disableSync().create(); + // Dynamic Worldgen + makeRegistry(BIOMES, Biome.class).create(); + // Custom forge registries makeRegistry(DATA_SERIALIZERS, DataSerializerEntry.class, 256 /*vanilla space*/, MAX_VARINT).disableSaving().disableOverrides().addCallback(SerializerCallbacks.INSTANCE).create(); makeRegistry(LOOT_MODIFIER_SERIALIZERS, c(GlobalLootModifierSerializer.class)).disableSaving().disableSync().create(); diff --git a/src/main/java/net/minecraftforge/registries/IForgeRegistry.java b/src/main/java/net/minecraftforge/registries/IForgeRegistry.java index c2ea22c16..187715ea1 100644 --- a/src/main/java/net/minecraftforge/registries/IForgeRegistry.java +++ b/src/main/java/net/minecraftforge/registries/IForgeRegistry.java @@ -24,6 +24,8 @@ import java.util.Map.Entry; import java.util.Set; import javax.annotation.Nonnull; import javax.annotation.Nullable; + +import net.minecraft.util.RegistryKey; import net.minecraft.util.ResourceLocation; /** @@ -48,9 +50,9 @@ public interface IForgeRegistry> extends Iterab @Nullable ResourceLocation getKey(V value); @Nullable ResourceLocation getDefaultKey(); - @Nonnull Set getKeys(); - @Nonnull Collection getValues(); - @Nonnull Set> getEntries(); + @Nonnull Set getKeys(); + @Nonnull Collection getValues(); + @Nonnull Set, V>> getEntries(); /** * Retrieve the slave map of type T from the registry. diff --git a/src/main/java/net/minecraftforge/registries/NamespacedDefaultedWrapper.java b/src/main/java/net/minecraftforge/registries/NamespacedDefaultedWrapper.java index 50b7787a0..177eea661 100644 --- a/src/main/java/net/minecraftforge/registries/NamespacedDefaultedWrapper.java +++ b/src/main/java/net/minecraftforge/registries/NamespacedDefaultedWrapper.java @@ -21,6 +21,7 @@ package net.minecraftforge.registries; import java.util.Collection; import java.util.Iterator; +import java.util.Map; import java.util.Optional; import java.util.OptionalInt; import java.util.Random; @@ -46,7 +47,7 @@ class NamespacedDefaultedWrapper> extends Defau private NamespacedDefaultedWrapper(ForgeRegistry owner) { - super("empty", RegistryKey.func_240904_a_(owner.getRegistryName()), Lifecycle.experimental()); + super("empty", owner.getRegistryKey(), Lifecycle.experimental()); this.delegate = owner; } @@ -133,6 +134,12 @@ class NamespacedDefaultedWrapper> extends Defau return this.delegate.getKeys(); } + @Override + public Set, T>> func_239659_c_() + { + return this.delegate.getEntries(); + } + @Override @Nullable public T getRandom(Random random) diff --git a/src/main/java/net/minecraftforge/registries/NamespacedWrapper.java b/src/main/java/net/minecraftforge/registries/NamespacedWrapper.java index 1e4fcca5f..535c019a8 100644 --- a/src/main/java/net/minecraftforge/registries/NamespacedWrapper.java +++ b/src/main/java/net/minecraftforge/registries/NamespacedWrapper.java @@ -21,6 +21,7 @@ package net.minecraftforge.registries; import java.util.Collection; import java.util.Iterator; +import java.util.Map; import java.util.Optional; import java.util.OptionalInt; import java.util.Random; @@ -44,7 +45,7 @@ class NamespacedWrapper> extends SimpleRegistry public NamespacedWrapper(ForgeRegistry owner) { - super(RegistryKey.func_240904_a_(owner.getRegistryName()), Lifecycle.experimental()); + super(owner.getRegistryKey(), Lifecycle.experimental()); this.delegate = owner; } @@ -131,6 +132,12 @@ class NamespacedWrapper> extends SimpleRegistry return this.delegate.getKeys(); } + @Override + public Set, T>> func_239659_c_() + { + return this.delegate.getEntries(); + } + @Override @Nullable public T getRandom(Random random)