179 lines
8.2 KiB
Java
179 lines
8.2 KiB
Java
package net.minecraft.client.multiplayer;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Comparator;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.Locale;
|
|
import java.util.Map;
|
|
import java.util.Map.Entry;
|
|
import java.util.function.BiConsumer;
|
|
import java.util.stream.Collectors;
|
|
import javax.annotation.Nullable;
|
|
import net.minecraft.CrashReport;
|
|
import net.minecraft.CrashReportCategory;
|
|
import net.minecraft.ReportedException;
|
|
import net.minecraft.core.HolderLookup;
|
|
import net.minecraft.core.LayeredRegistryAccess;
|
|
import net.minecraft.core.Registry;
|
|
import net.minecraft.core.RegistryAccess;
|
|
import net.minecraft.core.RegistrySynchronization;
|
|
import net.minecraft.resources.RegistryDataLoader;
|
|
import net.minecraft.resources.ResourceKey;
|
|
import net.minecraft.server.packs.resources.ResourceProvider;
|
|
import net.minecraft.tags.TagLoader;
|
|
import net.minecraft.tags.TagNetworkSerialization;
|
|
import net.minecraftforge.api.distmarker.Dist;
|
|
import net.minecraftforge.api.distmarker.OnlyIn;
|
|
|
|
@OnlyIn(Dist.CLIENT)
|
|
public class RegistryDataCollector {
|
|
@Nullable
|
|
private RegistryDataCollector.ContentsCollector contentsCollector;
|
|
@Nullable
|
|
private RegistryDataCollector.TagCollector tagCollector;
|
|
|
|
public void appendContents(ResourceKey<? extends Registry<?>> p_331647_, List<RegistrySynchronization.PackedRegistryEntry> p_327881_) {
|
|
if (this.contentsCollector == null) {
|
|
this.contentsCollector = new RegistryDataCollector.ContentsCollector();
|
|
}
|
|
|
|
this.contentsCollector.append(p_331647_, p_327881_);
|
|
}
|
|
|
|
public void appendTags(Map<ResourceKey<? extends Registry<?>>, TagNetworkSerialization.NetworkPayload> p_329188_) {
|
|
if (this.tagCollector == null) {
|
|
this.tagCollector = new RegistryDataCollector.TagCollector();
|
|
}
|
|
|
|
p_329188_.forEach(this.tagCollector::append);
|
|
}
|
|
|
|
private static <T> Registry.PendingTags<T> resolveRegistryTags(
|
|
RegistryAccess.Frozen p_360841_, ResourceKey<? extends Registry<? extends T>> p_363100_, TagNetworkSerialization.NetworkPayload p_362008_
|
|
) {
|
|
Registry<T> registry = p_360841_.lookupOrThrow(p_363100_);
|
|
return registry.prepareTagReload(p_362008_.resolve(registry));
|
|
}
|
|
|
|
private RegistryAccess loadNewElementsAndTags(ResourceProvider p_367565_, RegistryDataCollector.ContentsCollector p_362016_, boolean p_364598_) {
|
|
LayeredRegistryAccess<ClientRegistryLayer> layeredregistryaccess = ClientRegistryLayer.createRegistryAccess();
|
|
RegistryAccess.Frozen registryaccess$frozen = layeredregistryaccess.getAccessForLoading(ClientRegistryLayer.REMOTE);
|
|
Map<ResourceKey<? extends Registry<?>>, RegistryDataLoader.NetworkedRegistryData> map = new HashMap<>();
|
|
p_362016_.elements
|
|
.forEach(
|
|
(p_365837_, p_368362_) -> map.put(
|
|
(ResourceKey<? extends Registry<?>>)p_365837_,
|
|
new RegistryDataLoader.NetworkedRegistryData(
|
|
(List<RegistrySynchronization.PackedRegistryEntry>)p_368362_, TagNetworkSerialization.NetworkPayload.EMPTY
|
|
)
|
|
)
|
|
);
|
|
List<Registry.PendingTags<?>> list = new ArrayList<>();
|
|
if (this.tagCollector != null) {
|
|
this.tagCollector.forEach((p_369903_, p_361286_) -> {
|
|
if (!p_361286_.isEmpty()) {
|
|
if (RegistrySynchronization.isNetworkable((ResourceKey<? extends Registry<?>>)p_369903_)) {
|
|
map.compute((ResourceKey<? extends Registry<?>>)p_369903_, (p_364673_, p_362709_) -> {
|
|
List<RegistrySynchronization.PackedRegistryEntry> list2 = p_362709_ != null ? p_362709_.elements() : List.of();
|
|
return new RegistryDataLoader.NetworkedRegistryData(list2, p_361286_);
|
|
});
|
|
} else if (!p_364598_) {
|
|
list.add(resolveRegistryTags(registryaccess$frozen, (ResourceKey<? extends Registry<?>>)p_369903_, p_361286_));
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
List<HolderLookup.RegistryLookup<?>> list1 = TagLoader.buildUpdatedLookups(registryaccess$frozen, list);
|
|
|
|
RegistryAccess.Frozen registryaccess$frozen1;
|
|
try {
|
|
registryaccess$frozen1 = RegistryDataLoader.load(map, p_367565_, list1, RegistryDataLoader.SYNCHRONIZED_REGISTRIES).freeze();
|
|
} catch (Exception exception) {
|
|
CrashReport crashreport = CrashReport.forThrowable(exception, "Network Registry Load");
|
|
addCrashDetails(crashreport, map, list);
|
|
throw new ReportedException(crashreport);
|
|
}
|
|
|
|
RegistryAccess registryaccess = layeredregistryaccess.replaceFrom(ClientRegistryLayer.REMOTE, registryaccess$frozen1).compositeAccess();
|
|
list.forEach(Registry.PendingTags::apply);
|
|
return registryaccess;
|
|
}
|
|
|
|
private static void addCrashDetails(
|
|
CrashReport p_361122_,
|
|
Map<ResourceKey<? extends Registry<?>>, RegistryDataLoader.NetworkedRegistryData> p_366915_,
|
|
List<Registry.PendingTags<?>> p_369882_
|
|
) {
|
|
CrashReportCategory crashreportcategory = p_361122_.addCategory("Received Elements and Tags");
|
|
crashreportcategory.setDetail(
|
|
"Dynamic Registries",
|
|
() -> p_366915_.entrySet()
|
|
.stream()
|
|
.sorted(Comparator.comparing(p_369666_ -> p_369666_.getKey().location()))
|
|
.map(
|
|
p_369114_ -> String.format(
|
|
Locale.ROOT,
|
|
"\n\t\t%s: elements=%d tags=%d",
|
|
p_369114_.getKey().location(),
|
|
p_369114_.getValue().elements().size(),
|
|
p_369114_.getValue().tags().size()
|
|
)
|
|
)
|
|
.collect(Collectors.joining())
|
|
);
|
|
crashreportcategory.setDetail(
|
|
"Static Registries",
|
|
() -> p_369882_.stream()
|
|
.sorted(Comparator.comparing(p_365860_ -> p_365860_.key().location()))
|
|
.map(p_368235_ -> String.format(Locale.ROOT, "\n\t\t%s: tags=%d", p_368235_.key().location(), p_368235_.size()))
|
|
.collect(Collectors.joining())
|
|
);
|
|
}
|
|
|
|
private void loadOnlyTags(RegistryDataCollector.TagCollector p_362263_, RegistryAccess.Frozen p_361181_, boolean p_369477_) {
|
|
p_362263_.forEach((p_370187_, p_363143_) -> {
|
|
if (p_369477_ || RegistrySynchronization.isNetworkable((ResourceKey<? extends Registry<?>>)p_370187_)) {
|
|
resolveRegistryTags(p_361181_, (ResourceKey<? extends Registry<?>>)p_370187_, p_363143_).apply();
|
|
}
|
|
});
|
|
}
|
|
|
|
public RegistryAccess.Frozen collectGameRegistries(ResourceProvider p_333941_, RegistryAccess.Frozen p_368312_, boolean p_328462_) {
|
|
RegistryAccess registryaccess;
|
|
if (this.contentsCollector != null) {
|
|
registryaccess = this.loadNewElementsAndTags(p_333941_, this.contentsCollector, p_328462_);
|
|
} else {
|
|
if (this.tagCollector != null) {
|
|
this.loadOnlyTags(this.tagCollector, p_368312_, !p_328462_);
|
|
}
|
|
|
|
registryaccess = p_368312_;
|
|
}
|
|
|
|
return registryaccess.freeze();
|
|
}
|
|
|
|
@OnlyIn(Dist.CLIENT)
|
|
static class ContentsCollector {
|
|
final Map<ResourceKey<? extends Registry<?>>, List<RegistrySynchronization.PackedRegistryEntry>> elements = new HashMap<>();
|
|
|
|
public void append(ResourceKey<? extends Registry<?>> p_331127_, List<RegistrySynchronization.PackedRegistryEntry> p_331340_) {
|
|
this.elements.computeIfAbsent(p_331127_, p_332834_ -> new ArrayList<>()).addAll(p_331340_);
|
|
}
|
|
}
|
|
|
|
@OnlyIn(Dist.CLIENT)
|
|
static class TagCollector {
|
|
private final Map<ResourceKey<? extends Registry<?>>, TagNetworkSerialization.NetworkPayload> tags = new HashMap<>();
|
|
|
|
public void append(ResourceKey<? extends Registry<?>> p_367185_, TagNetworkSerialization.NetworkPayload p_369486_) {
|
|
this.tags.put(p_367185_, p_369486_);
|
|
}
|
|
|
|
public void forEach(BiConsumer<? super ResourceKey<? extends Registry<?>>, ? super TagNetworkSerialization.NetworkPayload> p_365146_) {
|
|
this.tags.forEach(p_365146_);
|
|
}
|
|
}
|
|
} |