mirror of
https://github.com/FabricMC/fabric.git
synced 2025-04-11 22:45:38 -04:00
Improve 24w05a port (#3565)
* Fix wrong ops being used in AttachmentSerializingImpl * Remove unused private method * Require and use registry future in advancements and loot tables
This commit is contained in:
parent
03be9f1df2
commit
04ac8cf319
7 changed files with 51 additions and 36 deletions
fabric-data-attachment-api-v1/src/main/java/net/fabricmc/fabric/impl/attachment
fabric-data-generation-api-v1/src
main/java/net/fabricmc/fabric
api/datagen/v1/provider
FabricAdvancementProvider.javaFabricBlockLootTableProvider.javaFabricCodecDataProvider.javaSimpleFabricLootTableProvider.java
impl/datagen/loot
testmod/java/net/fabricmc/fabric/test/datagen
|
@ -82,7 +82,7 @@ public class AttachmentSerializingImpl {
|
|||
|
||||
if (codec != null) {
|
||||
RegistryOps<NbtElement> registryOps = RegistryOps.of(NbtOps.INSTANCE, wrapperLookup);
|
||||
codec.parse(NbtOps.INSTANCE, compound.get(key))
|
||||
codec.parse(registryOps, compound.get(key))
|
||||
.get()
|
||||
.ifRight(partial -> {
|
||||
LOGGER.warn("Couldn't deserialize attachment " + type.identifier() + ", skipping. Error:");
|
||||
|
|
|
@ -25,6 +25,7 @@ import java.util.function.Consumer;
|
|||
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.mojang.serialization.JsonOps;
|
||||
|
||||
|
@ -33,6 +34,8 @@ import net.minecraft.advancement.AdvancementEntry;
|
|||
import net.minecraft.data.DataOutput;
|
||||
import net.minecraft.data.DataProvider;
|
||||
import net.minecraft.data.DataWriter;
|
||||
import net.minecraft.registry.RegistryOps;
|
||||
import net.minecraft.registry.RegistryWrapper;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.Util;
|
||||
|
||||
|
@ -49,10 +52,12 @@ import net.fabricmc.fabric.impl.datagen.FabricDataGenHelper;
|
|||
public abstract class FabricAdvancementProvider implements DataProvider {
|
||||
protected final FabricDataOutput output;
|
||||
private final DataOutput.PathResolver pathResolver;
|
||||
private final CompletableFuture<RegistryWrapper.WrapperLookup> registryLookup;
|
||||
|
||||
protected FabricAdvancementProvider(FabricDataOutput output) {
|
||||
protected FabricAdvancementProvider(FabricDataOutput output, CompletableFuture<RegistryWrapper.WrapperLookup> registryLookup) {
|
||||
this.output = output;
|
||||
this.pathResolver = output.getResolver(DataOutput.OutputType.DATA_PACK, "advancements");
|
||||
this.registryLookup = registryLookup;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -80,20 +85,22 @@ public abstract class FabricAdvancementProvider implements DataProvider {
|
|||
|
||||
generateAdvancement(advancements::add);
|
||||
|
||||
final List<CompletableFuture<?>> futures = new ArrayList<>();
|
||||
return this.registryLookup.thenCompose(lookup -> {
|
||||
RegistryOps<JsonElement> ops = RegistryOps.of(JsonOps.INSTANCE, lookup);
|
||||
final List<CompletableFuture<?>> futures = new ArrayList<>();
|
||||
|
||||
for (AdvancementEntry advancement : advancements) {
|
||||
if (!identifiers.add(advancement.id())) {
|
||||
throw new IllegalStateException("Duplicate advancement " + advancement.id());
|
||||
for (AdvancementEntry advancement : advancements) {
|
||||
if (!identifiers.add(advancement.id())) {
|
||||
throw new IllegalStateException("Duplicate advancement " + advancement.id());
|
||||
}
|
||||
|
||||
JsonObject advancementJson = Util.getResult(Advancement.CODEC.encodeStart(ops, advancement.value()), IllegalStateException::new).getAsJsonObject();
|
||||
ConditionJsonProvider.write(advancementJson, FabricDataGenHelper.consumeConditions(advancement));
|
||||
futures.add(DataProvider.writeToPath(writer, advancementJson, getOutputPath(advancement)));
|
||||
}
|
||||
|
||||
JsonObject advancementJson = Util.getResult(Advancement.CODEC.encodeStart(JsonOps.INSTANCE, advancement.value()), IllegalStateException::new).getAsJsonObject();
|
||||
ConditionJsonProvider.write(advancementJson, FabricDataGenHelper.consumeConditions(advancement));
|
||||
|
||||
futures.add(DataProvider.writeToPath(writer, advancementJson, getOutputPath(advancement)));
|
||||
}
|
||||
|
||||
return CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new));
|
||||
return CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new));
|
||||
});
|
||||
}
|
||||
|
||||
private Path getOutputPath(AdvancementEntry advancement) {
|
||||
|
|
|
@ -32,6 +32,7 @@ import net.minecraft.loot.LootTable;
|
|||
import net.minecraft.loot.LootTables;
|
||||
import net.minecraft.loot.context.LootContextTypes;
|
||||
import net.minecraft.registry.Registries;
|
||||
import net.minecraft.registry.RegistryWrapper;
|
||||
import net.minecraft.resource.featuretoggle.FeatureFlags;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
|
@ -47,10 +48,12 @@ import net.fabricmc.fabric.impl.datagen.loot.FabricLootTableProviderImpl;
|
|||
public abstract class FabricBlockLootTableProvider extends BlockLootTableGenerator implements FabricLootTableProvider {
|
||||
private final FabricDataOutput output;
|
||||
private final Set<Identifier> excludedFromStrictValidation = new HashSet<>();
|
||||
private final CompletableFuture<RegistryWrapper.WrapperLookup> registryLookup;
|
||||
|
||||
protected FabricBlockLootTableProvider(FabricDataOutput dataOutput) {
|
||||
protected FabricBlockLootTableProvider(FabricDataOutput dataOutput, CompletableFuture<RegistryWrapper.WrapperLookup> registryLookup) {
|
||||
super(Collections.emptySet(), FeatureFlags.FEATURE_MANAGER.getFeatureSet());
|
||||
this.output = dataOutput;
|
||||
this.registryLookup = registryLookup;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -107,7 +110,7 @@ public abstract class FabricBlockLootTableProvider extends BlockLootTableGenerat
|
|||
|
||||
@Override
|
||||
public CompletableFuture<?> run(DataWriter writer) {
|
||||
return FabricLootTableProviderImpl.run(writer, this, LootContextTypes.BLOCK, output);
|
||||
return FabricLootTableProviderImpl.run(writer, this, LootContextTypes.BLOCK, output, registryLookup);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -82,10 +82,6 @@ public abstract class FabricCodecDataProvider<T> implements DataProvider {
|
|||
*/
|
||||
protected abstract void configure(BiConsumer<Identifier, T> provider, RegistryWrapper.WrapperLookup lookup);
|
||||
|
||||
private JsonElement convert(Identifier id, T value) {
|
||||
return this.convert(id, value, JsonOps.INSTANCE);
|
||||
}
|
||||
|
||||
private JsonElement convert(Identifier id, T value, DynamicOps<JsonElement> ops) {
|
||||
DataResult<JsonElement> dataResult = this.codec.encodeStart(ops, value);
|
||||
return dataResult.get()
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.util.concurrent.CompletableFuture;
|
|||
import net.minecraft.data.DataWriter;
|
||||
import net.minecraft.loot.context.LootContextType;
|
||||
import net.minecraft.loot.context.LootContextTypes;
|
||||
import net.minecraft.registry.RegistryWrapper;
|
||||
|
||||
import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator;
|
||||
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
|
||||
|
@ -32,16 +33,18 @@ import net.fabricmc.fabric.impl.datagen.loot.FabricLootTableProviderImpl;
|
|||
*/
|
||||
public abstract class SimpleFabricLootTableProvider implements FabricLootTableProvider {
|
||||
protected final FabricDataOutput output;
|
||||
private final CompletableFuture<RegistryWrapper.WrapperLookup> registryLookup;
|
||||
protected final LootContextType lootContextType;
|
||||
|
||||
public SimpleFabricLootTableProvider(FabricDataOutput output, LootContextType lootContextType) {
|
||||
public SimpleFabricLootTableProvider(FabricDataOutput output, CompletableFuture<RegistryWrapper.WrapperLookup> registryLookup, LootContextType lootContextType) {
|
||||
this.output = output;
|
||||
this.registryLookup = registryLookup;
|
||||
this.lootContextType = lootContextType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<?> run(DataWriter writer) {
|
||||
return FabricLootTableProviderImpl.run(writer, this, lootContextType, output);
|
||||
return FabricLootTableProviderImpl.run(writer, this, lootContextType, output, registryLookup);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -24,6 +24,7 @@ import java.util.Map;
|
|||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.mojang.serialization.JsonOps;
|
||||
|
||||
|
@ -32,6 +33,8 @@ import net.minecraft.data.DataProvider;
|
|||
import net.minecraft.data.DataWriter;
|
||||
import net.minecraft.loot.LootTable;
|
||||
import net.minecraft.loot.context.LootContextType;
|
||||
import net.minecraft.registry.RegistryOps;
|
||||
import net.minecraft.registry.RegistryWrapper;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.Util;
|
||||
|
||||
|
@ -50,7 +53,8 @@ public final class FabricLootTableProviderImpl {
|
|||
DataWriter writer,
|
||||
FabricLootTableProvider provider,
|
||||
LootContextType lootContextType,
|
||||
FabricDataOutput fabricDataOutput) {
|
||||
FabricDataOutput fabricDataOutput,
|
||||
CompletableFuture<RegistryWrapper.WrapperLookup> registryLookup) {
|
||||
HashMap<Identifier, LootTable> builders = Maps.newHashMap();
|
||||
HashMap<Identifier, ConditionJsonProvider[]> conditionMap = new HashMap<>();
|
||||
|
||||
|
@ -63,16 +67,18 @@ public final class FabricLootTableProviderImpl {
|
|||
}
|
||||
});
|
||||
|
||||
final List<CompletableFuture<?>> futures = new ArrayList<>();
|
||||
return registryLookup.thenCompose(lookup -> {
|
||||
RegistryOps<JsonElement> ops = RegistryOps.of(JsonOps.INSTANCE, lookup);
|
||||
final List<CompletableFuture<?>> futures = new ArrayList<>();
|
||||
|
||||
for (Map.Entry<Identifier, LootTable> entry : builders.entrySet()) {
|
||||
JsonObject tableJson = (JsonObject) Util.getResult(LootTable.CODEC.encodeStart(JsonOps.INSTANCE, entry.getValue()), IllegalStateException::new);
|
||||
ConditionJsonProvider.write(tableJson, conditionMap.remove(entry.getKey()));
|
||||
for (Map.Entry<Identifier, LootTable> entry : builders.entrySet()) {
|
||||
JsonObject tableJson = (JsonObject) Util.getResult(LootTable.CODEC.encodeStart(ops, entry.getValue()), IllegalStateException::new);
|
||||
ConditionJsonProvider.write(tableJson, conditionMap.remove(entry.getKey()));
|
||||
futures.add(DataProvider.writeToPath(writer, tableJson, getOutputPath(fabricDataOutput, entry.getKey())));
|
||||
}
|
||||
|
||||
futures.add(DataProvider.writeToPath(writer, tableJson, getOutputPath(fabricDataOutput, entry.getKey())));
|
||||
}
|
||||
|
||||
return CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new));
|
||||
return CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new));
|
||||
});
|
||||
}
|
||||
|
||||
private static Path getOutputPath(FabricDataOutput dataOutput, Identifier lootTableId) {
|
||||
|
|
|
@ -356,8 +356,8 @@ public class DataGeneratorTestEntrypoint implements DataGeneratorEntrypoint {
|
|||
}
|
||||
|
||||
private static class TestAdvancementProvider extends FabricAdvancementProvider {
|
||||
private TestAdvancementProvider(FabricDataOutput output) {
|
||||
super(output);
|
||||
private TestAdvancementProvider(FabricDataOutput output, CompletableFuture<RegistryWrapper.WrapperLookup> registryLookup) {
|
||||
super(output, registryLookup);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -386,8 +386,8 @@ public class DataGeneratorTestEntrypoint implements DataGeneratorEntrypoint {
|
|||
}
|
||||
|
||||
private static class TestBlockLootTableProvider extends FabricBlockLootTableProvider {
|
||||
private TestBlockLootTableProvider(FabricDataOutput output) {
|
||||
super(output);
|
||||
private TestBlockLootTableProvider(FabricDataOutput output, CompletableFuture<RegistryWrapper.WrapperLookup> registryLookup) {
|
||||
super(output, registryLookup);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -401,8 +401,8 @@ public class DataGeneratorTestEntrypoint implements DataGeneratorEntrypoint {
|
|||
}
|
||||
|
||||
private static class TestBarterLootTableProvider extends SimpleFabricLootTableProvider {
|
||||
private TestBarterLootTableProvider(FabricDataOutput output) {
|
||||
super(output, LootContextTypes.BARTER);
|
||||
private TestBarterLootTableProvider(FabricDataOutput output, CompletableFuture<RegistryWrapper.WrapperLookup> registryLookup) {
|
||||
super(output, registryLookup, LootContextTypes.BARTER);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
Loading…
Add table
Reference in a new issue