diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/Generators.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/Generators.kt index 819bbd8..d58ff06 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/Generators.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/Generators.kt @@ -10,6 +10,7 @@ import de.bixilon.pixlyzer.generator.generators.variants.FrogVariantGenerator object Generators { val GENERATORS: List = mutableListOf( + FeatureGenerator, MessageTypeGenerator, ArgumentTypeGenerator, SoundGroupGenerator, 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 e84a6dd..175fc13 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/BlockGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/BlockGenerator.kt @@ -2,6 +2,7 @@ package de.bixilon.pixlyzer.generator.generators import de.bixilon.pixlyzer.EntitySpawner import de.bixilon.pixlyzer.generator.Generator +import de.bixilon.pixlyzer.generator.generators.FeatureGenerator.serializeFeatureSet import de.bixilon.pixlyzer.generator.generators.VoxelShapeGenerator.serialize import de.bixilon.pixlyzer.util.ReflectionUtil.getClass import de.bixilon.pixlyzer.util.ReflectionUtil.getField @@ -122,14 +123,18 @@ object BlockGenerator : Generator( Blocks.WATER, Blocks.BUBBLE_COLUMN, Blocks.CAULDRON, waterCauldronBlock -> { blockData["tint"] = "minecraft:water_tint" } + Blocks.SUGAR_CANE -> { blockData["tint"] = "minecraft:sugar_cane_tint" } + Blocks.LILY_PAD -> { blockData["tint"] = "minecraft:lily_pad_tint" } } + REQUIRED_FEATURES?.get(block)?.serializeFeatureSet()?.let { blockData["features"] = it } + for (state in stateMap[block]!!) { val stateData = compound() @@ -400,6 +405,8 @@ object BlockGenerator : Generator( private val VELOCITY_MULTIPLIER_FIELD = getField(Block::class.java, "velocityMultiplier") private val JUMP_VELOCITY_MULTIPLIER_FIELD = getField(Block::class.java, "jumpVelocityMultiplier") + private val REQUIRED_FEATURES = getField(getClass("net.minecraft.block.AbstractBlock"), "requiredFeatures") + init { BLOCK_STATE_CACHE_FIELD.isAccessible = true 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 6b13967..13cca89 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/EntityGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/EntityGenerator.kt @@ -3,6 +3,7 @@ package de.bixilon.pixlyzer.generator.generators import de.bixilon.pixlyzer.EntitySpawner import de.bixilon.pixlyzer.PixLyzer import de.bixilon.pixlyzer.generator.Generator +import de.bixilon.pixlyzer.generator.generators.FeatureGenerator.serializeFeatureSet import de.bixilon.pixlyzer.util.ReflectionUtil.getClass import de.bixilon.pixlyzer.util.ReflectionUtil.getField import de.bixilon.pixlyzer.util.ReflectionUtil.getGetter @@ -47,6 +48,8 @@ object EntityGenerator : Generator( entityType.getLootTableId()?.let { entityData["loot_table"] = it.toString() } + REQUIRED_FEATURES?.get(entityType)?.serializeFeatureSet()?.let { entityData["features"] = it } + getEntitySize(entityType).let { entityData["width"] = it.first @@ -240,6 +243,8 @@ object EntityGenerator : Generator( private val ENTITY_WIDTH_FIELD = getField(EntityType::class.java, "field_17488") private val ENTITY_HEIGHT_FIELD = getField(EntityType::class.java, "field_17489") + private val REQUIRED_FEATURES = getField(EntityType::class.java, "requiredFeatures") + private fun getEntitySize(entityType: EntityType<*>): Triple { ENTITY_DIMENSION_CLASS?.let { val dimension = ENTITY_DIMENSION_FIELD!!.get(entityType) diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/FeatureGenerator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/FeatureGenerator.kt new file mode 100644 index 0000000..a4a8ce0 --- /dev/null +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/FeatureGenerator.kt @@ -0,0 +1,50 @@ +package de.bixilon.pixlyzer.generator.generators + +import de.bixilon.pixlyzer.generator.Generator +import de.bixilon.pixlyzer.util.ReflectionUtil.getClass +import de.bixilon.pixlyzer.util.ReflectionUtil.getField +import de.bixilon.pixlyzer.util.Util.compound +import net.minecraft.util.Identifier + +object FeatureGenerator : Generator( + "features", + allowEmpty = true, +) { + private val FEATURE_MANAGER = getField(getClass("net.minecraft.resource.featuretoggle.FeatureFlags"), "FEATURE_MANAGER")?.get(null) + private val FEATURE_SET = getClass("net.minecraft.resource.featuretoggle.FeatureSet") + private val FEATURE_SET_UNIVERSE = getField(FEATURE_SET, "universe") + private val FEATURE_SET_MASK = getField(FEATURE_SET, "featuresMask") + + override fun generate() { + if (FEATURE_MANAGER == null) { + return + } + val map = getField(FEATURE_MANAGER::class.java, "featureFlags")!!.get(FEATURE_MANAGER) as Map + + var index = 0 + for ((identifier, flag) in map) { + val data = compound() + data["id"] = index++ + data["mask"] = getField(flag::class.java, "mask")!!.getLong(flag) + data["universe"] = getField(flag::class.java, "universe")!!.get(flag).toString() + this.data[identifier.toString()] = data + } + } + + fun Any?.serializeFeatureSet(): Any? { + if (this == null) { + return null + } + val mask = FEATURE_SET_MASK!!.getLong(this) + if (mask == 0L) { + return null + } + val universe = FEATURE_SET_UNIVERSE!!.get(this).toString() + + return mapOf( + "universe" to universe, + "mask" to mask, + ) + } +} + 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 f665180..66a11ef 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/ItemGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/ItemGenerator.kt @@ -2,6 +2,7 @@ package de.bixilon.pixlyzer.generator.generators import de.bixilon.pixlyzer.PixLyzer import de.bixilon.pixlyzer.generator.Generator +import de.bixilon.pixlyzer.generator.generators.FeatureGenerator.serializeFeatureSet import de.bixilon.pixlyzer.generator.generators.enums.CreativeInventoryTabGenerator import de.bixilon.pixlyzer.util.ReflectionUtil.getClass import de.bixilon.pixlyzer.util.ReflectionUtil.getField @@ -51,6 +52,8 @@ object ItemGenerator : Generator( } // itemData["default_destroy_speed"] = item.getDestroySpeed(ItemStack.EMPTY, Registry.BLOCK.get(Registry.BLOCK.defaultKey.defaultBlockState())) + REQUIRED_FEATURES?.get(item)?.serializeFeatureSet()?.let { itemData["features"] = it } + if (item is BlockItem) { itemData["block"] = Registry.BLOCK.getRawId(item.block) @@ -264,6 +267,8 @@ object ItemGenerator : Generator( private val SPAWN_EGG_ITEM_ENTITY_TYPE_FIELD = SpawnEggItem::class.java.getDeclaredField("type") private val ARMOR_ITEM_KNOCKBACK_RESISTANCE = getField(ArmorItem::class.java, "knockbackResistance") + private val REQUIRED_FEATURES = getField(Item::class.java, "requiredFeatures") + init { DIGGER_ITEM_BLOCKS_FIELD.isAccessible = true DIGGER_ITEM_SPEED_FIELD.isAccessible = true