Skip to content

Commit 240fb63

Browse files
committed
world convert works on most data component and renaming items in gens to cobblemon.
1 parent 538c80d commit 240fb63

File tree

63 files changed

+474
-27
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+474
-27
lines changed

common/src/main/java/generations/gg/generations/core/generationscore/common/datafixer/GenerationsDataFixUtils.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
1-
package generations.gg.generations.core.generationscore.common.mixin.datafix;
1+
package generations.gg.generations.core.generationscore.common.datafixer;
22

33
import com.mojang.datafixers.DataFixUtils;
4+
import com.mojang.datafixers.util.Pair;
45
import com.mojang.serialization.Dynamic;
56
import net.minecraft.util.datafix.fixes.ItemStackComponentizationFix;
67

8+
import java.util.ArrayList;
79
import java.util.Comparator;
810
import java.util.Optional;
11+
import java.util.function.Function;
12+
import java.util.stream.Collectors;
913

1014
import static net.minecraft.util.datafix.fixes.ItemStackComponentizationFix.fixItemStack;
1115

12-
class GenerationsDataFixUtils {
16+
public class GenerationsDataFixUtils {
1317
public static Dynamic<?> getDiscHolder(Dynamic<?> holder) {
14-
return holder.createList(holder.asStream().filter(d -> d.get("Slot").asInt(-1) > -1).sorted(Comparator.comparingInt(value -> value.get("Slot").asInt(-1))).map(dynamic -> dynamic.remove("Slot")).map(GenerationsDataFixUtils::fixStack).map(a -> a.renameField("Count", "amount")));
18+
var list = holder.asStream().map(dynamic -> Pair.of(dynamic.get("Slot").asInt(-1), dynamic.remove("Slot")))
19+
.filter(pair -> pair.getFirst() <= -1).map(a -> a.getSecond()).map(a -> a.renameField("Count", "amount"));
20+
21+
return holder.createList(list);
1522
}
1623

1724
public static Dynamic<?> fixStack(Dynamic<?> dynamic) {
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,81 @@
11
package generations.gg.generations.core.generationscore.common.datafixer
22

3+
import com.google.common.util.concurrent.ThreadFactoryBuilder
4+
import com.mojang.datafixers.DSL
5+
import com.mojang.datafixers.DataFixer
6+
import com.mojang.datafixers.DataFixerBuilder
7+
import com.mojang.datafixers.schemas.Schema
8+
import generations.gg.generations.core.generationscore.common.GenerationsCore
9+
import generations.gg.generations.core.generationscore.common.datafixer.fixers.BotariumFix
10+
import generations.gg.generations.core.generationscore.common.datafixer.schema.GenerationsReferences
11+
import generations.gg.generations.core.generationscore.common.datafixer.schema.GenerationsRootSchema
12+
import generations.gg.generations.core.generationscore.common.datafixer.schema.Generationsv1Schema
13+
import net.minecraft.util.datafix.fixes.ItemStackComponentizationFix
14+
import net.minecraft.util.datafix.fixes.References
15+
import java.util.concurrent.Executors
16+
317
object GenerationsSchemas {
18+
const val VERSION_KEY = "${GenerationsCore.MOD_ID}:data_version"
19+
20+
@JvmStatic val DATA_FIXER: DataFixer get() = RESULT.fixer()
21+
22+
@JvmStatic public val ADDED_TO_1_6_COBBLEMON = buildMap<String, String> {
23+
put("generations_core:electric_seed", "cobblemon:electric_seed")
24+
put("generations_core:misty_seed", "cobblemon:misty_seed")
25+
put("generations_core:grassy_seed", "cobblemon:grassy_seed")
26+
put("generations_core:psychic_seed", "cobblemon:psychic_seed")
27+
put("generations_core:metronome", "cobblemon:metronome")
28+
put("generations_core:protective_pads", "cobblemon:protective_pads")
29+
put("generations_core:room_service", "cobblemon:room_service")
30+
put("generations_core:scope_lens", "cobblemon:scope_lens")
31+
put("generations_core:shed_shell", "cobblemon:shed_shell")
32+
put("generations_core:terrain_extender", "cobblemon:terrain_extender")
33+
put("generations_core:throat_spray", "cobblemon:throat_spray")
34+
put("generations_core:utility_umbrella", "cobblemon:utility_umbrella")
35+
put("generations_core:wide_lens", "cobblemon:wide_lens")
36+
put("generations_core:zoom_lens", "cobblemon:zoom_lens")
37+
}
38+
39+
private val SAME: (Int, Schema) -> Schema = ::Schema
40+
private val RESULT: DataFixerBuilder.Result = this.create()
41+
42+
const val DATA_VERSION = 1
43+
44+
private fun create(): DataFixerBuilder.Result {
45+
val builder = DataFixerBuilder(DATA_VERSION)
46+
this.appendSchemas(builder)
47+
val types = hashSetOf<DSL.TypeReference>(
48+
References.ENTITY ,
49+
GenerationsReferences.TERRAIUM_FORGE_INVENTORY,
50+
GenerationsReferences.TERRAIUM_FABRIC_INVENTORY)
51+
52+
val result = builder.build()
53+
if (types.isEmpty()) {
54+
return result
55+
}
56+
val executor = Executors.newSingleThreadExecutor(
57+
ThreadFactoryBuilder()
58+
.setNameFormat("${GenerationsCore.MOD_ID} Datafixer Bootstrap")
59+
.setDaemon(true)
60+
.setPriority(1)
61+
.build()
62+
)
63+
result.optimize(types, executor).join()
64+
return result
65+
}
66+
67+
private fun appendSchemas(builder: DataFixerBuilder) {
68+
builder.addSchema(0, ::GenerationsRootSchema)
69+
val v1 = builder.addSchema(1, ::Generationsv1Schema)
70+
// builder.addFixer(ItemRenameFix.create(v1, "Remove items from generations added in 1.6 cobblemon") { name ->
71+
// print("Converted $name to ")
72+
//
73+
// val newName = ADDED_TO_1_6_COBBLE.getOrDefault(name, name)
74+
//
75+
// println(newName)
76+
// return@create newName
77+
// })
78+
builder.addFixer(ItemStackComponentizationFix(v1))
79+
builder.addFixer(BotariumFix(v1))
80+
}
481
}
Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,17 @@
11
package generations.gg.generations.core.generationscore.common.datafixer.fixers
22

3-
class BotariumFix {
3+
import com.mojang.datafixers.DataFix
4+
import com.mojang.datafixers.TypeRewriteRule
5+
import com.mojang.datafixers.schemas.Schema
6+
import generations.gg.generations.core.generationscore.common.datafixer.schema.GenerationsReferences
7+
8+
class BotariumFix(outputSchema: Schema) : DataFix(outputSchema, false) {
9+
override fun makeRule(): TypeRewriteRule {
10+
var oldForge = inputSchema.getType(GenerationsReferences.TERRAIUM_FORGE_INVENTORY)
11+
var oldFabric = inputSchema.getType(GenerationsReferences.TERRAIUM_FORGE_INVENTORY)
12+
13+
// return this.fixTypeEverywhereTyped()
14+
15+
return TypeRewriteRule.nop()
16+
}
417
}
Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,9 @@
1-
package generations.gg.generations.core.generationscore.common.datafixer.schema
1+
package generations.gg.generations.core.generationscore.common.datafixer.schema
22

3+
import net.minecraft.util.datafix.fixes.References
4+
5+
object GenerationsReferences {
6+
val TERRAIUM_FORGE_INVENTORY = References.reference("terraium_forge_inventory")
7+
val ITEM_RESOURCE = References.reference("item_resource")
8+
val TERRAIUM_FABRIC_INVENTORY = References.reference("terraium_fabric_inventory")
9+
}
Lines changed: 136 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,138 @@
11
package generations.gg.generations.core.generationscore.common.datafixer.schema
22

3-
class GenerationsRootSchema {
4-
}
3+
import com.cobblemon.mod.common.Cobblemon
4+
import com.cobblemon.mod.common.ModAPI
5+
import com.mojang.datafixers.DSL
6+
import com.mojang.datafixers.schemas.Schema
7+
import com.mojang.datafixers.types.templates.TypeTemplate
8+
import net.minecraft.util.datafix.DataFixers.getDataFixer
9+
import net.minecraft.util.datafix.fixes.References
10+
import net.minecraft.util.datafix.schemas.NamespacedSchema
11+
import java.util.function.Supplier
12+
13+
class GenerationsRootSchema(versionKey: Int, parent: Schema?) : Schema(versionKey, parent) {
14+
15+
override fun registerTypes(
16+
schema: Schema,
17+
entityTypes: MutableMap<String, Supplier<TypeTemplate>>,
18+
blockEntityTypes: MutableMap<String, Supplier<TypeTemplate>>
19+
) {
20+
schema.registerType(true, GenerationsReferences.TERRAIUM_FORGE_INVENTORY) {
21+
DSL.optionalFields("ForgeCaps", DSL.optionalFields("botarium:item", DSL.optionalFields("Items", DSL.list(References.ITEM_STACK.`in`(schema))) ))
22+
}
23+
24+
schema.registerType(true, GenerationsReferences.TERRAIUM_FABRIC_INVENTORY) {
25+
DSL.optionalFields("Items", DSL.list(References.ITEM_STACK.`in`(schema)))
26+
}
27+
28+
//I'm not 100% sure what a recursive type is, but at least one is required
29+
//Maybe a type that can contain itself?
30+
schema.registerType(true, References.ENTITY) {
31+
DSL.taggedChoiceLazy("id", NamespacedSchema.namespacedString(), entityTypes)
32+
}
33+
schema.registerType(true, References.BLOCK_ENTITY) {
34+
//Tagged choice makes it so that the type is determined by a key of some other type
35+
//So the "id" of a block entity determines what type the actual block entity is
36+
DSL.taggedChoiceLazy(
37+
"id",
38+
NamespacedSchema.namespacedString(),
39+
blockEntityTypes
40+
)
41+
}
42+
43+
schema.registerType(false, References.CHUNK) {
44+
DSL.optionalFields(
45+
"block_entities",
46+
DSL.list(
47+
//Remainder basically passes through anything not previously matched to a type
48+
//I believe this is necessary because the "block_entities" type wont be parsed properly if there is leftover data.
49+
//So if we only have a gilded chest and a display case defined as block entities (because those are the only ones we need to fix)
50+
//Any other block entity data gets put in this remainder tag.
51+
//So basically, this is either a "block_entity" or something else we dont care about
52+
DSL.or(
53+
References.BLOCK_ENTITY.`in`(schema),
54+
DSL.remainder()
55+
)
56+
)
57+
)
58+
}
59+
schema.registerType(false, References.ENTITY_CHUNK) {
60+
DSL.optionalFields(
61+
"Entities",
62+
DSL.or(
63+
DSL.list(References.ENTITY.`in`(schema)),
64+
DSL.remainder()
65+
)
66+
)
67+
}
68+
//We steal the definition of the item stack type from the vanilla schema
69+
//DO NOT CHANGE THE NUMBER IN HERE.
70+
//This is the version of the schema that was being used when THIS schema was made.
71+
//Specifically, this schema was pre item components
72+
//If you need a different number, make a new schema
73+
val vanillaSchema = getDataFixer().getSchema(38180)
74+
schema.registerType(true, References.ITEM_STACK) {
75+
vanillaSchema.getType(References.ITEM_STACK).buildTemplate()
76+
}
77+
}
78+
79+
override fun registerBlockEntities(schema: Schema): MutableMap<String, Supplier<TypeTemplate>> = mutableMapOf<String, Supplier<TypeTemplate>>().apply {
80+
val botarium = when(Cobblemon.implementation.modAPI) {
81+
ModAPI.FABRIC -> GenerationsReferences.TERRAIUM_FABRIC_INVENTORY
82+
ModAPI.FORGE -> GenerationsReferences.TERRAIUM_FORGE_INVENTORY
83+
else -> throw RuntimeException("Forge isn't supported by Generations Core")
84+
}
85+
86+
simple("pokedoll")
87+
simple("generic_shrine")
88+
simple("abundant_shrne")
89+
simple("celestial_altar")
90+
simple("lunar_shrine")
91+
putGens("meloetta_music_box") {
92+
DSL.optionalFields("RecordItem", References.ITEM_STACK.`in`(schema))
93+
}
94+
95+
putGens("regigigas_shrine") { botarium.`in`(schema) }
96+
simple("tao_trio_shrine")
97+
simple("tapu_shrine")
98+
simple("interact_shrine")
99+
putGens("cooking_pot") { botarium.`in`(schema) }
100+
putGens("generic_chest") { DSL.optionalFields("Items", DSL.list(References.ITEM_STACK.`in`(schema))) }
101+
simple("sign_block_entity")
102+
simple("hanging_sign_block_entity")
103+
simple("breeder")
104+
putGens("generic_furnace") { DSL.optionalFields("Items", DSL.list(References.ITEM_STACK.`in`(schema))) }
105+
putGens("generic_blast_furnace") { DSL.optionalFields("Items", DSL.list(References.ITEM_STACK.`in`(schema))) }
106+
putGens("generic_smoker") { DSL.optionalFields("Items", DSL.list(References.ITEM_STACK.`in`(schema))) }
107+
simple("generic_dyed_variant")
108+
simple("generic_model_providing")
109+
simple("vending_machine")
110+
simple("ball_display")
111+
simple("pc")
112+
simple("dyed_pc")
113+
simple("poke_loot")
114+
putGens("rks_machine") {
115+
DSL.optionalFields("Inventory", DSL.optionalFields(
116+
"Output", References.ITEM_STACK.`in`(schema),
117+
DSL.optionalFields("Items", DSL.list(References.ITEM_STACK.`in`(schema)))
118+
))
119+
}
120+
121+
simple("street_lamp")
122+
putGens("box") { DSL.optionalFields("Items", DSL.list(References.ITEM_STACK.`in`(schema))) }
123+
}
124+
125+
override fun registerEntities(schema: Schema): MutableMap<String, Supplier<TypeTemplate>> = mutableMapOf<String, Supplier<TypeTemplate>>().apply {
126+
simple("boat")
127+
putGens("chest_boat") { DSL.optionalFields("Items", DSL.list(References.ITEM_STACK.`in`(schema))) }
128+
simple("magma_crystal")
129+
simple("seat")
130+
simple("statue")
131+
simple("tiered_fishing_bobber")
132+
simple("zygarde_cell")
133+
}
134+
135+
private fun MutableMap<String, Supplier<TypeTemplate>>.simple(name: String) = registerSimple(this, "generations_core:$name")
136+
137+
private fun MutableMap<String, Supplier<TypeTemplate>>.putGens(k: String, function: () -> TypeTemplate) = put("generations_core:$k", function)
138+
}
Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,47 @@
11
package generations.gg.generations.core.generationscore.common.datafixer.schema
22

3-
class Generationsv1Schema {
3+
import com.mojang.datafixers.DSL
4+
import com.mojang.datafixers.schemas.Schema
5+
import com.mojang.datafixers.types.templates.TypeTemplate
6+
import net.minecraft.util.datafix.DataFixers
7+
import net.minecraft.util.datafix.fixes.References
8+
import net.minecraft.util.datafix.schemas.NamespacedSchema
9+
import java.util.function.Supplier
10+
11+
class Generationsv1Schema(versionKey: Int, parent: Schema) : Schema(versionKey, parent) {
12+
13+
override fun registerTypes(
14+
schema: Schema,
15+
entityTypes: MutableMap<String, Supplier<TypeTemplate>>,
16+
blockEntityTypes: MutableMap<String, Supplier<TypeTemplate>>,
17+
) {
18+
super.registerTypes(schema, entityTypes, blockEntityTypes)
19+
20+
val vanillaSchema = DataFixers.getDataFixer().getSchema(38185)
21+
schema.registerType(true, References.ITEM_STACK) {
22+
vanillaSchema.getType(References.ITEM_STACK).buildTemplate()
23+
}
24+
25+
schema.registerType(false, References.DATA_COMPONENTS) {
26+
vanillaSchema.getType(References.DATA_COMPONENTS).buildTemplate()
27+
}
28+
29+
schema.registerType(false, References.ITEM_NAME) { DSL.constType(NamespacedSchema.namespacedString()) }
30+
31+
schema.registerType(false, GenerationsReferences.TERRAIUM_FABRIC_INVENTORY, {
32+
DSL.optionalFields("fabric:attachments", DSL.optionalFields("generations_core:inventory", GenerationsReferences.ITEM_RESOURCE.`in`(schema)))
33+
})
34+
35+
schema.registerType(false, GenerationsReferences.TERRAIUM_FORGE_INVENTORY) {
36+
DSL.optionalFields("fabric:attachments", DSL.optionalFields("generations_core:inventory", GenerationsReferences.ITEM_RESOURCE.`in`(schema))) //TODO: Get back this when I have how this will look in 1.21.1
37+
}
38+
39+
schema.registerType(false, GenerationsReferences.ITEM_RESOURCE, {
40+
DSL.optionalFields("id", References.ITEM_NAME.`in`(schema), "components", References.DATA_COMPONENTS.`in`(schema), "amount", DSL.longType().template())
41+
})
42+
}
43+
44+
override fun registerBlockEntities(schema: Schema?): MutableMap<String, Supplier<TypeTemplate>> {
45+
return super.registerBlockEntities(schema)
46+
}
447
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package generations.gg.generations.core.generationscore.common.mixin;
2+
3+
import generations.gg.generations.core.generationscore.common.datafixer.GenerationsSchemas;
4+
import generations.gg.generations.core.generationscore.common.datafixer.schema.GenerationsRootSchema;
5+
import net.minecraft.nbt.CompoundTag;
6+
import net.minecraft.nbt.NbtUtils;
7+
import org.spongepowered.asm.mixin.Mixin;
8+
import org.spongepowered.asm.mixin.injection.At;
9+
import org.spongepowered.asm.mixin.injection.Inject;
10+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
11+
12+
@Mixin(NbtUtils.class)
13+
public class NbtUtilsMixin {
14+
@Inject(
15+
method = "addCurrentDataVersion(Lnet/minecraft/nbt/CompoundTag;)Lnet/minecraft/nbt/CompoundTag;",
16+
at = @At("TAIL")
17+
)
18+
private static void addCobblemonDataVersion(
19+
CompoundTag tag,
20+
CallbackInfoReturnable<CompoundTag> cir
21+
) {
22+
tag.putInt(GenerationsSchemas.VERSION_KEY, GenerationsSchemas.DATA_VERSION);
23+
}
24+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package generations.gg.generations.core.generationscore.common.mixin.datafix;
2+
3+
import com.cobblemon.mod.common.datafixer.CobblemonSchemas;
4+
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
5+
import net.minecraft.nbt.CompoundTag;
6+
import net.minecraft.util.datafix.DataFixTypes;
7+
import net.minecraft.world.level.chunk.storage.ChunkStorage;
8+
import org.spongepowered.asm.mixin.Mixin;
9+
import org.spongepowered.asm.mixin.injection.At;
10+
11+
import static generations.gg.generations.core.generationscore.common.datafixer.GenerationsSchemas.VERSION_KEY;
12+
13+
@Mixin(ChunkStorage.class)
14+
public class ChunkStorageMixin {
15+
//Modifies the NBT returned by the vanilla upgradeChunkTag to also incorporate cobblemon fixup stuff
16+
@ModifyExpressionValue(
17+
method = "upgradeChunkTag(Lnet/minecraft/resources/ResourceKey;Ljava/util/function/Supplier;Lnet/minecraft/nbt/CompoundTag;Ljava/util/Optional;)Lnet/minecraft/nbt/CompoundTag;",
18+
at = @At(
19+
value = "INVOKE",
20+
target = "Lnet/minecraft/util/datafix/DataFixTypes;updateToCurrentVersion(Lcom/mojang/datafixers/DataFixer;Lnet/minecraft/nbt/CompoundTag;I)Lnet/minecraft/nbt/CompoundTag;"
21+
)
22+
)
23+
public CompoundTag cobblemon$doChunkFix(
24+
CompoundTag vanillaFixed
25+
) {
26+
int curVersion = vanillaFixed.contains(VERSION_KEY) ? vanillaFixed.getInt(VERSION_KEY) : 0;
27+
return DataFixTypes.CHUNK.update(CobblemonSchemas.getDATA_FIXER(), vanillaFixed, curVersion, CobblemonSchemas.DATA_VERSION);
28+
}
29+
}

0 commit comments

Comments
 (0)