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