wip port yarn generator to 21w13a

This commit is contained in:
Bixilon 2021-04-05 20:02:38 +02:00
parent 71b7b75586
commit 13a6612b57
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
29 changed files with 463 additions and 175 deletions

10
pom.xml
View File

@ -15,7 +15,7 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<kotlin.code.style>official</kotlin.code.style>
<kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>
<minecraft.version>1.14.3</minecraft.version>
<minecraft.version>21w13a</minecraft.version>
</properties>
<repositories>
@ -49,14 +49,6 @@
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.22.2</version>
</plugin>
</plugins>
</build>

View File

@ -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")
}

View File

@ -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.")

View File

@ -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()

View File

@ -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,

View File

@ -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<Any>?)?.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<Triple<Identifier, Int, Biome>> {
val biomes = getField(getClass("net.minecraft.data.BuiltinRegistries", Registry::class.java.name)!!, "BIOME")!!.get(null) as Registry<Biome>
val biomes = getField(getClass("net.minecraft.util.registry.BuiltinRegistries", "net.minecraft.data.BuiltinRegistries", Registry::class.java.name)!!, "BIOME")!!.get(null) as Registry<Biome>
val ret: MutableSet<Triple<Identifier, Int, Biome>> = mutableSetOf()

View File

@ -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<Block>?)?.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<Triple<BlockEntityType<*>, Int, Identifier>> {
val registry = getField(Registry::class.java, "BLOCK_ENTITY_TYPE", "BLOCK_ENTITY")!!.get(null) as Registry<BlockEntityType<*>>
val ret: MutableSet<Triple<BlockEntityType<*>, Int, Identifier>> = mutableSetOf()
for (value in registry) {
ret.add(Triple(value as BlockEntityType<*>, registry.getRawId(value), registry.getId(value)!!))
}
return ret
}
}

View File

@ -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")

View File

@ -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))

View File

@ -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<EquipmentSlot?> {
return ENCHANTMENT_SLOTS_FIELD.get(this) as Array<EquipmentSlot?>
}
}

View File

@ -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<String, EntityAttribute> = 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
}

View File

@ -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")

View File

@ -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)
}
}
}

View File

@ -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)
}
}
}

View File

@ -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

View File

@ -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<BlockState>).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
}
}
}
}

View File

@ -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<String> = mutableSetOf()

View File

@ -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<Item>?)?.let {

View File

@ -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<VoxelShape>?
val faces = VOXEL_SHAPE_FACES_FIELD.get(this) as Array<VoxelShape>?
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")!!
}

View File

@ -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

View File

@ -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
}

View File

@ -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)
}
}
}

View File

@ -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

View File

@ -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() {
}
}

View File

@ -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() {
}
}

View File

@ -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.
* <p>Mining levels are used by blocks to determine the strength of the tools required to successfully harvest them.
* <br>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.
* <p>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.
* <br>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.
* <br>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() {
}
}

View File

@ -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() {
}
}

View File

@ -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() {
}
}

View File

@ -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"
}
}
}