From 02e842a3706f1e84817e364551c29abae15b2b23 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Thu, 8 Apr 2021 00:51:04 +0200 Subject: [PATCH] port for 21w14a down to 1.15 --- pom.xml | 4 +- .../de/bixilon/pixlyzer/EntitySpawner.kt | 25 +++++++---- .../kotlin/de/bixilon/pixlyzer/PixLyzer.kt | 14 +++++++ .../generator/generators/BiomeGenerator.kt | 32 +++++++++++--- .../generator/generators/BlockGenerator.kt | 12 ++++-- .../generators/DimensionGenerator.kt | 42 ++++++++++--------- .../generator/generators/EntityGenerator.kt | 7 +++- .../generator/generators/MaterialGenerator.kt | 7 +++- .../generator/generators/MotiveGenerator.kt | 10 +++-- .../generators/PointOfInterestGenerator.kt | 37 ++++++++-------- .../generator/generators/PotionGenerator.kt | 8 +++- .../resources/entities_metadata_mappings.json | 26 +++++++++--- wrapper/PixLyzer.py | 2 +- 13 files changed, 154 insertions(+), 72 deletions(-) diff --git a/pom.xml b/pom.xml index 60e6986..66bfdcb 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,9 @@ UTF-8 official 1.8 - 21w13a + 1.8 + 1.8 + 21w14a diff --git a/src/main/kotlin/de/bixilon/pixlyzer/EntitySpawner.kt b/src/main/kotlin/de/bixilon/pixlyzer/EntitySpawner.kt index c99288a..146f5a3 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/EntitySpawner.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/EntitySpawner.kt @@ -7,9 +7,8 @@ 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.boss.WitherEntity import net.minecraft.entity.decoration.ItemFrameEntity -import net.minecraft.entity.projectile.thrown.* import net.minecraft.scoreboard.Scoreboard import net.minecraft.world.World import net.minecraft.world.border.WorldBorder @@ -19,6 +18,12 @@ import java.util.* object EntitySpawner { + private val EGG_ENTITY_CLASS = getClass("net.minecraft.entity.thrown.ThrownEggEntity", "net.minecraft.entity.projectile.thrown.EggEntity")!! + private val SNOWBAL_ENTITY_CLASS = getClass("net.minecraft.entity.thrown.SnowballEntity", "net.minecraft.entity.projectile.thrown.SnowballEntity")!! + private val ENDER_PEARL_ENTITY_CLASS = getClass("net.minecraft.entity.thrown.ThrownEnderpearlEntity", "net.minecraft.entity.projectile.thrown.EnderPearlEntity")!! + private val EYE_OF_ENDER_ENTITY_CLASS = getClass("net.minecraft.entity.EnderEyeEntity", "net.minecraft.entity.EyeOfEnderEntity", "net.minecraft.entity.projectile.thrown.EyeOfEnderEntity")!! + private val EXPERIENCE_BOTTLE_ENTITY_CLASS = getClass("net.minecraft.entity.thrown.ThrownExperienceBottleEntity", "net.minecraft.entity.projectile.thrown.ExperienceBottleEntity")!! + private val POTION_ENTITY_ENTITY_CLASS = getClass("net.minecraft.entity.thrown.ThrownPotionEntity", "net.minecraft.entity.projectile.thrown.PotionEntity")!! fun summonEntity(entityType: EntityType<*>): Entity { when (entityType) { @@ -28,6 +33,7 @@ object EntitySpawner { EntityType.ITEM_FRAME -> return OBJENSIS.newInstance(ItemFrameEntity::class.java) as Entity } + val entity = try { ENTITY_CREATE_METHOD?.invoke(FACTORY_FIELD.get(entityType), entityType, CLIENT_LEVEL) as Entity? } catch (exception: Throwable) { @@ -42,12 +48,13 @@ object EntitySpawner { // ToDo: This crashes 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.EGG -> return OBJENSIS.newInstance(EGG_ENTITY_CLASS) as Entity + EntityType.SNOWBALL -> return OBJENSIS.newInstance(SNOWBAL_ENTITY_CLASS) as Entity + EntityType.ENDER_PEARL -> return OBJENSIS.newInstance(ENDER_PEARL_ENTITY_CLASS) as Entity + EntityType.EYE_OF_ENDER -> return OBJENSIS.newInstance(EYE_OF_ENDER_ENTITY_CLASS) as Entity + EntityType.EXPERIENCE_BOTTLE -> return OBJENSIS.newInstance(EXPERIENCE_BOTTLE_ENTITY_CLASS) as Entity + EntityType.POTION -> return OBJENSIS.newInstance(POTION_ENTITY_ENTITY_CLASS) as Entity + EntityType.WITHER -> return OBJENSIS.newInstance(WitherEntity::class.java) as Entity } TODO("Entity type: $entityType") @@ -55,7 +62,7 @@ object EntitySpawner { private val LIGHTNING_BOLT_CLASS = getClass("net.minecraft.entity.LightningEntity")!! - private val FISHING_HOOK_CLASS = getClass("net.minecraft.entity.projectile.FishingBobberEntity")!! + private val FISHING_HOOK_CLASS = getClass("net.minecraft.entity.FishingBobberEntity", "net.minecraft.entity.projectile.FishingBobberEntity")!! private val levelClass = getClass("net.minecraft.client.world.ClientWorld") diff --git a/src/main/kotlin/de/bixilon/pixlyzer/PixLyzer.kt b/src/main/kotlin/de/bixilon/pixlyzer/PixLyzer.kt index 300ad61..a687a2e 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/PixLyzer.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/PixLyzer.kt @@ -3,8 +3,11 @@ package de.bixilon.pixlyzer import com.google.gson.GsonBuilder import com.google.gson.JsonObject import de.bixilon.pixlyzer.generator.Generators +import de.bixilon.pixlyzer.util.ReflectionUtil.getClass import de.bixilon.pixlyzer.util.Util +import net.minecraft.Bootstrap import net.minecraft.MinecraftVersion +import net.minecraft.SharedConstants import net.minecraft.util.registry.Registry import java.io.File import java.io.FileInputStream @@ -57,9 +60,14 @@ object PixLyzer { } + println("Loading classes...") val classesLoadStartTime = System.currentTimeMillis() + initializeGameVersionMethod?.invoke(null) + + Bootstrap.initialize() + Util.forceClassInit(Registry::class.java) println("Class loading done in ${System.currentTimeMillis() - classesLoadStartTime}ms") @@ -157,4 +165,10 @@ object PixLyzer { minFileWriter.close() } + + val initializeGameVersionMethod = try { + getClass(SharedConstants::class.java.simpleName)?.getDeclaredMethod("method_36208") + } catch (exception: Exception) { + null + } } 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 c4d8d08..d0dd18a 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/BiomeGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/BiomeGenerator.kt @@ -63,17 +63,31 @@ 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 { + } + + if (!biomeData.has("foliage_color_override")) { // calculate color overrider try { - biomeData.addProperty("foliage_color_override", FOLIAGE_COLOR_OVERRIDE_METHOD!!.invoke(biome) as Int) + biomeData.addProperty("foliage_color_override", FOLIAGE_COLOR_AT_METHOD_METHOD!!.invoke(biome, null) as Int) } catch (exception: NullPointerException) { + try { + biomeData.addProperty("foliage_color_override", FOLIAGE_COLOR_METHOD!!.invoke(biome) as Int) + } catch (exception: NullPointerException) { + } } + } + biomeData["foliage_color_override"]?.let { + if (it.asInt == 0) { + biomeData.remove("foliage_color_override") + } + } + if (!biomeData.has("grass_color_modifier")) { try { - biomeData.addProperty("grass_color_modifier", GRASS_COLOR_OVERRIDE_METHOD!!.invoke(biome) as Int) + biomeData.addProperty("grass_color_modifier", GRASS_COLOR_OVERRIDE_METHOD!!.invoke(biome, null) as Int) } catch (exception: NullPointerException) { } - + } + if (!biomeData.has("sky_color")) { BIOME_SKY_COLOR_FIELD?.getInt(biome)?.let { biomeData.addProperty("sky_color", it) } ?: let { @@ -85,11 +99,17 @@ object BiomeGenerator : Generator( } } - private val FOLIAGE_COLOR_OVERRIDE_METHOD = try { + private val FOLIAGE_COLOR_AT_METHOD_METHOD = try { Biome::class.java.getMethod("getFoliageColorAt", BlockPos::class.java) } catch (exception: Exception) { null } + + private val FOLIAGE_COLOR_METHOD = try { + Biome::class.java.getMethod("getFoliageColor") + } catch (exception: Exception) { + null + } private val GRASS_COLOR_OVERRIDE_METHOD = try { Biome::class.java.getMethod("getGrassColorAt", BlockPos::class.java) } catch (exception: Exception) { @@ -126,7 +146,7 @@ object BiomeGenerator : Generator( private val BIOME_SKY_COLOR_FIELD = getField(Biome::class.java, "skyColor") - private val MUSIC_CLASS_EVENT_FIELD = getField(getClass("net.minecraft.sound.MusicSound"), "sound") + private val MUSIC_CLASS_EVENT_FIELD = getField(getClass("net.minecraft.sound.MusicSound"), "sound", "event") private fun getBiomes(): Set> { val biomes = getField(getClass("net.minecraft.util.registry.BuiltinRegistries", "net.minecraft.data.BuiltinRegistries", Registry::class.java.name)!!, "BIOME")!!.get(null) as Registry 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 840c25e..fdc4ad0 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/BlockGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/BlockGenerator.kt @@ -13,7 +13,6 @@ import net.minecraft.block.Blocks import net.minecraft.block.FluidBlock import net.minecraft.client.color.block.BlockColors import net.minecraft.fluid.Fluid -import net.minecraft.util.collection.IdList import net.minecraft.util.registry.Registry import net.minecraft.util.shape.VoxelShape @@ -134,8 +133,8 @@ object BlockGenerator : Generator( } val hasColorProperties = (TINT_PROPERTIES_METHOD?.invoke(DEFAULT_BLOCK_COLORS, block) as Set<*>?)?.size?.let { it > 0 } ?: let { - val blockColorProviderList = BLOCK_COLORS_PROVIDERS_ID_LIST!!.get(DEFAULT_BLOCK_COLORS) as IdList - blockColorProviderList.get(Registry.BLOCK.getRawId(block)) != null + val blockColorProviderList = BLOCK_COLORS_PROVIDERS_ID_LIST!!.get(DEFAULT_BLOCK_COLORS) + ID_LIST_GET_METHOD.invoke(blockColorProviderList, Registry.BLOCK.getRawId(block)) != null } val states = JsonObject() @@ -367,6 +366,10 @@ object BlockGenerator : Generator( } } + private val ID_LIST_CLASS = getClass("net.minecraft.util.IdList", "net.minecraft.util.collection.IdList")!! + + private val ID_LIST_GET_METHOD = ID_LIST_CLASS.getDeclaredMethod("get", Int::class.java) + private val BLOCK_COLORS_PROVIDERS_ID_LIST = getField(BlockColors::class.java, "providers") private val TINT_PROPERTIES_METHOD = try { @@ -446,7 +449,8 @@ object BlockGenerator : Generator( LARGE_COLLISION_SHAPE_FIELD.isAccessible = true } - private val BLOCK_STATE_REGISTRY: IdList = Block.STATE_IDS + private val BLOCK_STATE_REGISTRY: Iterable = Block::class.java.getDeclaredField("STATE_IDS").get(null) as Iterable + private val DEFAULT_BLOCK_COLORS = BlockColors.create() 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 bdef54d..8992731 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/DimensionGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/DimensionGenerator.kt @@ -116,9 +116,9 @@ object DimensionGenerator : Generator( private val AMBIENT_LIGHT_FIELD = getField(DIMENSION_TYPE_CLASS, "ambientLight") - private val RESOURCE_KEY_CLASS = getClass("net.minecraft.resources.ResourceKey") + private val RESOURCE_KEY_CLASS = getClass("net.minecraft.resources.ResourceKey", "net.minecraft.util.registry.RegistryKey") - private val RESOURCE_KEY_LOCATION_METHOD = RESOURCE_KEY_CLASS?.getDeclaredMethod("location") + private val RESOURCE_KEY_LOCATION_METHOD = getField(RESOURCE_KEY_CLASS, "value", "location") private val DIMENSION_BIOME_ZOOMER_FIELD = getField(DimensionType::class.java, "biomeAccessType") @@ -126,18 +126,6 @@ object DimensionGenerator : Generator( private fun getDimensions(): MutableSet> { val types: MutableSet> = mutableSetOf() - val dimensionRegistry = getField(Registry::class.java, "DIMENSION") - - dimensionRegistry?.get(null)?.let { - check(it is Registry<*>) - val registryGetKeyMethod = Registry::class.java.getDeclaredMethod("getId", Object::class.java) - val dimensionTypeGetIdMethod = DimensionType::class.java.getDeclaredMethod("getRawId") - for (entry in it) { - check(entry is DimensionType) - types.add(Triple(registryGetKeyMethod.invoke(it, entry) as Identifier, dimensionTypeGetIdMethod.invoke(entry) as Int, entry)) - - } - } if (types.isEmpty()) { for (field in DimensionType::class.java.declaredFields) { @@ -149,23 +137,37 @@ object DimensionGenerator : Generator( } field.isAccessible = true val resourceLocation = when (field.name) { - "OVERWORLD", "OVERLORD" -> Identifier("overworld") + "OVERWORLD", "OVERLORD", "field_25407" -> Identifier("overworld") "OVERWORLD_CAVES" -> Identifier("overworld_caves") - "THE_NETHER" -> Identifier("the_nether") - "THE_END" -> Identifier("the_end") + "THE_NETHER", "_NETHER" -> Identifier("the_nether") + "THE_END", "_END" -> Identifier("the_end") else -> TODO("Can not find dimension ${field.name}") } types.add(Triple(resourceLocation, null, field.get(null) as DimensionType)) } } if (types.isEmpty()) { - val field = getField(DimensionType::class.java, "BUILTIN") ?: return types + val field = getField(DimensionType::class.java, "field_24759", "BUILTIN") ?: return types - for ((resourceLocation, dimension) in field.get(null) as Map) { - types.add(Triple(RESOURCE_KEY_LOCATION_METHOD!!.invoke(resourceLocation) as Identifier, null, dimension)) + for ((resourceKey, dimension) in field.get(null) as Map) { + types.add(Triple(RESOURCE_KEY_LOCATION_METHOD!!.get(resourceKey) as Identifier, null, dimension)) } } + if (types.isEmpty()) { + val dimensionRegistry = getField(Registry::class.java, "DIMENSION") + + dimensionRegistry?.get(null)?.let { + check(it is Registry<*>) + val registryGetKeyMethod = Registry::class.java.getDeclaredMethod("getId", Object::class.java) + val dimensionTypeGetIdMethod = DimensionType::class.java.getDeclaredMethod("getRawId") + for (entry in it) { + check(entry is DimensionType) + types.add(Triple(registryGetKeyMethod.invoke(it, entry) as Identifier, dimensionTypeGetIdMethod.invoke(entry) as Int, entry)) + + } + } + } return types } 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 ca21fba..63eab15 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/EntityGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/EntityGenerator.kt @@ -36,6 +36,7 @@ object EntityGenerator : Generator( ENTITY_TYPE_FIRE_IMMUNE_FIELD?.getBoolean(entityType)?.let { 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) } @@ -161,6 +162,8 @@ object EntityGenerator : Generator( private fun correctClassName(className: String): String { return when (className) { "AgableMob" -> "AgeableMob" + "class_4985" -> "StriderEntity" + "class_4836" -> "PiglinEntity" else -> className } } @@ -196,7 +199,7 @@ object EntityGenerator : Generator( private val ENTITY_TYPE_FIRE_IMMUNE_FIELD = getField(EntityType::class.java, "fireImmune") - private val ATTRIBUTE_CLASS = getClass("net.minecraft.world.entity.ai.attributes.Attributes", "net.minecraft.world.entity.monster.SharedMonsterAttributes", "net.minecraft.entity.attribute.EntityAttributes")!! + private val ATTRIBUTE_CLASS = getClass("net.minecraft.entity.attribute.Attributes", "net.minecraft.world.entity.ai.attributes.Attributes", "net.minecraft.world.entity.monster.SharedMonsterAttributes", "net.minecraft.entity.attribute.EntityAttributes")!! private val ATTRIBUTE_MAP: Map = getAttributes() @@ -258,7 +261,7 @@ object EntityGenerator : Generator( ret[it.invoke(attribute) as String] = attribute } ?: let { val registry = attributeRegistryField!!.get(null) as Registry<*> - val method = attributeRegistryField.type.getMethod("getKey", Object::class.java) + val method = attributeRegistryField.type.getMethod("getId", Object::class.java) var key = method.invoke(registry, attribute) if (key is Optional<*>) { key = key.get() diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MaterialGenerator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MaterialGenerator.kt index 68699b1..d0efffd 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MaterialGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MaterialGenerator.kt @@ -13,7 +13,9 @@ object MaterialGenerator : Generator( override fun generate() { for ((resourceLocation, material) in MATERIALS) { val materialData = JsonObject() - materialData.addProperty("color", material.color.color) + val color = MATERIAL_GET_COLOR_METHOD.invoke(material) + val colorColor = color::class.java.getDeclaredField("color").getInt(color) + materialData.addProperty("color", colorColor) materialData.addProperty("push_reaction", material.pistonBehavior.name.toLowerCase()) materialData.addProperty("blocks_motion", material.blocksMovement()) materialData.addProperty("flammable", material.isBurnable) @@ -27,6 +29,9 @@ object MaterialGenerator : Generator( } } + private val MATERIAL_GET_COLOR_METHOD = Material::class.java.getDeclaredMethod("getColor") + + private fun getMaterials(): HashBiMap { val materials: HashBiMap = HashBiMap.create() for (field in Material::class.java.declaredFields) { diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MotiveGenerator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MotiveGenerator.kt index f54b1f7..43c082a 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MotiveGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MotiveGenerator.kt @@ -2,16 +2,18 @@ package de.bixilon.pixlyzer.generator.generators import com.google.gson.JsonObject import de.bixilon.pixlyzer.generator.Generator +import de.bixilon.pixlyzer.util.ReflectionUtil.getField +import net.minecraft.entity.decoration.painting.PaintingMotive import net.minecraft.util.registry.Registry object MotiveGenerator : Generator( "motives" ) { override fun generate() { - for (motive in Registry.PAINTING_MOTIVE) { - val resourceIdentifier = Registry.PAINTING_MOTIVE.getId(motive) + for (motive in MOTIVE_REGISTRY) { + val resourceIdentifier = MOTIVE_REGISTRY.getId(motive) val motiveData = JsonObject() - motiveData.addProperty("id", Registry.PAINTING_MOTIVE.getRawId(motive)) + motiveData.addProperty("id", MOTIVE_REGISTRY.getRawId(motive)) motiveData.addProperty("width", motive.width) motiveData.addProperty("height", motive.height) @@ -19,4 +21,6 @@ object MotiveGenerator : Generator( data.add(resourceIdentifier.toString(), motiveData) } } + + val MOTIVE_REGISTRY = getField(Registry::class.java, "PAINTING_MOTIVE", "MOTIVE")!!.get(null) as Registry } 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 18c0f48..c7a7d02 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/PointOfInterestGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/PointOfInterestGenerator.kt @@ -3,11 +3,11 @@ 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.getClass +import de.bixilon.pixlyzer.util.ReflectionUtil.getField import net.minecraft.block.Block import net.minecraft.block.BlockState import net.minecraft.util.registry.Registry -import net.minecraft.world.poi.PointOfInterestType import java.lang.reflect.Method object PointOfInterestGenerator : Generator( @@ -18,16 +18,16 @@ object PointOfInterestGenerator : Generator( throw IllegalArgumentException("Not available in this version yet!") } - for (pointOfInterestType in Registry.POINT_OF_INTEREST_TYPE) { - val resourceIdentifier = Registry.POINT_OF_INTEREST_TYPE.getId(pointOfInterestType) + for (pointOfInterestType in POINT_OF_INTEREST_REGISTRY) { + val resourceIdentifier = POINT_OF_INTEREST_REGISTRY.getId(pointOfInterestType)!! val pointOfInterestData = JsonObject() - pointOfInterestData.addProperty("id", Registry.POINT_OF_INTEREST_TYPE.getRawId(pointOfInterestType)) - pointOfInterestData.addProperty("ticket_count", pointOfInterestType.ticketCount) + pointOfInterestData.addProperty("id", POINT_OF_INTEREST_REGISTRY.getRawId(pointOfInterestType)) + // ToDo: 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 { + (POINT_OF_INTEREST_MATCHING_STATES_FIELD?.get(pointOfInterestType) as Set?)?.let { val states = JsonArray() for (state in it) { states.add(Block.getRawIdFromState(state)) @@ -39,22 +39,21 @@ object PointOfInterestGenerator : Generator( } } - val POINT_OF_INTEREST_REGISTRY = ReflectionUtil.getField(Registry::class.java, "POINT_OF_INTEREST_TYPE")?.get(null) as Registry? - private val POINT_OF_INTEREST_MATCHING_STATES_FIELD = PointOfInterestType::class.java.getDeclaredField("blockStates") + val POINT_OF_INTEREST_REGISTRY = getField(Registry::class.java, "POINT_OF_INTEREST_TYPE")?.get(null) as Registry? - private val SEARCH_DISTANCE_METHOD: Method? + val POINT_OF_INTEREST_CLASS = getClass("net.minecraft.world.poi.PointOfInterestType", "net.minecraft.village.PointOfInterestType") - init { - POINT_OF_INTEREST_MATCHING_STATES_FIELD.isAccessible = true - SEARCH_DISTANCE_METHOD = try { - PointOfInterestType::class.java.getDeclaredMethod("method_21648") + private val POINT_OF_INTEREST_MATCHING_STATES_FIELD = getField(POINT_OF_INTEREST_CLASS, "blockStates") + + private val SEARCH_DISTANCE_METHOD: Method? = try { + POINT_OF_INTEREST_CLASS?.getDeclaredMethod("method_21648") + } catch (exception: Exception) { + try { + POINT_OF_INTEREST_CLASS?.getDeclaredMethod("getSearchDistance") } catch (exception: Exception) { - try { - PointOfInterestType::class.java.getDeclaredMethod("getSearchDistance") - } catch (exception: Exception) { - null - } + null } } + } diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/PotionGenerator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/PotionGenerator.kt index 6be8eeb..87666c2 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/PotionGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/PotionGenerator.kt @@ -3,7 +3,9 @@ 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.entity.effect.StatusEffectInstance +import net.minecraft.potion.Potion import net.minecraft.util.registry.Registry object PotionGenerator : Generator( @@ -16,7 +18,9 @@ object PotionGenerator : Generator( potionData.addProperty("id", Registry.POTION.getRawId(potion)) - potionData.addProperty("name", potion.finishTranslationKey("")) + (POTION_NAME_FIELD.get(potion) as String?)?.let { + potionData.addProperty("name", it) + } val effects = JsonArray() @@ -31,6 +35,8 @@ object PotionGenerator : Generator( } } + val POTION_NAME_FIELD = getField(Potion::class.java, "baseName", "name")!! + private fun StatusEffectInstance.serialize(): JsonObject { val mobEffect = JsonObject() diff --git a/src/main/resources/entities_metadata_mappings.json b/src/main/resources/entities_metadata_mappings.json index d9695f6..8f3927d 100644 --- a/src/main/resources/entities_metadata_mappings.json +++ b/src/main/resources/entities_metadata_mappings.json @@ -84,6 +84,7 @@ "data": { "PROJECTILE_FLAGS": "ABSTRACT_ARROW_FLAGS", "PIERCE_LEVEL": "ABSTRACT_ARROW_PIERCE_LEVEL", + "OPTIONAL_UUID": "ABSTRACT_ARROW_OWNER_UUID", "field_7580": "ABSTRACT_ARROW_OWNER_UUID" } }, @@ -98,7 +99,8 @@ "data": { "LOYALTY": "THROWN_TRIDENT_LOYALTY_LEVEL", "ENCHANTED": "THROWN_TRIDENT_FOIL", - "ID_FOIL": "THROWN_TRIDENT_FOIL" + "ID_FOIL": "THROWN_TRIDENT_FOIL", + "field_21514": "THROWN_TRIDENT_FOIL" } }, "BoatEntity": { @@ -317,6 +319,7 @@ "COLLAR_COLOR": "WOLF_COLLAR_COLOR", "DATA_REMAINING_ANGER_TIME": "WOLF_ANGER_TIME", "ANGER_TIME": "WOLF_ANGER_TIME", + "field_25373": "WOLF_ANGER_TIME", "WOLF_HEALTH": "WOLF_HEALTH" } }, @@ -355,7 +358,8 @@ "data": { "CARRIED_BLOCK": "ENDERMAN_CARRIED_BLOCK", "ANGRY": "ENDERMAN_IS_SCREAMING", - "PROVOKED": "ENDERMAN_IS_STARRING" + "PROVOKED": "ENDERMAN_IS_STARRING", + "field_20618": "ENDERMAN_IS_STARRING" } }, "SpellcastingIllagerEntity": { @@ -476,8 +480,10 @@ }, "BeeEntity": { "data": { + "multipleByteTracker": "BEE_FLAGS", "STATUS_TRACKER": "BEE_FLAGS", - "ANGER": "BEE_REMAINING_ANGER_TIME" + "ANGER": "BEE_REMAINING_ANGER_TIME", + "anger": "BEE_REMAINING_ANGER_TIME" } }, "HoglinEntity": { @@ -494,9 +500,15 @@ "PiglinEntity": { "data": { "BABY": "PIGLIN_IS_BABY", + "field_22377": "PIGLIN_IS_BABY", "CHARGING": "PIGLIN_IS_CHARGING_CROSSBOW", + "field_22378": "PIGLIN_IS_CHARGING_CROSSBOW", "DANCING": "PIGLIN_IS_DANCING", - "IMMUNE_TO_ZOMBIFICATION": "PIGLIN_IMMUNE_TO_ZOMBIFICATION" + "dancing": "PIGLIN_IS_DANCING", + "field_25164": "PIGLIN_IS_DANCING", + "IMMUNE_TO_ZOMBIFICATION": "PIGLIN_IMMUNE_TO_ZOMBIFICATION", + "field_22419": "PIGLIN_IMMUNE_TO_ZOMBIFICATION", + "OLD_IMMUNE_TO_ZOMBIFICATION": "PIGLIN_IMMUNE_TO_ZOMBIFICATION" } }, "ZoglinEntity": { @@ -508,7 +520,10 @@ "data": { "BOOST_TIME": "STRIDER_TIME_TO_BOOST", "COLD": "STRIDER_IS_SUFFOCATING", - "SADDLED": "STRIDER_HAS_SADDLE" + "SADDLED": "STRIDER_HAS_SADDLE", + "field_23245": "STRIDER_TIME_TO_BOOST", + "field_23246": "STRIDER_IS_SUFFOCATING", + "field_23247": "STRIDER_HAS_SADDLE" } }, "AxolotlEntity": { @@ -525,6 +540,7 @@ }, "SkeletonEntity": { "data": { + "field_28642": "SKELETON_STRAY_FREEZE_CONVERTING", "CONVERTING": "SKELETON_STRAY_FREEZE_CONVERTING" } } diff --git a/wrapper/PixLyzer.py b/wrapper/PixLyzer.py index 868c48f..b826f1c 100755 --- a/wrapper/PixLyzer.py +++ b/wrapper/PixLyzer.py @@ -210,7 +210,7 @@ for version in VERSION_MANIFEST["versions"]: versionStartTime = datetime.now() print("Generating data for %s" % version["id"]) # execute - if runAndWait("%s -classpath \"%s:%s:%s:%s\" de.bixilon.pixlyzer.PixLyzer \"%s\" \"%s\" \"%s\"" % (JAVA_PATH, ADDITIONAL_CLASSPATH, DATA_FOLDER + version["id"] + "_yarn/" + version["id"] + "-named.jar", DATA_FOLDER + version["id"] + "_yarn/" + version["id"] + "_server_mojang.jar", "target/classes", OUT_FOLDER + version["id"], HASH_FOLDER, ASSETS_HASH_INDEX_FILE)) != 0: + if runAndWait("%s -Xverify:none -classpath \"%s:%s:%s:%s\" de.bixilon.pixlyzer.PixLyzer \"%s\" \"%s\" \"%s\"" % (JAVA_PATH, ADDITIONAL_CLASSPATH, DATA_FOLDER + version["id"] + "_yarn/" + version["id"] + "-named.jar", DATA_FOLDER + version["id"] + "_yarn/" + version["id"] + "_server_mojang.jar", "target/classes", OUT_FOLDER + version["id"], HASH_FOLDER, ASSETS_HASH_INDEX_FILE)) != 0: print("PixLyzer did not run successfully for %s" % version["id"]) break