From 13a6612b5792ed7f711d0a39e897a14112a7e4fe Mon Sep 17 00:00:00 2001 From: Bixilon Date: Mon, 5 Apr 2021 20:02:38 +0200 Subject: [PATCH] wip port yarn generator to 21w13a --- pom.xml | 10 +- .../de/bixilon/pixlyzer/EntitySpawner.kt | 20 +++- .../kotlin/de/bixilon/pixlyzer/PixLyzer.kt | 10 +- .../bixilon/pixlyzer/generator/Generator.kt | 2 +- .../bixilon/pixlyzer/generator/Generators.kt | 11 +- .../generator/generators/BiomeGenerator.kt | 54 ++++++--- .../generators/BlockEntityGenerator.kt | 25 ++++- .../generator/generators/BlockGenerator.kt | 19 ++-- .../generators/DimensionGenerator.kt | 8 +- .../generators/EnchantmentGenerator.kt | 22 +++- .../generator/generators/EntityGenerator.kt | 34 ++---- .../generator/generators/ItemGenerator.kt | 10 +- .../generator/generators/MenuTypeGenerator.kt | 27 ----- .../generators/MobCategoryGenerator.kt | 23 ---- .../generators/MobEffectGenerator.kt | 9 +- .../generators/PointOfInterestGenerator.kt | 16 ++- .../generators/StatisticsGenerator.kt | 2 +- .../generators/VillagerProfessionGenerator.kt | 2 +- .../generators/VoxelShapeGenerator.kt | 41 ++++--- .../BiomePrecipitationsGenerator.kt | 2 +- .../CreativeInventoryTabGenerator.kt | 29 +++-- .../enums/EnchantmentTargetsGenerator.kt | 20 ++++ .../bixilon/pixlyzer/util/ReflectionUtil.kt | 17 +++ .../net/fabricmc/yarn/constants/CatTypes.java | 22 ++++ .../yarn/constants/LlamaVariants.java | 15 +++ .../fabricmc/yarn/constants/MiningLevels.java | 51 +++++++++ .../yarn/constants/ParrotVariants.java | 16 +++ .../fabricmc/yarn/constants/RabbitTypes.java | 18 +++ .../resources/entities_metadata_mappings.json | 103 +++++++++++++++++- 29 files changed, 463 insertions(+), 175 deletions(-) delete mode 100644 src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MenuTypeGenerator.kt delete mode 100644 src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MobCategoryGenerator.kt rename src/main/kotlin/de/bixilon/pixlyzer/generator/generators/{ => enums}/BiomePrecipitationsGenerator.kt (90%) rename src/main/kotlin/de/bixilon/pixlyzer/generator/generators/{ => enums}/CreativeInventoryTabGenerator.kt (64%) create mode 100644 src/main/kotlin/de/bixilon/pixlyzer/generator/generators/enums/EnchantmentTargetsGenerator.kt create mode 100644 src/main/kotlin/net/fabricmc/yarn/constants/CatTypes.java create mode 100644 src/main/kotlin/net/fabricmc/yarn/constants/LlamaVariants.java create mode 100644 src/main/kotlin/net/fabricmc/yarn/constants/MiningLevels.java create mode 100644 src/main/kotlin/net/fabricmc/yarn/constants/ParrotVariants.java create mode 100644 src/main/kotlin/net/fabricmc/yarn/constants/RabbitTypes.java diff --git a/pom.xml b/pom.xml index f0f6522..60e6986 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,7 @@ UTF-8 official 1.8 - 1.14.3 + 21w13a @@ -49,14 +49,6 @@ - - maven-surefire-plugin - 2.22.2 - - - maven-failsafe-plugin - 2.22.2 - diff --git a/src/main/kotlin/de/bixilon/pixlyzer/EntitySpawner.kt b/src/main/kotlin/de/bixilon/pixlyzer/EntitySpawner.kt index c41a3ac..bf5dc02 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/EntitySpawner.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/EntitySpawner.kt @@ -7,7 +7,11 @@ import de.bixilon.pixlyzer.util.ReflectionUtil.setFinalField import net.minecraft.client.network.OtherClientPlayerEntity import net.minecraft.entity.Entity import net.minecraft.entity.EntityType +import net.minecraft.entity.EyeOfEnderEntity import net.minecraft.entity.decoration.ItemFrameEntity +import net.minecraft.entity.projectile.ArrowEntity +import net.minecraft.entity.projectile.SpectralArrowEntity +import net.minecraft.entity.projectile.thrown.* import net.minecraft.scoreboard.Scoreboard import net.minecraft.world.World import net.minecraft.world.border.WorldBorder @@ -28,9 +32,9 @@ object EntitySpawner { val entity = try { ENTITY_CREATE_METHOD?.invoke(FACTORY_FIELD.get(entityType), entityType, CLIENT_LEVEL) as Entity? - } catch (exception: Exception) { + } catch (exception: Throwable) { exception.printStackTrace() - TODO() + null // ToDo } @@ -38,6 +42,18 @@ object EntitySpawner { return entity } + // ToDo: This crashed in 21w13a? + when (entityType) { + EntityType.EGG -> return OBJENSIS.newInstance(EggEntity::class.java) as Entity + EntityType.SNOWBALL -> return OBJENSIS.newInstance(SnowballEntity::class.java) as Entity + EntityType.ENDER_PEARL -> return OBJENSIS.newInstance(EnderPearlEntity::class.java) as Entity + EntityType.EYE_OF_ENDER -> return OBJENSIS.newInstance(EyeOfEnderEntity::class.java) as Entity + EntityType.EXPERIENCE_BOTTLE -> return OBJENSIS.newInstance(ExperienceBottleEntity::class.java) as Entity + EntityType.POTION -> return OBJENSIS.newInstance(PotionEntity::class.java) as Entity + EntityType.ARROW -> return OBJENSIS.newInstance(ArrowEntity::class.java) as Entity + EntityType.SPECTRAL_ARROW -> return OBJENSIS.newInstance(SpectralArrowEntity::class.java) as Entity + } + TODO("Entity type: $entityType") } diff --git a/src/main/kotlin/de/bixilon/pixlyzer/PixLyzer.kt b/src/main/kotlin/de/bixilon/pixlyzer/PixLyzer.kt index baf68ef..3ffb0b5 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/PixLyzer.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/PixLyzer.kt @@ -77,14 +77,14 @@ object PixLyzer { println("Skipping ${generator.name}: ${exception.message}") continue } - if (generator.data.size() == 0) { - error("${generator.fileName} has 0 entries!") + if (generator.data.size() == 0 && !generator.allowEmpty) { + error("${generator.name} has 0 entries!") } - println("Saving to ${outputDirectory.absolutePath}/${generator.fileName}.json") + println("Saving to ${outputDirectory.absolutePath}/${generator.name}.json") - writeJson("${outputDirectory.absolutePath}/${generator.fileName}", generator.data) - all.add(generator.fileName, generator.data) + writeJson("${outputDirectory.absolutePath}/${generator.name}", generator.data) + all.add(generator.name, generator.data) println("Done generating ${generator.name} in ${System.currentTimeMillis() - startTime}ms, generated ${generator.entries} entries.") diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/Generator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/Generator.kt index c2830a6..ddbe96c 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/Generator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/Generator.kt @@ -4,8 +4,8 @@ import com.google.gson.JsonObject abstract class Generator( val name: String, - val fileName: String = name, val allowedFail: Boolean = false, + val allowEmpty: Boolean = false, ) { val entries get() = data.size() diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/Generators.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/Generators.kt index 6136d1c..6a58a6b 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/Generators.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/Generators.kt @@ -1,6 +1,9 @@ package de.bixilon.pixlyzer.generator import de.bixilon.pixlyzer.generator.generators.* +import de.bixilon.pixlyzer.generator.generators.enums.BiomePrecipitationsGenerator +import de.bixilon.pixlyzer.generator.generators.enums.CreativeInventoryTabGenerator +import de.bixilon.pixlyzer.generator.generators.enums.EnchantmentTargetsGenerator object Generators { @@ -9,7 +12,6 @@ object Generators { BiomeGenerator, MaterialGenerator, ItemGenerator, - CreativeInventoryTabGenerator, MobEffectGenerator, EnchantmentGenerator, PotionGenerator, @@ -17,7 +19,7 @@ object Generators { DimensionGenerator, BlockGenerator, RarityGenerator, - MobCategoryGenerator, + // ToDo: MobCategoryGenerator, ParticleGenerator, BlockEntityGenerator, StatisticsGenerator, @@ -25,12 +27,15 @@ object Generators { VillagerTypeGenerator, PointOfInterestGenerator, VillagerProfessionGenerator, - MenuTypeGenerator, + // ToDo: MenuTypeGenerator, SoundEventGenerator, BiomeCategoryGenerator, BiomePrecipitationsGenerator, FluidGenerator, + EnchantmentTargetsGenerator, + CreativeInventoryTabGenerator, + VoxelShapeGenerator, ModelsGenerator, diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/BiomeGenerator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/BiomeGenerator.kt index 765826f..8f3b2b9 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/BiomeGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/BiomeGenerator.kt @@ -6,6 +6,7 @@ import de.bixilon.pixlyzer.util.ReflectionUtil.getClass import de.bixilon.pixlyzer.util.ReflectionUtil.getField import net.minecraft.sound.SoundEvent import net.minecraft.util.Identifier +import net.minecraft.util.math.BlockPos import net.minecraft.util.registry.Registry import net.minecraft.world.biome.Biome import java.util.* @@ -31,14 +32,8 @@ object BiomeGenerator : Generator( } biomeData.addProperty("downfall", DOWNFALL_FIELD.getFloat(climateParameters)) - BIOME_SKY_COLOR_FIELD?.getInt(biome)?.let { - biomeData.addProperty("sky_color", it) - } ?: let { - biomeData.addProperty("sky_color", SKY_COLOR_FUNCTION!!.invoke(biome, 0.0f) as Int) - } - - getField(Biome::class.java, "specialEffects")?.get(biome)?.let { + getField(Biome::class.java, "effects")?.get(biome)?.let { FOG_COLOR_SPECIAL_EFFECTS_FIELD?.getInt(it)?.let { biomeData.addProperty("fog_color", it) } @@ -68,33 +63,60 @@ object BiomeGenerator : Generator( (BACKGROUND_MUSIC_SPECIAL_EFFECTS_FIELD?.get(it) as Optional?)?.ifPresent { biomeData.addProperty("background_music", Registry.SOUND_EVENT.getRawId(MUSIC_CLASS_EVENT_FIELD!!.get(it) as SoundEvent)) } + } ?: let { + // calculate color overrider + try { + biomeData.addProperty("foliage_color_override", FOLIAGE_COLOR_OVERRIDE_METHOD!!.invoke(biome) as Int) + } catch (exception: NullPointerException) { + } + try { + biomeData.addProperty("grass_color_modifier", GRASS_COLOR_OVERRIDE_METHOD!!.invoke(biome) as Int) + } catch (exception: NullPointerException) { + } + + BIOME_SKY_COLOR_FIELD?.getInt(biome)?.let { + biomeData.addProperty("sky_color", it) + } ?: let { + biomeData.addProperty("sky_color", SKY_COLOR_FUNCTION!!.invoke(biome, 0.0f) as Int) + } } data.add(resourceLocation.toString(), biomeData) } } + private val FOLIAGE_COLOR_OVERRIDE_METHOD = try { + Biome::class.java.getMethod("getFoliageColorAt", BlockPos::class.java) + } catch (exception: Exception) { + null + } + private val GRASS_COLOR_OVERRIDE_METHOD = try { + Biome::class.java.getMethod("getGrassColorAt", BlockPos::class.java) + } catch (exception: Exception) { + null + } + private val SKY_COLOR_FUNCTION = try { Biome::class.java.getDeclaredMethod("getSkyColor", Float::class.java) } catch (exception: Exception) { null } - private val SPECIAL_EFFECTS_CLASS = getClass("net.minecraft.world.level.biome.BiomeSpecialEffects") - private val CLIMATE_SETTINGS_CLASS = getClass("net.minecraft.world.level.biome.Biome\$ClimateSettings", "net.minecraft.world.level.biome.Biome", "net.minecraft.world.biome.Biome")!! + private val SPECIAL_EFFECTS_CLASS = getClass("net.minecraft.world.biome.BiomeEffects") + private val CLIMATE_SETTINGS_CLASS = getClass("net.minecraft.world.biome.Biome\$Weather", "net.minecraft.world.level.biome.Biome\$ClimateSettings", "net.minecraft.world.level.biome.Biome", "net.minecraft.world.biome.Biome")!! private val FOG_COLOR_SPECIAL_EFFECTS_FIELD = getField(SPECIAL_EFFECTS_CLASS, "fogColor") private val WATER_COLOR_SPECIAL_EFFECTS_FIELD = getField(SPECIAL_EFFECTS_CLASS, "waterColor") private val WATER_FOG_COLOR_SPECIAL_EFFECTS_FIELD = getField(SPECIAL_EFFECTS_CLASS, "waterFogColor") private val SKY_COLOR_SPECIAL_EFFECTS_FIELD = getField(SPECIAL_EFFECTS_CLASS, "skyColor") - private val FOLIAGE_COLOR_OVERRIDE_SPECIAL_EFFECTS_FIELD = getField(SPECIAL_EFFECTS_CLASS, "foliageColorOverride") - private val GRASS_COLOR_OVERRIDE_SPECIAL_EFFECTS_FIELD = getField(SPECIAL_EFFECTS_CLASS, "grassColorOverride") + private val FOLIAGE_COLOR_OVERRIDE_SPECIAL_EFFECTS_FIELD = getField(SPECIAL_EFFECTS_CLASS, "foliageColor") + private val GRASS_COLOR_OVERRIDE_SPECIAL_EFFECTS_FIELD = getField(SPECIAL_EFFECTS_CLASS, "grassColor") private val GRASS_COLOR_MODIFIER_SPECIAL_EFFECTS_FIELD = getField(SPECIAL_EFFECTS_CLASS, "grassColorModifier") - private val AMBIENT_SOUND_LOOP_EVENT_SPECIAL_EFFECTS_FIELD = getField(SPECIAL_EFFECTS_CLASS, "ambientLoopSoundEvent") - private val BACKGROUND_MUSIC_SPECIAL_EFFECTS_FIELD = getField(SPECIAL_EFFECTS_CLASS, "backgroundMusic") + private val AMBIENT_SOUND_LOOP_EVENT_SPECIAL_EFFECTS_FIELD = getField(SPECIAL_EFFECTS_CLASS, "loopSound") + private val BACKGROUND_MUSIC_SPECIAL_EFFECTS_FIELD = getField(SPECIAL_EFFECTS_CLASS, "music") - private val CLIMATE_PARAMETERS_FIELD = getField(Biome::class.java, "climateSettings") + private val CLIMATE_PARAMETERS_FIELD = getField(Biome::class.java, "weather", "climateSettings") private val PRECIPITATION_FIELD = getField(CLIMATE_SETTINGS_CLASS, "precipitation")!! private val TEMPERATURE_FIELD = getField(CLIMATE_SETTINGS_CLASS, "temperature", "baseTemperature")!! private val TEMPERATURE_MODIFIER_FIELD = getField(CLIMATE_SETTINGS_CLASS, "temperatureModifier") @@ -104,10 +126,10 @@ object BiomeGenerator : Generator( private val BIOME_SKY_COLOR_FIELD = getField(Biome::class.java, "skyColor") - private val MUSIC_CLASS_EVENT_FIELD = getField(getClass("net.minecraft.sounds.Music"), "event") + private val MUSIC_CLASS_EVENT_FIELD = getField(getClass("net.minecraft.sound.MusicSound"), "sound") private fun getBiomes(): Set> { - val biomes = getField(getClass("net.minecraft.data.BuiltinRegistries", Registry::class.java.name)!!, "BIOME")!!.get(null) as Registry + val biomes = getField(getClass("net.minecraft.util.registry.BuiltinRegistries", "net.minecraft.data.BuiltinRegistries", Registry::class.java.name)!!, "BIOME")!!.get(null) as Registry val ret: MutableSet> = mutableSetOf() diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/BlockEntityGenerator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/BlockEntityGenerator.kt index 33c4cb9..3307993 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/BlockEntityGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/BlockEntityGenerator.kt @@ -3,19 +3,19 @@ package de.bixilon.pixlyzer.generator.generators import com.google.gson.JsonArray import com.google.gson.JsonObject import de.bixilon.pixlyzer.generator.Generator -import de.bixilon.pixlyzer.util.ReflectionUtil +import de.bixilon.pixlyzer.util.ReflectionUtil.getField import net.minecraft.block.Block import net.minecraft.block.entity.BlockEntityType +import net.minecraft.util.Identifier import net.minecraft.util.registry.Registry object BlockEntityGenerator : Generator( "block_entities" ) { override fun generate() { - for (blockEntityType in Registry.BLOCK_ENTITY) { - val resourceIdentifier = Registry.BLOCK_ENTITY.getId(blockEntityType) + for ((blockEntityType, id, resourceIdentifier) in getBlockEntities()) { val blockEntityData = JsonObject() - blockEntityData.addProperty("id", Registry.BLOCK_ENTITY.getRawId(blockEntityType)) + blockEntityData.addProperty("id", id) (BLOCK_ENTITY_VALID_BLOCKS_FIELD?.get(blockEntityType) as Set?)?.let { val blockTypes = JsonArray() @@ -25,7 +25,7 @@ object BlockEntityGenerator : Generator( } if (blockTypes.size() > 0) { - blockEntityData.add("valid_blocks", blockTypes) + blockEntityData.add("blocks", blockTypes) } } @@ -33,5 +33,18 @@ object BlockEntityGenerator : Generator( } } - private val BLOCK_ENTITY_VALID_BLOCKS_FIELD = ReflectionUtil.getField(BlockEntityType::class.java, "blocks") + private val BLOCK_ENTITY_VALID_BLOCKS_FIELD = getField(BlockEntityType::class.java, "blocks") + + + private fun getBlockEntities(): Set, Int, Identifier>> { + val registry = getField(Registry::class.java, "BLOCK_ENTITY_TYPE", "BLOCK_ENTITY")!!.get(null) as Registry> + + val ret: MutableSet, Int, Identifier>> = mutableSetOf() + + for (value in registry) { + ret.add(Triple(value as BlockEntityType<*>, registry.getRawId(value), registry.getId(value)!!)) + } + + return ret + } } diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/BlockGenerator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/BlockGenerator.kt index ef66c20..2acbc74 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/BlockGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/BlockGenerator.kt @@ -11,8 +11,7 @@ import net.minecraft.block.Block import net.minecraft.block.BlockState import net.minecraft.block.Blocks import net.minecraft.client.color.block.BlockColors -import net.minecraft.state.AbstractState -import net.minecraft.util.IdList +import net.minecraft.util.collection.IdList import net.minecraft.util.registry.Registry import net.minecraft.util.shape.VoxelShape @@ -58,7 +57,7 @@ object BlockGenerator : Generator( blockData.addProperty("has_dynamic_shape", block.hasDynamicBounds()) } try { - blockData.addProperty("destroy_speed", BLOCK_DESTROY_SPEED_FIELD.getFloat(block)) + blockData.addProperty("hardness", BLOCK_DESTROY_SPEED_FIELD.getFloat(block)) } catch (exception: IllegalArgumentException) { } @@ -367,9 +366,9 @@ object BlockGenerator : Generator( return true } - private val BLOCK_STATE_BASE_CLASS = getClass("net.minecraft.world.level.block.state.BlockBehaviour\$BlockStateBase", "net.minecraft.world.level.block.state.BlockState", "net.minecraft.block.BlockState")!! - private val BLOCK_DESTROY_SPEED_FIELD = getField(BLOCK_STATE_BASE_CLASS, "destroySpeed") ?: getField(Block::class.java, "hardness")!! - private val BLOCK_STATE_OWNER_FIELD = getField(AbstractState::class.java, "owner") ?: getField(getClass("net.minecraft.world.level.block.state.AbstractStateHolder"), "owner")!! + private val BLOCK_STATE_BASE_CLASS = getClass("net.minecraft.block.AbstractBlock\$AbstractBlockState", "net.minecraft.world.level.block.state.BlockBehaviour\$BlockStateBase", "net.minecraft.world.level.block.state.BlockState", "net.minecraft.block.BlockState")!! + private val BLOCK_DESTROY_SPEED_FIELD = getField(getClass("net.minecraft.block.AbstractBlock\$Settings"), "hardness") ?: getField(BLOCK_STATE_BASE_CLASS, "destroySpeed") ?: getField(Block::class.java, "hardness")!! + private val BLOCK_STATE_OWNER_FIELD = getField(getClass("net.minecraft.state.State"), "owner") ?: getField(getClass("net.minecraft.state.AbstractState"), "owner") ?: getField(getClass("net.minecraft.world.level.block.state.AbstractStateHolder"), "owner")!! private val BLOCK_STATE_CACHE_FIELD = BLOCK_STATE_BASE_CLASS.getDeclaredField("shapeCache") private val REQUIRES_CORRECT_TOOL_FOR_DROP_FIELDS = getField(BlockState::class.java, "requiresCorrectToolForDrops") @@ -378,7 +377,7 @@ object BlockGenerator : Generator( init { for (clazz in BLOCK_STATE_BASE_CLASS.declaredClasses) { - if (clazz.name == "net.minecraft.world.level.block.state.BlockBehaviour\$BlockStateBase\$Cache" || clazz.name == "net.minecraft.world.level.block.state.BlockState\$Cache" || clazz.name == "net.minecraft.block.BlockState\$ShapeCache") { + if (clazz.name == "net.minecraft.block.AbstractBlock\$AbstractBlockState\$ShapeCache" || clazz.name == "net.minecraft.world.level.block.state.BlockBehaviour\$BlockStateBase\$Cache" || clazz.name == "net.minecraft.world.level.block.state.BlockState\$Cache" || clazz.name == "net.minecraft.block.BlockState\$ShapeCache") { BLOCK_STATE_CACHE_CLASS = clazz break } @@ -388,11 +387,11 @@ object BlockGenerator : Generator( private val CACHE_SOLID_RENDER_FIELD = BLOCK_STATE_CACHE_CLASS.getDeclaredField("fullOpaque") private val CACHE_PROPAGATES_SKYLIGHT_DOWN_FIELD = BLOCK_STATE_CACHE_CLASS.getDeclaredField("translucent") private val CACHE_LIGHT_BLOCK_FIELD = BLOCK_STATE_CACHE_CLASS.getDeclaredField("lightSubtracted") - private val CACHE_OCCLUSION_SHAPES_FIELD = BLOCK_STATE_CACHE_CLASS.getDeclaredField("shapes") + private val CACHE_OCCLUSION_SHAPES_FIELD = getField(BLOCK_STATE_CACHE_CLASS, "extrudedFaces", "shapes")!! private val CACHE_COLLISION_SHAPES_FIELD = getField(BLOCK_STATE_CACHE_CLASS, "collisionShape") // ToDo: Not working in < 1.14.3 - private val LARGE_COLLISION_SHAPE_FIELD = BLOCK_STATE_CACHE_CLASS.getDeclaredField("field_17651") + private val LARGE_COLLISION_SHAPE_FIELD = getField(BLOCK_STATE_CACHE_CLASS, "exceedsCube", "field_17651")!! private val IS_FACE_STURDY = getField(BLOCK_STATE_CACHE_CLASS, "faceSturdy", "isFaceSturdy", "solidFullSquare") - private val IS_COLLISION_SHAPE_FULL_BLOCK = getField(BLOCK_STATE_CACHE_CLASS, "shapeIsFullCube", "field_17651") + private val IS_COLLISION_SHAPE_FULL_BLOCK = getField(BLOCK_STATE_CACHE_CLASS, "exceedsCube", "shapeIsFullCube", "field_17651") private val BLOCK_SPEED_FACTOR_FIELD = getField(Block::class.java, "speedFactor") diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/DimensionGenerator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/DimensionGenerator.kt index 85ba64e..adc37a1 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/DimensionGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/DimensionGenerator.kt @@ -132,10 +132,10 @@ object DimensionGenerator : Generator( } field.isAccessible = true val resourceLocation = when (field.name) { - "DEFAULT_OVERWORLD", "OVERWORLD" -> Identifier("overworld") - "DEFAULT_OVERWORLD_CAVES" -> Identifier("overworld_caves") - "DEFAULT_NETHER", "NETHER" -> Identifier("the_nether") - "DEFAULT_END", "THE_END" -> Identifier("the_end") + "OVERWORLD", "OVERLORD" -> Identifier("overworld") + "OVERWORLD_CAVES" -> Identifier("overworld_caves") + "THE_NETHER" -> Identifier("the_nether") + "THE_END" -> Identifier("the_end") else -> TODO("Can not find dimension ${field.name}") } types.add(Triple(resourceLocation, null, field.get(null) as DimensionType)) diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/EnchantmentGenerator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/EnchantmentGenerator.kt index 768e2e8..17d91ff 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/EnchantmentGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/EnchantmentGenerator.kt @@ -3,6 +3,7 @@ package de.bixilon.pixlyzer.generator.generators import com.google.gson.JsonArray import com.google.gson.JsonObject import de.bixilon.pixlyzer.generator.Generator +import de.bixilon.pixlyzer.util.ReflectionUtil.getField import net.minecraft.enchantment.Enchantment import net.minecraft.entity.EquipmentSlot import net.minecraft.util.registry.Registry @@ -19,9 +20,9 @@ object EnchantmentGenerator : Generator( enchantmentData.addProperty("id", Registry.ENCHANTMENT.getRawId(enchantment)) enchantment.translationKey?.let { - enchantmentData.addProperty("description_id", it) + enchantmentData.addProperty("translation_key", it) } - enchantmentData.addProperty("rarity", enchantment.weight.ordinal) + enchantmentData.addProperty("rarity", (ENCHANTMENT_RARITY_FIELD.get(enchantment) as Enum<*>).ordinal) enchantment.type?.let { enchantmentData.addProperty("category", it.name.toLowerCase()) @@ -36,14 +37,26 @@ object EnchantmentGenerator : Generator( if (equipmentSlots.size() > 0) { enchantmentData.add("slots", equipmentSlots) } - enchantmentData.addProperty("minimum_level", enchantment.minimumLevel) - enchantmentData.addProperty("maximum_level", enchantment.maximumLevel) + enchantmentData.addProperty("minimum_level", ENCHANTMENT_MINIMUM_LEVEL_METHOD.invoke(enchantment) as Int) + enchantmentData.addProperty("maximum_level", ENCHANTMENT_MAXIMUM_LEVEL_METHOD.invoke(enchantment) as Int) data.add(resourceIdentifier.toString(), enchantmentData) } } private val ENCHANTMENT_SLOTS_FIELD: Field = Enchantment::class.java.getDeclaredField("slotTypes") + private val ENCHANTMENT_RARITY_FIELD: Field = getField(Enchantment::class.java, "rarity", "weight")!! + + private val ENCHANTMENT_MINIMUM_LEVEL_METHOD = try { + Enchantment::class.java.getMethod("getMinimumLevel") + } catch (exception: Exception) { + Enchantment::class.java.getMethod("getMinLevel") + } + private val ENCHANTMENT_MAXIMUM_LEVEL_METHOD = try { + Enchantment::class.java.getMethod("getMaximumLevel") + } catch (exception: Exception) { + Enchantment::class.java.getMethod("getMaxLevel") + } init { ENCHANTMENT_SLOTS_FIELD.isAccessible = true @@ -52,5 +65,6 @@ object EnchantmentGenerator : Generator( private fun Enchantment.getSlots(): Array { return ENCHANTMENT_SLOTS_FIELD.get(this) as Array } + } diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/EntityGenerator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/EntityGenerator.kt index d0b426a..593213f 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/EntityGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/EntityGenerator.kt @@ -7,7 +7,6 @@ import de.bixilon.pixlyzer.generator.Generator import de.bixilon.pixlyzer.util.ReflectionUtil.getClass import de.bixilon.pixlyzer.util.ReflectionUtil.getField import net.minecraft.entity.Entity -import net.minecraft.entity.EntityCategory import net.minecraft.entity.EntityType import net.minecraft.entity.LivingEntity import net.minecraft.entity.attribute.EntityAttribute @@ -29,12 +28,12 @@ object EntityGenerator : Generator( val entityData = JsonObject() entityData.addProperty("id", Registry.ENTITY_TYPE.getRawId(entityType)) entityType.translationKey?.let { - entityData.addProperty("description_id", it) + entityData.addProperty("translation_key", it) } - entityData.addProperty("serialize", entityType.isSaveable) - entityData.addProperty("summon", entityType.isSummonable) + entityData.addProperty("serializable", entityType.isSaveable) + entityData.addProperty("summonable", entityType.isSummonable) ENTITY_TYPE_FIRE_IMMUNE_FIELD?.getBoolean(entityType)?.let { - entityData.addProperty("fire_immune", it) + entityData.addProperty("is_fire_immune", it) } CAN_SPAWN_FAR_AWAY_FROM_PLAYER_METHOD?.invoke(entityType)?.let { entityData.addProperty("can_spawn_far_from_player", it as Boolean) @@ -55,7 +54,7 @@ object EntityGenerator : Generator( // some entities have random values, we can and will ignore these ones - entityData.addProperty("category", entityType.getEntityCategory(entity).ordinal) + // ToDo: entityData.addProperty("category", entityType.getEntityCategory(entity).ordinal) if (entity is LivingEntity && entity2 is LivingEntity) { for ((resourceLocation, attribute) in ATTRIBUTE_MAP) { @@ -193,10 +192,14 @@ object EntityGenerator : Generator( private val ATTRIBUTE_MAP: Map = getAttributes() - private val BASE_ATTRIBUTE_MAP_CLASS = getClass("net.minecraft.entity.attribute.AbstractEntityAttributeContainer")!! + private val BASE_ATTRIBUTE_MAP_CLASS = getClass("net.minecraft.entity.attribute.AttributeContainer", "net.minecraft.entity.attribute.AbstractEntityAttributeContainer")!! - private val BASE_ATTRIBUTE_MAP_GET_INSTANCE_METHOD = BASE_ATTRIBUTE_MAP_CLASS.getDeclaredMethod("createInstance", EntityAttribute::class.java) + private val BASE_ATTRIBUTE_MAP_GET_INSTANCE_METHOD = try { + BASE_ATTRIBUTE_MAP_CLASS.getDeclaredMethod("createInstance", EntityAttribute::class.java) + } catch (exception: Exception) { + BASE_ATTRIBUTE_MAP_CLASS.getDeclaredMethod("getCustomInstance", EntityAttribute::class.java) + } init { BASE_ATTRIBUTE_MAP_GET_INSTANCE_METHOD.isAccessible = true @@ -265,18 +268,3 @@ object EntityGenerator : Generator( TODO() } } - -private val CATEGORY_FIELD = getField(EntityType::class.java, "category") - -private val ENTITY_CATEGORY_GET_CATEGORY_METHOD = try { - EntityCategory::class.java.getDeclaredMethod("method_17350", Entity::class.java) -} catch (exception: Exception) { - null -} - -private fun EntityType<*>.getEntityCategory(entity: Entity): EntityCategory { - (CATEGORY_FIELD?.get(this) as EntityCategory?)?.let { - return it - } - return ENTITY_CATEGORY_GET_CATEGORY_METHOD!!.invoke(entity) as EntityCategory -} diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/ItemGenerator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/ItemGenerator.kt index 2d2ce73..288c47e 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/ItemGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/ItemGenerator.kt @@ -3,8 +3,10 @@ package de.bixilon.pixlyzer.generator.generators import com.google.gson.JsonArray import com.google.gson.JsonObject import de.bixilon.pixlyzer.generator.Generator +import de.bixilon.pixlyzer.generator.generators.enums.CreativeInventoryTabGenerator import de.bixilon.pixlyzer.util.ReflectionUtil.getClass import de.bixilon.pixlyzer.util.ReflectionUtil.getField +import de.bixilon.pixlyzer.util.ReflectionUtil.getGetter import net.minecraft.block.Block import net.minecraft.block.BlockState import net.minecraft.entity.EntityType @@ -33,7 +35,7 @@ object ItemGenerator : Generator( } itemData.addProperty("is_complex", item.isNetworkSynced) item.translationKey?.let { - itemData.addProperty("description_id", it) + itemData.addProperty("translation_key", it) } item.foodComponent?.let { itemData.add("food_properties", it.serialize()) @@ -46,7 +48,7 @@ object ItemGenerator : Generator( } if (item is ToolItem) { itemData.addProperty("uses", item.material.durability) - itemData.addProperty("speed", item.material.miningSpeed) + itemData.addProperty("speed", TOOL_ITEM_GETTER.invoke(item.material) as Float) itemData.addProperty("attack_damage_bonus", item.material.attackDamage) itemData.addProperty("level", item.material.miningLevel) itemData.addProperty("enchantment_value", item.material.enchantability) @@ -166,6 +168,8 @@ object ItemGenerator : Generator( private val MOB_BUCKED_ITEM_CLASS = getClass("net.minecraft.world.item.MobBucketItem", "net.minecraft.world.item.BucketItem") + private val TOOL_ITEM_GETTER = getGetter(ToolMaterial::class.java, "getMiningSpeed", "getMiningSpeedMultiplier")!! + private val IS_FIRE_RESISTANT_FIELD = getField(Item::class.java, "blocks") @@ -179,7 +183,7 @@ object ItemGenerator : Generator( private val MOB_BUCKED_ITEM_TYPE_FIELD = getField(MOB_BUCKED_ITEM_CLASS, "type") private val MOB_BUCKED_ITEM_EMPTY_SOUND_FIELD = getField(MOB_BUCKED_ITEM_CLASS, "emptySound") private val HOE_ITEM_TILLABLES_FIELD = HoeItem::class.java.getDeclaredField("TILLED_BLOCKS") - private val SHOVEL_ITEM_FLATTENABLES_FIELD = ShovelItem::class.java.getDeclaredField("PATH_BLOCKSTATES") + private val SHOVEL_ITEM_FLATTENABLES_FIELD = getField(ShovelItem::class.java, "PATH_STATES", "PATH_BLOCKSTATES")!! private val SPAWN_EGG_ITEM_ENTITY_TYPE_FIELD = SpawnEggItem::class.java.getDeclaredField("type") private val ARMOR_ITEM_KNOCKBACK_RESISTANCE = getField(ArmorItem::class.java, "knockbackResistance") diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MenuTypeGenerator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MenuTypeGenerator.kt deleted file mode 100644 index d4b716f..0000000 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MenuTypeGenerator.kt +++ /dev/null @@ -1,27 +0,0 @@ -package de.bixilon.pixlyzer.generator.generators - -import com.google.gson.JsonObject -import de.bixilon.pixlyzer.generator.Generator -import net.minecraft.util.registry.Registry - -object MenuTypeGenerator : Generator( - "menu_types" -) { - override fun generate() { - for (menuType in Registry.CONTAINER) { - val resourceIdentifier = Registry.CONTAINER.getId(menuType) - val menuTypeData = JsonObject() - menuTypeData.addProperty("id", Registry.CONTAINER.getRawId(menuType)) - - // val container = menuType.create(0, Inventory(DummyPlayer)) - - // if (container is ChestMenu) { - // menuTypeData.addProperty("row_count", container.rowCount) - // } - - // menuTypeData.addProperty("class", container.javaClass.simpleName) - - data.add(resourceIdentifier.toString(), menuTypeData) - } - } -} diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MobCategoryGenerator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MobCategoryGenerator.kt deleted file mode 100644 index 33097a1..0000000 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MobCategoryGenerator.kt +++ /dev/null @@ -1,23 +0,0 @@ -package de.bixilon.pixlyzer.generator.generators - -import com.google.gson.JsonObject -import de.bixilon.pixlyzer.generator.Generator -import net.minecraft.entity.EntityCategory - -object MobCategoryGenerator : Generator( - "mob categories", - "mob_categories" -) { - override fun generate() { - for (category in EntityCategory.values()) { - val categoryData = JsonObject() - - categoryData.addProperty("max_instances_per_chunk", category.spawnCap) - categoryData.addProperty("is_friendly", category.isPeaceful) - categoryData.addProperty("is_persistent", category.isAnimal) - categoryData.addProperty("name", category.name.toLowerCase()) - - data.add(category.ordinal.toString(), categoryData) - } - } -} diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MobEffectGenerator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MobEffectGenerator.kt index 53470db..0c58bd3 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MobEffectGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MobEffectGenerator.kt @@ -2,6 +2,7 @@ package de.bixilon.pixlyzer.generator.generators import com.google.gson.JsonObject import de.bixilon.pixlyzer.generator.Generator +import de.bixilon.pixlyzer.util.ReflectionUtil import net.minecraft.entity.attribute.EntityAttribute import net.minecraft.entity.attribute.EntityAttributeModifier import net.minecraft.entity.effect.StatusEffect @@ -10,8 +11,7 @@ import net.minecraft.util.registry.Registry import java.lang.reflect.Field object MobEffectGenerator : Generator( - "mob effects", - "mob_effect" + "mob_effects" ) { override fun generate() { for (mobEffect in Registry.STATUS_EFFECT) { @@ -23,7 +23,7 @@ object MobEffectGenerator : Generator( mobEffectData.addProperty("color", mobEffect.color) mobEffect.translationKey?.let { - mobEffectData.addProperty("description_id", it) + mobEffectData.addProperty("translation_key", it) } val modifiers = JsonObject() @@ -31,7 +31,7 @@ object MobEffectGenerator : Generator( val modifierData = JsonObject() modifierData.addProperty("name", modifier.name.toLowerCase()) modifierData.addProperty("uuid", modifier.id.toString()) - modifierData.addProperty("amount", modifier.amount) + modifierData.addProperty("amount", AMOUNT_ENTITY_ATTRIBUTE_MODIFIER_FIELD.getDouble(modifier)) modifierData.addProperty("operation", modifier.operation.name.toLowerCase()) modifiers.add(EntityGenerator.getKeyFromMobEffect(attribute), modifierData) @@ -47,6 +47,7 @@ object MobEffectGenerator : Generator( private val MOB_EFFECT_CATEGORY_FIELD: Field = StatusEffect::class.java.getDeclaredField("type") private val MOB_EFFECT_MODIFIERS_FIELD: Field = StatusEffect::class.java.getDeclaredField("attributeModifiers") + private val AMOUNT_ENTITY_ATTRIBUTE_MODIFIER_FIELD = ReflectionUtil.getField(EntityAttributeModifier::class.java, "amount", "value")!! init { MOB_EFFECT_CATEGORY_FIELD.isAccessible = true diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/PointOfInterestGenerator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/PointOfInterestGenerator.kt index a68950d..18c0f48 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/PointOfInterestGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/PointOfInterestGenerator.kt @@ -22,9 +22,9 @@ object PointOfInterestGenerator : Generator( val resourceIdentifier = Registry.POINT_OF_INTEREST_TYPE.getId(pointOfInterestType) val pointOfInterestData = JsonObject() pointOfInterestData.addProperty("id", Registry.POINT_OF_INTEREST_TYPE.getRawId(pointOfInterestType)) - pointOfInterestData.addProperty("max_tickets", pointOfInterestType.ticketCount) - VALID_RANGE_METHOD?.invoke(pointOfInterestType)?.let { - pointOfInterestData.addProperty("valid_range", it as Int) + pointOfInterestData.addProperty("ticket_count", pointOfInterestType.ticketCount) + SEARCH_DISTANCE_METHOD?.invoke(pointOfInterestType)?.let { + pointOfInterestData.addProperty("search_distance", it as Int) } (POINT_OF_INTEREST_MATCHING_STATES_FIELD.get(pointOfInterestType) as Set).let { @@ -43,14 +43,18 @@ object PointOfInterestGenerator : Generator( private val POINT_OF_INTEREST_MATCHING_STATES_FIELD = PointOfInterestType::class.java.getDeclaredField("blockStates") - private val VALID_RANGE_METHOD: Method? + private val SEARCH_DISTANCE_METHOD: Method? init { POINT_OF_INTEREST_MATCHING_STATES_FIELD.isAccessible = true - VALID_RANGE_METHOD = try { + SEARCH_DISTANCE_METHOD = try { PointOfInterestType::class.java.getDeclaredMethod("method_21648") } catch (exception: Exception) { - null + try { + PointOfInterestType::class.java.getDeclaredMethod("getSearchDistance") + } catch (exception: Exception) { + null + } } } } diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/StatisticsGenerator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/StatisticsGenerator.kt index fa6eb59..b53ee55 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/StatisticsGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/StatisticsGenerator.kt @@ -28,7 +28,7 @@ object StatisticsGenerator : Generator( StatFormatter.DIVIDE_BY_TEN -> "divide_by_ten" StatFormatter.DISTANCE -> "distance" StatFormatter.TIME -> "time" - else -> "other" + else -> TODO("Can not find unit ${statistic.registry}") }) val sortedStatistics: MutableSet = mutableSetOf() diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/VillagerProfessionGenerator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/VillagerProfessionGenerator.kt index 16e2193..c300121 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/VillagerProfessionGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/VillagerProfessionGenerator.kt @@ -21,7 +21,7 @@ object VillagerProfessionGenerator : Generator( villagerProfessionData.addProperty("id", Registry.VILLAGER_PROFESSION.getRawId(villagerProfession)) PointOfInterestGenerator.POINT_OF_INTEREST_REGISTRY?.let { - villagerProfessionData.addProperty("primary_point_of_interest", it.getRawId(WORK_STATION_VILLAGER_PROFESSION_TYPE_FIELD!!.get(villagerProfession))) + villagerProfessionData.addProperty("work_station", it.getRawId(WORK_STATION_VILLAGER_PROFESSION_TYPE_FIELD!!.get(villagerProfession))) } (GATHERABLE_ITEMS_FIELD?.get(villagerProfession) as ImmutableSet?)?.let { diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/VoxelShapeGenerator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/VoxelShapeGenerator.kt index 242e702..5a14051 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/VoxelShapeGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/VoxelShapeGenerator.kt @@ -3,7 +3,7 @@ package de.bixilon.pixlyzer.generator.generators import com.google.gson.JsonArray import com.google.gson.JsonObject import de.bixilon.pixlyzer.generator.Generator -import de.bixilon.pixlyzer.util.ReflectionUtil +import de.bixilon.pixlyzer.util.ReflectionUtil.getField import net.minecraft.util.math.Box import net.minecraft.util.shape.VoxelShape @@ -28,12 +28,12 @@ object VoxelShapeGenerator : Generator( } - private val VOXEL_SHAPE_FACES_FIELD = ReflectionUtil.getField(VoxelShape::class.java, "shapeCache") + private val VOXEL_SHAPE_FACES_FIELD = getField(VoxelShape::class.java, "shapeCache")!! private fun VoxelShape.serialize(): JsonObject { val json = JsonObject() - val faces = VOXEL_SHAPE_FACES_FIELD?.get(this) as Array? + val faces = VOXEL_SHAPE_FACES_FIELD.get(this) as Array? if (faces != null) { check(faces.size == 6) @@ -87,25 +87,32 @@ object VoxelShapeGenerator : Generator( } private fun Box.serialize(): JsonObject { + val minX = AABB_MIN_X_FIELD.getDouble(this) + val minY = AABB_MIN_Y_FIELD.getDouble(this) + val minZ = AABB_MIN_Z_FIELD.getDouble(this) + + val maxX = AABB_MAX_X_FIELD.getDouble(this) + val maxY = AABB_MAX_Y_FIELD.getDouble(this) + val maxZ = AABB_MAX_Z_FIELD.getDouble(this) val json = JsonObject() val from = JsonArray() - from.add(this.x1) - from.add(this.y1) - from.add(this.z1) - if (x1 == y1 && y1 == z1) { - json.addProperty("from", x1) + from.add(minX) + from.add(minY) + from.add(minZ) + if (minX == minY && minY == minZ) { + json.addProperty("from", minX) } else { json.add("from", from) } val to = JsonArray() - to.add(this.x2) - to.add(this.y2) - to.add(this.z2) + to.add(maxX) + to.add(maxY) + to.add(maxZ) - if (x2 == y2 && y2 == z2) { - json.addProperty("to", x2) + if (maxX == maxY && maxY == maxZ) { + json.addProperty("to", maxX) } else { json.add("to", to) } @@ -113,4 +120,12 @@ object VoxelShapeGenerator : Generator( return json } + private val AABB_MIN_X_FIELD = getField(Box::class.java, "minX", "x1")!! + private val AABB_MIN_Y_FIELD = getField(Box::class.java, "minY", "y1")!! + private val AABB_MIN_Z_FIELD = getField(Box::class.java, "minZ", "z1")!! + + private val AABB_MAX_X_FIELD = getField(Box::class.java, "maxX", "x2")!! + private val AABB_MAX_Y_FIELD = getField(Box::class.java, "maxY", "y2")!! + private val AABB_MAX_Z_FIELD = getField(Box::class.java, "maxZ", "z2")!! + } diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/BiomePrecipitationsGenerator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/enums/BiomePrecipitationsGenerator.kt similarity index 90% rename from src/main/kotlin/de/bixilon/pixlyzer/generator/generators/BiomePrecipitationsGenerator.kt rename to src/main/kotlin/de/bixilon/pixlyzer/generator/generators/enums/BiomePrecipitationsGenerator.kt index 5c51495..16d97a5 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/BiomePrecipitationsGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/enums/BiomePrecipitationsGenerator.kt @@ -1,4 +1,4 @@ -package de.bixilon.pixlyzer.generator.generators +package de.bixilon.pixlyzer.generator.generators.enums import com.google.gson.JsonObject import de.bixilon.pixlyzer.generator.Generator diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/CreativeInventoryTabGenerator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/enums/CreativeInventoryTabGenerator.kt similarity index 64% rename from src/main/kotlin/de/bixilon/pixlyzer/generator/generators/CreativeInventoryTabGenerator.kt rename to src/main/kotlin/de/bixilon/pixlyzer/generator/generators/enums/CreativeInventoryTabGenerator.kt index 658e95d..0789489 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/CreativeInventoryTabGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/enums/CreativeInventoryTabGenerator.kt @@ -1,20 +1,22 @@ -package de.bixilon.pixlyzer.generator.generators +package de.bixilon.pixlyzer.generator.generators.enums +import com.google.gson.JsonArray import com.google.gson.JsonObject import de.bixilon.pixlyzer.generator.Generator +import de.bixilon.pixlyzer.util.ReflectionUtil.getField import net.minecraft.item.ItemGroup +import net.minecraft.util.registry.Registry import java.lang.reflect.Field object CreativeInventoryTabGenerator : Generator( - "creative inventory tabs", - "creative_inventory_tab", + "creative_inventory_tabs" ) { override fun generate() { for (tab in ItemGroup.GROUPS) { val itemData = JsonObject() tab.getLanguageId()?.let { - itemData.addProperty("language_id", it) + itemData.addProperty("translation_key", it) } tab.name?.let { itemData.addProperty("recipe_folder_name", it) @@ -24,8 +26,22 @@ object CreativeInventoryTabGenerator : Generator( itemData.addProperty("can_scroll", tab.canScroll()) itemData.addProperty("show_title", tab.showTitle()) + itemData.addProperty("is_right_aligned", tab.isSpecial) + itemData.addProperty("is_top_row", tab.isTopRow) + itemData.addProperty("column", tab.column) + itemData.addProperty("icon", Registry.ITEM.getRawId(tab.createIcon().item)) - data.add(tab.id.toString(), itemData) + val enchantmentCategories = JsonArray() + for (enchantmentCategory in tab.enchantments) { + enchantmentCategories.add(enchantmentCategory.ordinal) + } + if (enchantmentCategories.size() > 0) { + itemData.add("enchantment_categories", enchantmentCategories) + } + + + + data.add(tab.getRawId().toString(), itemData) } } @@ -33,14 +49,13 @@ object CreativeInventoryTabGenerator : Generator( private val CATEGORY_LANGUAGE_ID_FIELD = ItemGroup::class.java.getDeclaredField("id") private val CATEGORY_BACKGROUND_SUFFIX_FIELD = ItemGroup::class.java.getDeclaredField("texture") private val CATEGORY_CAN_SCROLL_FIELD = ItemGroup::class.java.getDeclaredField("scrollbar") - private val CATEGORY_SHOW_TITLE_FIELD = ItemGroup::class.java.getDeclaredField("tooltip") + private val CATEGORY_SHOW_TITLE_FIELD = getField(ItemGroup::class.java, "renderName", "tooltip")!! init { CATEGORY_ID_FIELD.isAccessible = true CATEGORY_LANGUAGE_ID_FIELD.isAccessible = true CATEGORY_BACKGROUND_SUFFIX_FIELD.isAccessible = true CATEGORY_CAN_SCROLL_FIELD.isAccessible = true - CATEGORY_SHOW_TITLE_FIELD.isAccessible = true } diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/enums/EnchantmentTargetsGenerator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/enums/EnchantmentTargetsGenerator.kt new file mode 100644 index 0000000..1565a9a --- /dev/null +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/enums/EnchantmentTargetsGenerator.kt @@ -0,0 +1,20 @@ +package de.bixilon.pixlyzer.generator.generators.enums + +import com.google.gson.JsonObject +import de.bixilon.pixlyzer.generator.Generator +import net.minecraft.enchantment.EnchantmentTarget + +object EnchantmentTargetsGenerator : Generator( + "enchantment_targets" +) { + override fun generate() { + for (target in EnchantmentTarget.values()) { + val enchantmentTargetData = JsonObject() + + enchantmentTargetData.addProperty("name", target.name) + + data.add(target.ordinal.toString(), enchantmentTargetData) + + } + } +} diff --git a/src/main/kotlin/de/bixilon/pixlyzer/util/ReflectionUtil.kt b/src/main/kotlin/de/bixilon/pixlyzer/util/ReflectionUtil.kt index e3e3929..44fe468 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/util/ReflectionUtil.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/util/ReflectionUtil.kt @@ -2,6 +2,7 @@ package de.bixilon.pixlyzer.util import org.apache.commons.lang3.reflect.FieldUtils import java.lang.reflect.Field +import java.lang.reflect.Method object ReflectionUtil { @@ -32,6 +33,22 @@ object ReflectionUtil { return null } + fun getGetter(clazz: Class<*>?, vararg methodNames: String): Method? { + if (clazz == null) { + return null + } + for (name in methodNames) { + try { + val method = clazz.getMethod(name) + method.isAccessible = true + return method + } catch (exception: NoSuchMethodException) { + continue + } + } + return null + } + fun setFinalField(field: Field, instance: Any, value: Any) { field.isAccessible = true diff --git a/src/main/kotlin/net/fabricmc/yarn/constants/CatTypes.java b/src/main/kotlin/net/fabricmc/yarn/constants/CatTypes.java new file mode 100644 index 0000000..f927937 --- /dev/null +++ b/src/main/kotlin/net/fabricmc/yarn/constants/CatTypes.java @@ -0,0 +1,22 @@ +/* + * This file is free for everyone to use under the Creative Commons Zero license. + */ + +package net.fabricmc.yarn.constants; + +public final class CatTypes { + public static final int TABBY = 0; + public static final int BLACK = 1; + public static final int RED = 2; + public static final int SIAMESE = 3; + public static final int BRITISH_SHORTHAIR = 4; + public static final int CALICO = 5; + public static final int PERSIAN = 6; + public static final int RAGDOLL = 7; + public static final int WHITE = 8; + public static final int JELLIE = 9; + public static final int ALL_BLACK = 10; + + private CatTypes() { + } +} diff --git a/src/main/kotlin/net/fabricmc/yarn/constants/LlamaVariants.java b/src/main/kotlin/net/fabricmc/yarn/constants/LlamaVariants.java new file mode 100644 index 0000000..bc8999c --- /dev/null +++ b/src/main/kotlin/net/fabricmc/yarn/constants/LlamaVariants.java @@ -0,0 +1,15 @@ +/* + * This file is free for everyone to use under the Creative Commons Zero license. + */ + +package net.fabricmc.yarn.constants; + +public final class LlamaVariants { + public static final int CREAMY = 0; + public static final int WHITE = 1; + public static final int BROWN = 2; + public static final int GRAY = 3; + + private LlamaVariants() { + } +} diff --git a/src/main/kotlin/net/fabricmc/yarn/constants/MiningLevels.java b/src/main/kotlin/net/fabricmc/yarn/constants/MiningLevels.java new file mode 100644 index 0000000..bb8977e --- /dev/null +++ b/src/main/kotlin/net/fabricmc/yarn/constants/MiningLevels.java @@ -0,0 +1,51 @@ +/* + * This file is free for everyone to use under the Creative Commons Zero license. + */ + +package net.fabricmc.yarn.constants; + +/** + * Constants of Mining Levels. + *

Mining levels are used by blocks to determine the strength of the tools required to successfully harvest them. + *
All tool materials have an assigned mining level. If a tool's mining level is equal to or greater than the block's, + * the tool will apply its efficiency bonus and the block will drop its loot table. + *

Blocks without mining levels, or items that aren't tools, use {@link MiningLevels#HAND}. + * + * @see net.minecraft.item.ToolMaterial#getMiningLevel() ToolMaterial#getMiningLevel + */ +public final class MiningLevels { + /** + * Blocks with this level do not require a tool to harvest. + *
This is the default level for blocks and items. + */ + public static final int HAND = -1; + + /** + * Blocks with this level require a Wooden tool or better to harvest. + *
In addition to Wooden Tools, Golden Tools also use this level. + */ + public static final int WOOD = 0; + + /** + * Blocks with this level require a Stone tool or better to harvest. + */ + public static final int STONE = 1; + + /** + * Blocks with this level require an Iron tool or better to harvest. + */ + public static final int IRON = 2; + + /** + * Blocks with this level require a Diamond tool or better to harvest. + */ + public static final int DIAMOND = 3; + + /** + * Blocks with this level require a Netherite tool or better to harvest. + */ + public static final int NETHERITE = 4; + + private MiningLevels() { + } +} diff --git a/src/main/kotlin/net/fabricmc/yarn/constants/ParrotVariants.java b/src/main/kotlin/net/fabricmc/yarn/constants/ParrotVariants.java new file mode 100644 index 0000000..c1341f9 --- /dev/null +++ b/src/main/kotlin/net/fabricmc/yarn/constants/ParrotVariants.java @@ -0,0 +1,16 @@ +/* + * This file is free for everyone to use under the Creative Commons Zero license. + */ + +package net.fabricmc.yarn.constants; + +public final class ParrotVariants { + public static final int RED_AND_BLUE = 0; + public static final int BLUE = 1; + public static final int GREEN = 2; + public static final int YELLOW_AND_BLUE = 3; + public static final int GRAY = 4; + + private ParrotVariants() { + } +} diff --git a/src/main/kotlin/net/fabricmc/yarn/constants/RabbitTypes.java b/src/main/kotlin/net/fabricmc/yarn/constants/RabbitTypes.java new file mode 100644 index 0000000..580c09d --- /dev/null +++ b/src/main/kotlin/net/fabricmc/yarn/constants/RabbitTypes.java @@ -0,0 +1,18 @@ +/* + * This file is free for everyone to use under the Creative Commons Zero license. + */ + +package net.fabricmc.yarn.constants; + +public final class RabbitTypes { + public static final int BROWN = 0; + public static final int ALBINO = 1; + public static final int BLACK = 2; + public static final int SPOTTED = 3; + public static final int GOLDEN = 4; + public static final int SALT_AND_PEPPER = 5; + public static final int KILLER_BUNNY = 99; + + private RabbitTypes() { + } +} diff --git a/src/main/resources/entities_metadata_mappings.json b/src/main/resources/entities_metadata_mappings.json index af98a4d..d9695f6 100644 --- a/src/main/resources/entities_metadata_mappings.json +++ b/src/main/resources/entities_metadata_mappings.json @@ -8,7 +8,7 @@ "SILENT": "ENTITY_SILENT", "NO_GRAVITY": "ENTITY_NO_GRAVITY", "POSE": "ENTITY_POSE", - "DATA_TICKS_FROZEN": "ENTITY_TICKS_FROZEN" + "FROZEN_TICKS": "ENTITY_TICKS_FROZEN" } }, "LivingEntity": { @@ -18,7 +18,7 @@ "POTION_SWIRLS_COLOR": "LIVING_ENTITY_EFFECT_COLOR", "POTION_SWIRLS_AMBIENT": "LIVING_ENTITY_EFFECT_AMBIENCE", "STUCK_ARROW_COUNT": "LIVING_ENTITY_ARROW_COUNT", - "DATA_STINGER_COUNT_ID": "LIVING_ENTITY_ABSORPTION_HEARTS", + "STINGER_COUNT": "LIVING_ENTITY_ABSORPTION_HEARTS", "SLEEPING_POSITION": "LIVING_ENTITY_BED_POSITION" } }, @@ -30,6 +30,7 @@ "ZombieEntity": { "data": { "BABY": "ZOMBIE_IS_BABY", + "ZOMBIE_TYPE": "ZOMBIE_SPECIAL_TYPE", "field_7427": "ZOMBIE_SPECIAL_TYPE", "CONVERTING_IN_WATER": "ZOMBIE_DROWNING_CONVERSION" } @@ -73,6 +74,12 @@ "BLOCK_POS": "FALLING_BLOCK_SPAWN_POSITION" } }, + "PersistentProjectileEntity": { + "data": { + "PROJECTILE_FLAGS": "ABSTRACT_ARROW_FLAGS", + "PIERCE_LEVEL": "ABSTRACT_ARROW_PIERCE_LEVEL" + } + }, "ProjectileEntity": { "data": { "PROJECTILE_FLAGS": "ABSTRACT_ARROW_FLAGS", @@ -83,12 +90,14 @@ "FishingBobberEntity": { "data": { "HOOK_ENTITY_ID": "FISHING_HOOK_HOOKED_ENTITY", - "DATA_BITING": "FISHING_HOOK_CATCHABLE" + "DATA_BITING": "FISHING_HOOK_CATCHABLE", + "CAUGHT_FISH": "FISHING_HOOK_CATCHABLE" } }, "TridentEntity": { "data": { "LOYALTY": "THROWN_TRIDENT_LOYALTY_LEVEL", + "ENCHANTED": "THROWN_TRIDENT_FOIL", "ID_FOIL": "THROWN_TRIDENT_FOIL" } }, @@ -109,6 +118,12 @@ "SHOW_BOTTOM": "END_CRYSTAL_SHOW_BOTTOM" } }, + "EndCrystalEntity": { + "data": { + "BEAM_TARGET": "END_CRYSTAL_BEAM_TARGET", + "SHOW_BOTTOM": "END_CRYSTAL_SHOW_BOTTOM" + } + }, "WitherSkullEntity": { "data": { "CHARGED": "WITHER_SKULL_DANGEROUS" @@ -121,6 +136,13 @@ "SHOT_AT_ANGLE": "FIREWORK_ROCKET_ENTITY_SHOT_AT_ANGLE" } }, + "FireworkRocketEntity": { + "data": { + "ITEM": "FIREWORK_ROCKET_ENTITY_ITEM", + "SHOOTER_ENTITY_ID": "FIREWORK_ROCKET_ENTITY_ATTACHED_ENTITY", + "SHOT_AT_ANGLE": "FIREWORK_ROCKET_ENTITY_SHOT_AT_ANGLE" + } + }, "ItemFrameEntity": { "data": { "ITEM_STACK": "ITEM_FRAME_ITEM", @@ -183,8 +205,10 @@ "LlamaEntity": { "data": { "ATTR_STRENGTH": "LLAMA_STRENGTH", + "STRENGTH": "LLAMA_STRENGTH", "CARPET_COLOR": "LLAMA_CARPET_COLOR", - "ATTR_VARIANT": "LLAMA_VARIANT" + "ATTR_VARIANT": "LLAMA_VARIANT", + "VARIANT": "LLAMA_VARIANT" } }, "CatEntity": { @@ -236,12 +260,14 @@ }, "ParrotEntity": { "data": { - "ATTR_VARIANT": "PARROT_VARIANT" + "ATTR_VARIANT": "PARROT_VARIANT", + "VARIANT": "PARROT_VARIANT" } }, "PigEntity": { "data": { "SADDLED": "PIG_HAS_SADDLE", + "BOOST_TIME": "PIG_BOOST_TIME", "field_6815": "PIG_BOOST_TIME" } }, @@ -290,6 +316,7 @@ "BEGGING": "WOLF_IS_BEGGING", "COLLAR_COLOR": "WOLF_COLLAR_COLOR", "DATA_REMAINING_ANGER_TIME": "WOLF_ANGER_TIME", + "ANGER_TIME": "WOLF_ANGER_TIME", "WOLF_HEALTH": "WOLF_HEALTH" } }, @@ -328,7 +355,7 @@ "data": { "CARRIED_BLOCK": "ENDERMAN_CARRIED_BLOCK", "ANGRY": "ENDERMAN_IS_SCREAMING", - "DATA_STARED_AT": "ENDERMAN_IS_STARRING" + "PROVOKED": "ENDERMAN_IS_STARRING" } }, "SpellcastingIllagerEntity": { @@ -396,6 +423,11 @@ "HEAD_ROLLING_TIME_LEFT": "ABSTRACT_VILLAGER_UNHAPPY_TIMER" } }, + "MerchantEntity": { + "data": { + "HEAD_ROLLING_TIME_LEFT": "ABSTRACT_VILLAGER_UNHAPPY_TIMER" + } + }, "VillagerEntity": { "data": { "VILLAGER_DATA": "VILLAGER_VILLAGER_DATA" @@ -406,6 +438,11 @@ "ITEM": "THROWN_EYE_OF_ENDER_ITEM" } }, + "EyeOfEnderEntity": { + "data": { + "ITEM": "THROWN_EYE_OF_ENDER_ITEM" + } + }, "ThrownPotionEntity": { "data": { "ITEM_STACK": "THROWN_POTION_ITEM" @@ -436,5 +473,59 @@ "data": { "LIT": "MINECART_FURNACE_HAS_FUEL" } + }, + "BeeEntity": { + "data": { + "STATUS_TRACKER": "BEE_FLAGS", + "ANGER": "BEE_REMAINING_ANGER_TIME" + } + }, + "HoglinEntity": { + "data": { + "IMMUNE_TO_ZOMBIFICATION": "HOGLIN_IMMUNE_TO_ZOMBIFICATION", + "BABY": "HOGLIN_IS_BABY" + } + }, + "AbstractPiglinEntity": { + "data": { + "IMMUNE_TO_ZOMBIFICATION": "ABSTRACT_PIGLIN_IMMUNE_TO_ZOMBIFICATION" + } + }, + "PiglinEntity": { + "data": { + "BABY": "PIGLIN_IS_BABY", + "CHARGING": "PIGLIN_IS_CHARGING_CROSSBOW", + "DANCING": "PIGLIN_IS_DANCING", + "IMMUNE_TO_ZOMBIFICATION": "PIGLIN_IMMUNE_TO_ZOMBIFICATION" + } + }, + "ZoglinEntity": { + "data": { + "BABY": "ZOGLIN_IS_BABY" + } + }, + "StriderEntity": { + "data": { + "BOOST_TIME": "STRIDER_TIME_TO_BOOST", + "COLD": "STRIDER_IS_SUFFOCATING", + "SADDLED": "STRIDER_HAS_SADDLE" + } + }, + "AxolotlEntity": { + "data": { + "VARIANT": "AXOLOTL_VARIANT", + "PLAYING_DEAD": "AXOLOTL_PLAYING_DEAD", + "FROM_BUCKET": "AXOLOTL_FROM_BUCKET" + } + }, + "GlowSquidEntity": { + "data": { + "DARK_TICKS_REMAINING": "GLOW_SQUID_DARK_TICKS_REMAINING" + } + }, + "SkeletonEntity": { + "data": { + "CONVERTING": "SKELETON_STRAY_FREEZE_CONVERTING" + } } }