Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fabric Data Fixer API (v1) #3649

Open
wants to merge 46 commits into
base: 1.21
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
edcde9b
port datafixer api + multiple fixers/mod
Treetrain1 Mar 12, 2024
d9caeb6
Add `DataFixerEvents`
Treetrain1 Mar 12, 2024
8b65e8f
fix style
Treetrain1 Mar 12, 2024
6dad72a
Add data fixer entrypoint
Treetrain1 Mar 12, 2024
82d4bcc
fix style again
Treetrain1 Mar 12, 2024
44db072
Match vanilla entity type builder
Treetrain1 Mar 12, 2024
2376c29
Match vanilla block entity type builder
Treetrain1 Mar 12, 2024
a027458
Remove `DataFixerEvents` in favor of the entrypoint
Treetrain1 Mar 12, 2024
baa4851
Add SchemaRegistry for entrypoint
Treetrain1 Mar 12, 2024
72eda29
mark registry as `final`
Treetrain1 Mar 12, 2024
b510e7e
fix `getModDataVersion` with custom key
Treetrain1 Mar 12, 2024
b4fd97d
fix inconsistency
Treetrain1 Mar 12, 2024
fa44453
add choice type fixes + use custom schema
Treetrain1 Mar 12, 2024
de0f9f1
Merge branch 'refs/heads/1.20.5' into api/datafixerupper
Treetrain1 Mar 12, 2024
f61b197
Prevent block entity breakages.
Treetrain1 Mar 12, 2024
2a2463d
Fix spotless
Treetrain1 Mar 12, 2024
5fa0086
fix mixin remapping
Treetrain1 Mar 12, 2024
9701b60
catch NPE
Treetrain1 Mar 12, 2024
a9a9044
Add `SchemaRegistry#register(Identifier, Function)`
Treetrain1 Mar 12, 2024
f30903c
Remove exception if a mod registers more than 1 fixer
Treetrain1 Mar 13, 2024
57dfec2
(WIP) Use sub versions of latest vanilla schema
Treetrain1 Mar 13, 2024
a3ca9ea
combine mod datafixers into one
Treetrain1 Mar 13, 2024
6db965c
New plan: Modded schema parents
Treetrain1 Mar 27, 2024
51466bc
Merge branch 'refs/heads/1.20.5' into api/datafixerupper-2
Treetrain1 Mar 27, 2024
a8f9f5a
Remove entrypoint
Treetrain1 Mar 27, 2024
7f9a9fc
Merge branch '1.20.5' into api/datafixerupper-2
Treetrain1 Mar 27, 2024
6fb062e
fix key specification in FMJ
Treetrain1 Mar 27, 2024
7f21a87
write todo in testmod
Treetrain1 Mar 27, 2024
54bf384
Merge branch 'refs/heads/1.20.5' into api/datafixerupper-2
Treetrain1 Mar 27, 2024
fa74df7
add isolation test
Treetrain1 Mar 28, 2024
da56a97
run spotless
Treetrain1 Mar 28, 2024
a94e988
Port biome test
Treetrain1 Mar 28, 2024
edc24d1
Add `addBlockStateRenameFix`
Treetrain1 Mar 28, 2024
bafef8b
consistency
Treetrain1 Mar 28, 2024
4ec6809
run spotless
Treetrain1 Mar 28, 2024
85cd529
Only warn if given id is not null
Treetrain1 Mar 28, 2024
1d1cd2e
improve warning + add comment
Treetrain1 Mar 28, 2024
3d0844b
remove `lastVanillaSchema`
Treetrain1 Mar 28, 2024
a23ea14
Revert "Remove entrypoint"
Treetrain1 Mar 30, 2024
4834306
Avoid registering tons of choice type fixes
Treetrain1 Mar 30, 2024
5bdd4ce
Merge remote-tracking branch 'origin/api/datafixerupper-2' into api/d…
Treetrain1 Jun 21, 2024
1924ee6
Merge branch 'refs/heads/1.21' into api/datafixerupper-2
Treetrain1 Jun 21, 2024
dc08fb2
Merge remote-tracking branch 'upstream/1.21' into api/datafixerupper-2
Treetrain1 Jul 11, 2024
5026b33
WIP 1.21 port
Treetrain1 Jul 11, 2024
cdc6895
Resolve conversations
Treetrain1 Jul 11, 2024
6bccbc5
Bypass vanilla version check in chunk deserialization
Treetrain1 Jul 12, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
add choice type fixes + use custom schema
Treetrain1 committed Mar 12, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
commit fa444531c77c138d072a1f52df90644f685b96b8
Original file line number Diff line number Diff line change
@@ -16,8 +16,6 @@

package net.fabricmc.fabric.test.lookup;



import com.mojang.datafixers.schemas.Schema;

import net.minecraft.datafixer.schema.Schema100;
Original file line number Diff line number Diff line change
@@ -37,8 +37,11 @@
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtElement;

import net.fabricmc.fabric.api.datafixer.v1.DataFixerEntrypoint;
import net.fabricmc.fabric.api.datafixer.v1.SchemaRegistry;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.ModContainer;
import net.fabricmc.loader.api.entrypoint.EntrypointContainer;
import net.fabricmc.loader.api.metadata.CustomValue;

public abstract class FabricDataFixesInternals {
@@ -47,6 +50,7 @@ public abstract class FabricDataFixesInternals {
protected static final String DATA_VERSIONS_KEY = "_FabricDataVersions";
public static final String METADATA_VERSION_KEY = "fabric-data-fixer-api-v1:version";
public static final String METADATA_KEY_KEY = "fabric-data-fixer-api-v1:key";
private static final String ENTRYPOINT_KEY = "fabric-data-fixer";

public record DataFixerEntry(DataFixer dataFixer, int currentVersion, @Nullable String key) {
}
@@ -81,6 +85,7 @@ public static String getKeyFromMetadata(ModContainer mod) {
@Range(from = 0, to = Integer.MAX_VALUE)
public static int getModDataVersion(NbtCompound nbt, String modId, @Nullable String key) {
String nbtKey = modId;

if (key != null) {
nbtKey += ('_' + key);
}
@@ -89,6 +94,28 @@ public static int getModDataVersion(NbtCompound nbt, String modId, @Nullable Str
return dataVersions.getInt(nbtKey);
}

private static List<DataFixerEntrypoint> getEntrypoints() {
List<EntrypointContainer<DataFixerEntrypoint>> dataFixerEntrypoints = FabricLoader.getInstance()
.getEntrypointContainers(ENTRYPOINT_KEY, DataFixerEntrypoint.class);
return dataFixerEntrypoints.stream().map(EntrypointContainer::getEntrypoint).toList();
}

public static void registerBlockEntities(SchemaRegistry registry, Schema schema) {
List<DataFixerEntrypoint> entrypoints = getEntrypoints();

for (DataFixerEntrypoint entrypoint : entrypoints) {
entrypoint.onRegisterBlockEntities(registry, schema);
}
}

public static void registerEntities(SchemaRegistry registry, Schema schema) {
List<DataFixerEntrypoint> entrypoints = getEntrypoints();

for (DataFixerEntrypoint entrypoint : entrypoints) {
entrypoint.onRegisterEntities(registry, schema);
}
}

private static FabricDataFixesInternals instance;

public static FabricDataFixesInternals get() {
@@ -126,10 +153,6 @@ public static FabricDataFixesInternals get() {

public abstract NbtCompound addModDataVersions(NbtCompound nbt);

public abstract void registerBlockEntities(SchemaRegistry registry, Schema schema);

public abstract void registerEntities(SchemaRegistry registry, Schema schema);

public abstract void freeze();

@Contract(pure = true)
Original file line number Diff line number Diff line change
@@ -35,15 +35,8 @@
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtElement;

import net.fabricmc.fabric.api.datafixer.v1.DataFixerEntrypoint;
import net.fabricmc.fabric.api.datafixer.v1.SchemaRegistry;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.entrypoint.EntrypointContainer;

public final class FabricDataFixesInternalsImpl extends FabricDataFixesInternals {
// From QSL.
private static final String ENTRYPOINT_KEY = "fabric-data-fixer";

private final Schema latestVanillaSchema;

private Map<String, List<DataFixerEntry>> modDataFixers;
@@ -118,30 +111,6 @@ public NbtCompound addModDataVersions(NbtCompound nbt) {
return nbt;
}

private static List<DataFixerEntrypoint> getEntrypoints() {
List<EntrypointContainer<DataFixerEntrypoint>> dataFixerEntrypoints = FabricLoader.getInstance()
.getEntrypointContainers(ENTRYPOINT_KEY, DataFixerEntrypoint.class);
return dataFixerEntrypoints.stream().map(EntrypointContainer::getEntrypoint).toList();
}

@Override
public void registerBlockEntities(SchemaRegistry registry, Schema schema) {
List<DataFixerEntrypoint> entrypoints = getEntrypoints();

for (DataFixerEntrypoint entrypoint : entrypoints) {
entrypoint.onRegisterBlockEntities(registry, schema);
}
}

@Override
public void registerEntities(SchemaRegistry registry, Schema schema) {
List<DataFixerEntrypoint> entrypoints = getEntrypoints();

for (DataFixerEntrypoint entrypoint : entrypoints) {
entrypoint.onRegisterEntities(registry, schema);
}
}

@Override
public void freeze() {
if (!this.frozen) {
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/*
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package net.fabricmc.fabric.impl.datafixer.v1;

import java.util.Map;
import java.util.function.Supplier;

import com.mojang.datafixers.schemas.Schema;
import com.mojang.datafixers.types.templates.TypeTemplate;

import net.minecraft.datafixer.schema.IdentifierNormalizingSchema;

import net.fabricmc.fabric.api.datafixer.v1.SchemaRegistry;

public class FabricSchema1903 extends IdentifierNormalizingSchema {
public SchemaRegistry registeredBlockEntities;
public SchemaRegistry registeredEntities;

public FabricSchema1903(int versionKey, Schema parent) {
super(versionKey, parent);
}

@Override
public Map<String, Supplier<TypeTemplate>> registerBlockEntities(Schema schema) {
Map<String, Supplier<TypeTemplate>> map = super.registerBlockEntities(schema);

this.registeredBlockEntities = new SchemaRegistryImpl();
FabricDataFixesInternals.registerBlockEntities(this.registeredBlockEntities, schema);

Map<String, Supplier<TypeTemplate>> modRegistry = this.registeredBlockEntities.get();

for (Map.Entry<String, Supplier<TypeTemplate>> entry : modRegistry.entrySet()) {
schema.register(map, entry.getKey(), entry.getValue());
}

return map;
}

@Override
public Map<String, Supplier<TypeTemplate>> registerEntities(Schema schema) {
Map<String, Supplier<TypeTemplate>> map = super.registerEntities(schema);

this.registeredEntities = new SchemaRegistryImpl();
FabricDataFixesInternals.registerEntities(this.registeredEntities, schema);

Map<String, Supplier<TypeTemplate>> modRegistry = this.registeredEntities.get();

for (Map.Entry<String, Supplier<TypeTemplate>> entry : modRegistry.entrySet()) {
schema.register(map, entry.getKey(), entry.getValue());
}

return map;
}
}
Original file line number Diff line number Diff line change
@@ -32,7 +32,6 @@
import net.minecraft.nbt.NbtElement;

import net.fabricmc.fabric.api.datafixer.v1.EmptySchema;
import net.fabricmc.fabric.api.datafixer.v1.SchemaRegistry;

public final class NoOpFabricDataFixesInternals extends FabricDataFixesInternals {
// From QSL.
@@ -67,14 +66,6 @@ public NbtCompound addModDataVersions(NbtCompound nbt) {
return nbt;
}

@Override
public void registerBlockEntities(SchemaRegistry registry, Schema schema) {
}

@Override
public void registerEntities(SchemaRegistry registry, Schema schema) {
}

@Override
public void freeze() {
this.frozen = true;

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/*
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package net.fabricmc.fabric.mixin.datafixer.v1;

import com.mojang.datafixers.DataFixerBuilder;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Slice;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

import net.minecraft.datafixer.Schemas;
import net.minecraft.datafixer.TypeReferences;
import net.minecraft.datafixer.fix.ChoiceTypesFix;

import net.fabricmc.fabric.impl.datafixer.v1.FabricSchema1903;

@Mixin(Schemas.class)
public class SchemasMixin {
@Inject(
method = "build",
at = @At(
value = "INVOKE",
target = "Lcom/mojang/datafixers/DataFixerBuilder;addSchema(ILjava/util/function/BiFunction;)Lcom/mojang/datafixers/schemas/Schema;",
ordinal = 0
),
slice = @Slice(
from = @At(
value = "CONSTANT",
args = "intValue=1803"
)
),
remap = false
)
private static void addFabricFixers(DataFixerBuilder builder, CallbackInfo ci) {
FabricSchema1903 schema = (FabricSchema1903) builder.addSchema(1903, FabricSchema1903::new);

for (String id : schema.registeredBlockEntities.getKeys()) {
builder.addFixer(new ChoiceTypesFix(schema, "Add Fabric block entity " + id, TypeReferences.BLOCK_ENTITY));
}

for (String id : schema.registeredEntities.getKeys()) {
builder.addFixer(new ChoiceTypesFix(schema, "Add Fabric entity " + id, TypeReferences.ENTITY));
}

schema.registeredBlockEntities = null;
schema.registeredEntities = null;
}
}
Original file line number Diff line number Diff line change
@@ -5,8 +5,7 @@
"mixins": [
"DataFixTypesMixin",
"NbtHelperMixin",
"Schema1904Mixin",
"Schema1906Mixin"
"SchemasMixin"
],
"injectors": {
"defaultRequire": 1