diff --git a/gradle.properties b/gradle.properties index c341459..9e46ebf 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,4 +11,4 @@ maven_group=dev.u9g archives_base_name=minecrft-data-generator-server # Dependencies # check this on https://modmuss50.me/fabric.html -fabric_version=0.44.0+1.18 +fabric_version=0.55.2+1.19 diff --git a/src/main/java/dev/u9g/minecraftdatagenerator/generators/BiomesDataGenerator.java b/src/main/java/dev/u9g/minecraftdatagenerator/generators/BiomesDataGenerator.java index d3d78d1..096f283 100644 --- a/src/main/java/dev/u9g/minecraftdatagenerator/generators/BiomesDataGenerator.java +++ b/src/main/java/dev/u9g/minecraftdatagenerator/generators/BiomesDataGenerator.java @@ -2,23 +2,82 @@ package dev.u9g.minecraftdatagenerator.generators; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import dev.u9g.minecraftdatagenerator.mixin.TheEndBiomeDataAccessor; import dev.u9g.minecraftdatagenerator.util.DGU; import net.fabricmc.fabric.api.biome.v1.NetherBiomes; -import net.fabricmc.fabric.api.biome.v1.TheEndBiomes; import net.minecraft.util.Identifier; import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.util.registry.Registry; +import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.BuiltinBiomes; + +import java.util.HashSet; +import java.util.Set; public class BiomesDataGenerator implements IDataGenerator { + private static final Set> END_BIOMES = new HashSet<>(); - private static String guessBiomeDimensionFromCategory(Biome biome) { - return switch (biome.getCategory()) { - case NETHER -> "nether"; - case END -> "end"; - default -> "overworld"; - }; + private static String guessBiomeDimensionFromCategory(Biome biome, String biomeName) { + var key = DynamicRegistryManager.BUILTIN.get().get(Registry.BIOME_KEY).getKey(biome).orElseThrow(); + if (NetherBiomes.canGenerateInNether(key)) { + return "nether"; + } else if (END_BIOMES.contains(key) || biomeName.startsWith("end_")) { + return "end"; + } + return "overworld"; + } + + private static String guessCategoryBasedOnName(String name, String dimension) { + if (dimension.equals("nether")) { + return "nether"; + } else if (dimension.equals("end")) { + return "the_end"; + } + + if (name.contains("end")) { + System.out.println(); + } + + if (name.contains("hills")) { + return "extreme_hills"; + } else if (name.contains("ocean")) { + return "ocean"; + } else if (name.contains("plains")) { + return "plains"; + } else if (name.contains("ice") || name.contains("frozen")) { + return "ice"; + } else if (name.contains("jungle")) { + return "jungle"; + } else if (name.contains("desert")) { + return "desert"; + } else if (name.contains("forest") || name.contains("grove")) { + return "forest"; + } else if (name.contains("taiga")) { + return "taiga"; + } else if (name.contains("swamp")) { + return "swamp"; + } else if (name.contains("river")) { + return "river"; + } else if (name.equals("the_end")) { + return "the_end"; + } else if (name.contains("mushroom")) { + return "mushroom"; + } else if (name.contains("beach") || name.equals("stony_shore")) { + return "beach"; + } else if (name.contains("savanna")) { + return "savanna"; + } else if (name.contains("badlands")) { + return "mesa"; + } else if (name.contains("peaks") || name.equals("snowy_slopes") || name.equals("meadow")) { + return "mountain"; + } else if (name.equals("the_void")) { + return "none"; + } else if (name.contains("cave") || name.equals("deep_dark")) { + return "underground"; + } else { + System.out.println("Unable to find biome category for biome with name: '"+name+"'"); + return "none"; + } } private static int getBiomeColorFor(String biomeName) { @@ -83,22 +142,23 @@ public class BiomesDataGenerator implements IDataGenerator { else if (biomeName.equals("end_midlands")) return 15464630; else if (biomeName.equals("small_end_islands")) return 42; else if (biomeName.equals("end_barrens")) return 9474162; - else throw new Error("Unexpected biome, with name: '"+biomeName+"'"); + System.out.println("Don't know the color of biome: '"+biomeName+"'"); + return 0; } public static JsonObject generateBiomeInfo(Registry registry, Biome biome) { JsonObject biomeDesc = new JsonObject(); Identifier registryKey = registry.getKey(biome).orElseThrow().getValue(); String localizationKey = String.format("biome.%s.%s", registryKey.getNamespace(), registryKey.getPath()); - + String name = registryKey.getPath(); biomeDesc.addProperty("id", registry.getRawId(biome)); - biomeDesc.addProperty("name", registryKey.getPath()); - - biomeDesc.addProperty("category", biome.getCategory().getName()); + biomeDesc.addProperty("name", name); + String dimension = guessBiomeDimensionFromCategory(biome, name); + biomeDesc.addProperty("category", guessCategoryBasedOnName(name, dimension)); biomeDesc.addProperty("temperature", biome.getTemperature()); biomeDesc.addProperty("precipitation", biome.getPrecipitation().getName()); //biomeDesc.addProperty("depth", biome.getDepth()); - Doesn't exist anymore in minecraft source - biomeDesc.addProperty("dimension", guessBiomeDimensionFromCategory(biome)); + biomeDesc.addProperty("dimension", dimension); biomeDesc.addProperty("displayName", DGU.translateText(localizationKey)); biomeDesc.addProperty("color", getBiomeColorFor(registryKey.getPath())); biomeDesc.addProperty("rainfall", biome.getDownfall()); @@ -114,7 +174,7 @@ public class BiomesDataGenerator implements IDataGenerator { @Override public JsonArray generateDataJson() { JsonArray biomesArray = new JsonArray(); - DynamicRegistryManager registryManager = DynamicRegistryManager.create(); + DynamicRegistryManager registryManager = DynamicRegistryManager.BUILTIN.get(); Registry biomeRegistry = registryManager.get(Registry.BIOME_KEY); biomeRegistry.stream() @@ -122,4 +182,10 @@ public class BiomesDataGenerator implements IDataGenerator { .forEach(biomesArray::add); return biomesArray; } + + static { + END_BIOMES.addAll(TheEndBiomeDataAccessor.END_BIOMES_MAP().keySet()); + END_BIOMES.addAll(TheEndBiomeDataAccessor.END_BARRENS_MAP().keySet()); + END_BIOMES.addAll(TheEndBiomeDataAccessor.END_MIDLANDS_MAP().keySet()); + } } diff --git a/src/main/java/dev/u9g/minecraftdatagenerator/generators/EntitiesDataGenerator.java b/src/main/java/dev/u9g/minecraftdatagenerator/generators/EntitiesDataGenerator.java index 373baac..c8f14ec 100644 --- a/src/main/java/dev/u9g/minecraftdatagenerator/generators/EntitiesDataGenerator.java +++ b/src/main/java/dev/u9g/minecraftdatagenerator/generators/EntitiesDataGenerator.java @@ -2,6 +2,7 @@ package dev.u9g.minecraftdatagenerator.generators; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import dev.u9g.minecraftdatagenerator.mixin.EntityTypeAccessor; import dev.u9g.minecraftdatagenerator.util.DGU; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; @@ -60,7 +61,10 @@ public class EntitiesDataGenerator implements IDataGenerator { private static String getCategoryFrom(EntityType entityType) { if (entityType == EntityType.PLAYER) return "UNKNOWN"; // fail early for player entities - Entity entity = EntityType.createInstanceFromId(Registry.ENTITY_TYPE.getRawId(entityType), DGU.getWorld()); + /*public T create(World world) { + return this.factory.create(this, world); + }*/ + Entity entity = ((EntityTypeAccessor)entityType).factory().create(entityType, DGU.getWorld()); if (entity == null) throw new Error("Entity was null after trying to create a: " + DGU.translateText(entityType.getTranslationKey())); entity.discard(); return switch (entity.getClass().getPackageName()) { diff --git a/src/main/java/dev/u9g/minecraftdatagenerator/generators/MaterialsDataGenerator.java b/src/main/java/dev/u9g/minecraftdatagenerator/generators/MaterialsDataGenerator.java index e3866fe..6aa9ff0 100644 --- a/src/main/java/dev/u9g/minecraftdatagenerator/generators/MaterialsDataGenerator.java +++ b/src/main/java/dev/u9g/minecraftdatagenerator/generators/MaterialsDataGenerator.java @@ -120,7 +120,7 @@ public class MaterialsDataGenerator implements IDataGenerator { Registry itemRegistry = Registry.ITEM; itemRegistry.forEach(item -> { if (item instanceof MiningToolItem toolItem) { - Tag effectiveBlocks = ((MiningToolItemAccessor) toolItem).getEffectiveBlocks(); + TagKey effectiveBlocks = ((MiningToolItemAccessor) toolItem).getEffectiveBlocks(); String materialName = makeMaterialNameForTag(effectiveBlocks); if (!uniqueMaterialNames.contains(materialName)) { @@ -161,7 +161,7 @@ public class MaterialsDataGenerator implements IDataGenerator { itemRegistry.forEach(item -> { //Tools are handled rather easily and do not require anything else if (item instanceof MiningToolItem toolItem) { - Tag effectiveBlocks = ((MiningToolItemAccessor) toolItem).getEffectiveBlocks(); + TagKey effectiveBlocks = ((MiningToolItemAccessor) toolItem).getEffectiveBlocks(); String materialName = makeMaterialNameForTag(effectiveBlocks); Map materialSpeeds = materialMiningSpeeds.computeIfAbsent(materialName, k -> new HashMap<>()); diff --git a/src/main/java/dev/u9g/minecraftdatagenerator/generators/TintsDataGenerator.java b/src/main/java/dev/u9g/minecraftdatagenerator/generators/TintsDataGenerator.java index 302fe69..db22985 100644 --- a/src/main/java/dev/u9g/minecraftdatagenerator/generators/TintsDataGenerator.java +++ b/src/main/java/dev/u9g/minecraftdatagenerator/generators/TintsDataGenerator.java @@ -4,8 +4,6 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import dev.u9g.minecraftdatagenerator.mojangannoyances.BlockColors; import dev.u9g.minecraftdatagenerator.util.EmptyRenderBlockView; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; import net.minecraft.block.Block; import net.minecraft.block.Blocks; import net.minecraft.block.RedstoneWireBlock; @@ -51,12 +49,10 @@ public class TintsDataGenerator implements IDataGenerator { return resultColors; } - @Environment(EnvType.CLIENT) private static int getBlockColor(Block block, BlockColors blockColors) { return blockColors.getColor(block.getDefaultState(), EmptyRenderBlockView.INSTANCE, BlockPos.ORIGIN, 0xFFFFFF); } - @Environment(EnvType.CLIENT) public static Map generateConstantTintColors() { Map resultColors = new HashMap<>(); BlockColors blockColors = BlockColors.create(); diff --git a/src/main/java/dev/u9g/minecraftdatagenerator/mixin/EntityTypeAccessor.java b/src/main/java/dev/u9g/minecraftdatagenerator/mixin/EntityTypeAccessor.java new file mode 100644 index 0000000..2aa1f98 --- /dev/null +++ b/src/main/java/dev/u9g/minecraftdatagenerator/mixin/EntityTypeAccessor.java @@ -0,0 +1,12 @@ +package dev.u9g.minecraftdatagenerator.mixin; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(EntityType.class) +public interface EntityTypeAccessor { + @Accessor("factory") + public EntityType.EntityFactory factory(); +} diff --git a/src/main/java/dev/u9g/minecraftdatagenerator/mixin/TheEndBiomeDataAccessor.java b/src/main/java/dev/u9g/minecraftdatagenerator/mixin/TheEndBiomeDataAccessor.java new file mode 100644 index 0000000..5b74296 --- /dev/null +++ b/src/main/java/dev/u9g/minecraftdatagenerator/mixin/TheEndBiomeDataAccessor.java @@ -0,0 +1,27 @@ +package dev.u9g.minecraftdatagenerator.mixin; + +import net.fabricmc.fabric.impl.biome.TheEndBiomeData; +import net.fabricmc.fabric.impl.biome.WeightedPicker; +import net.minecraft.util.registry.RegistryKey; +import net.minecraft.world.biome.Biome; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Map; + + +@Mixin(TheEndBiomeData.class) +public interface TheEndBiomeDataAccessor { + @Accessor("END_BIOMES_MAP") + public static Map, WeightedPicker>> END_BIOMES_MAP() { + throw new IllegalStateException("Should never be called."); + } + @Accessor("END_MIDLANDS_MAP") + public static Map, WeightedPicker>> END_MIDLANDS_MAP() { + throw new IllegalStateException("Should never be called."); + } + @Accessor("END_BARRENS_MAP") + public static Map, WeightedPicker>> END_BARRENS_MAP() { + throw new IllegalStateException("Should never be called."); + } +} \ No newline at end of file diff --git a/src/main/java/dev/u9g/minecraftdatagenerator/util/EmptyRenderBlockView.java b/src/main/java/dev/u9g/minecraftdatagenerator/util/EmptyRenderBlockView.java index 11540e9..1cff92d 100644 --- a/src/main/java/dev/u9g/minecraftdatagenerator/util/EmptyRenderBlockView.java +++ b/src/main/java/dev/u9g/minecraftdatagenerator/util/EmptyRenderBlockView.java @@ -54,7 +54,7 @@ public enum EmptyRenderBlockView implements BlockRenderView { @Override public int getColor(BlockPos pos, ColorResolver colorResolver) { - DynamicRegistryManager registryManager = DynamicRegistryManager.create(); + DynamicRegistryManager registryManager = DynamicRegistryManager.BUILTIN.get(); Registry biomeRegistry = registryManager.get(Registry.BIOME_KEY); Biome plainsBiome = biomeRegistry.get(BiomeKeys.PLAINS); diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 595f2d1..46c4acf 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -23,6 +23,6 @@ "depends": { "fabricloader": ">=0.14.4", "fabric": "*", - "minecraft": "1.18" + "minecraft": "1.19" } } diff --git a/src/main/resources/minecraft-data-generator.mixins.json b/src/main/resources/minecraft-data-generator.mixins.json index bc0c0dc..b3f566c 100644 --- a/src/main/resources/minecraft-data-generator.mixins.json +++ b/src/main/resources/minecraft-data-generator.mixins.json @@ -4,9 +4,10 @@ "package": "dev.u9g.minecraftdatagenerator.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ - "ClientPlayerInteractionManagerMixin", + "EntityTypeAccessor", "MiningToolItemAccessor", - "ReadyMixin" + "ReadyMixin", + "TheEndBiomeDataAccessor" ], "client": [ ],