more data: items, block entity, mobs, stats, ...

This commit is contained in:
Bixilon 2021-02-21 15:01:35 +01:00
parent 25ad62c612
commit 802f3a650a
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
17 changed files with 897 additions and 15 deletions

View File

@ -11,6 +11,8 @@ import java.io.FileWriter
object PixLyzer {
private val startTime = System.currentTimeMillis()
val ENTITY_META_DATA_MAPPING = Util.readJsonResource("entities_metadata_mappings.json")
private val GSON = GsonBuilder()
.create()

View File

@ -0,0 +1,18 @@
package de.bixilon.pixlyzer.dummy
import de.bixilon.pixlyzer.dummy.chunk.DummyGameProfile
import de.bixilon.pixlyzer.dummy.chunk.DummyLevel
import net.minecraft.world.entity.player.Player
object DummyPlayer : Player(
DummyLevel,
DummyGameProfile
) {
override fun isSpectator(): Boolean {
return false
}
override fun isCreative(): Boolean {
return false
}
}

View File

@ -0,0 +1,6 @@
package de.bixilon.pixlyzer.dummy.chunk
import com.mojang.authlib.GameProfile
import java.util.*
object DummyGameProfile : GameProfile(UUID.randomUUID(), "dummy")

View File

@ -0,0 +1,44 @@
package de.bixilon.pixlyzer.generator
import com.google.gson.JsonArray
import com.google.gson.JsonObject
import net.minecraft.core.Registry
import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.entity.BlockEntityType
object BlockEntityGenerator : Generator(
"block_entities"
) {
override fun generate() {
for (blockEntityType in Registry.BLOCK_ENTITY_TYPE) {
val resourceIdentifier = Registry.BLOCK_ENTITY_TYPE.getKey(blockEntityType)
val blockEntityData = JsonObject()
blockEntityData.addProperty("id", Registry.BLOCK_ENTITY_TYPE.getId(blockEntityType))
(BLOCK_ENTITY_VALID_BLOCKS_FIELD.get(blockEntityType) as Set<Block>).let {
val blockTypes = JsonArray()
for (block in it) {
blockTypes.add(Registry.BLOCK.getId(block))
}
if (blockTypes.size() > 0) {
blockEntityData.add("valid_blocks", blockTypes)
}
}
val blockEntity = blockEntityType.create()!!
blockEntityData.addProperty("class", blockEntity::class.java.simpleName)
data.add(resourceIdentifier.toString(), blockEntityData)
}
}
private val BLOCK_ENTITY_VALID_BLOCKS_FIELD = BlockEntityType::class.java.getDeclaredField("validBlocks")
init {
BLOCK_ENTITY_VALID_BLOCKS_FIELD.isAccessible = true
}
}

View File

@ -49,10 +49,6 @@ object BlockGenerator : Generator(
val colorProperties = DEFAULT_BLOCK_COLORS.getColoringProperties(block)
if (resourceIdentifier.toString() == "minecraft:oak_leaves") {
println()
}
// tints
when (block) {
Blocks.LARGE_FERN, Blocks.TALL_GRASS -> {
@ -111,19 +107,19 @@ object BlockGenerator : Generator(
try {
val int = propertyValueName.toInt()
propertyData.addProperty(property.name, int)
propertyData.addProperty(property.name.toLowerCase(), int)
continue
} catch (exception: Exception) {
}
try {
val boolean = propertyValueName.toBoolean()
propertyData.addProperty(property.name, boolean)
propertyData.addProperty(property.name.toLowerCase(), boolean)
continue
} catch (exception: Exception) {
}
propertyData.addProperty(property.name, propertyValueName)
propertyData.addProperty(property.name.toLowerCase(), propertyValueName)
}

View File

@ -20,7 +20,7 @@ object EnchantmentGenerator : Generator(
enchantment.descriptionId?.let {
enchantmentData.addProperty("description_id", it)
}
enchantmentData.addProperty("rarity", enchantment.rarity.name.toLowerCase())
enchantmentData.addProperty("rarity", enchantment.rarity.ordinal)
enchantment.category?.let {
enchantmentData.addProperty("category", it.name.toLowerCase())

View File

@ -0,0 +1,173 @@
package de.bixilon.pixlyzer.generator
import com.google.gson.JsonObject
import de.bixilon.pixlyzer.PixLyzer
import de.bixilon.pixlyzer.dummy.DummyPlayer
import de.bixilon.pixlyzer.dummy.chunk.DummyLevel
import net.minecraft.core.BlockPos
import net.minecraft.core.Registry
import net.minecraft.network.syncher.EntityDataAccessor
import net.minecraft.resources.ResourceLocation
import net.minecraft.world.entity.Entity
import net.minecraft.world.entity.EntityType
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.MobSpawnType
import net.minecraft.world.entity.fishing.FishingHook
import net.minecraft.world.entity.global.LightningBolt
import net.minecraft.world.entity.monster.SharedMonsterAttributes
object EntityGenerator : Generator(
"entities"
) {
private val entityClassMappings: MutableMap<Class<out Entity>, ResourceLocation> = mutableMapOf()
override fun generate() {
for (entityType in Registry.ENTITY_TYPE) {
val resourceIdentifier = Registry.ENTITY_TYPE.getKey(entityType)
val entityData = JsonObject()
entityData.addProperty("id", Registry.ENTITY_TYPE.getId(entityType))
entityType.descriptionId?.let {
entityData.addProperty("description_id", it)
}
entityData.addProperty("category", entityType.category.ordinal)
entityData.addProperty("serialize", entityType.canSerialize())
entityData.addProperty("summon", entityType.canSummon())
entityData.addProperty("fire_immune", entityType.fireImmune())
entityData.addProperty("can_spawn_far_from_player", entityType.canSpawnFarFromPlayer())
entityType.defaultLootTable?.let {
entityData.addProperty("loot_table", it.toString())
}
entityData.addProperty("width", entityType.dimensions.width)
entityData.addProperty("height", entityType.dimensions.height)
entityData.addProperty("size_fixed", entityType.dimensions.fixed)
val entity = summonEntity(entityType)
if (entity is LivingEntity) {
entity.attributes.getInstance(SharedMonsterAttributes.MAX_HEALTH)?.value?.let {
entityData.addProperty("max_health", it)
}
entity.attributes.getInstance(SharedMonsterAttributes.FOLLOW_RANGE)?.value?.let {
entityData.addProperty("follow_range", it)
}
entity.attributes.getInstance(SharedMonsterAttributes.MOVEMENT_SPEED)?.value?.let {
entityData.addProperty("movement_speed", it)
}
entity.attributes.getInstance(SharedMonsterAttributes.FLYING_SPEED)?.value?.let {
entityData.addProperty("flying_speed", it)
}
entity.attributes.getInstance(SharedMonsterAttributes.ATTACK_DAMAGE)?.value?.let {
entityData.addProperty("attack_damage", it)
}
entity.attributes.getInstance(SharedMonsterAttributes.ARMOR)?.value?.let {
entityData.addProperty("armor", it)
}
entity.attributes.getInstance(SharedMonsterAttributes.ARMOR_TOUGHNESS)?.value?.let {
entityData.addProperty("armor_toughness", it)
}
entity.attributes.getInstance(SharedMonsterAttributes.LUCK)?.value?.let {
entityData.addProperty("luck", it)
}
}
val entityClass = entity::class.java
entityData.addProperty("class", entityClass.simpleName)
entityClassMappings[entityClass] = resourceIdentifier
data.add(resourceIdentifier.toString(), entityData)
}
// resolve parents and meta data
for (entityType in Registry.ENTITY_TYPE) {
val entity: Entity
try {
entity = summonEntity(entityType)
} catch (exception: Exception) {
continue
}
val entityClass = entity::class.java
val entityData = data[Registry.ENTITY_TYPE.getKey(entityType).toString()]!!.asJsonObject
generateMetaDataForParents(entityClass, entityData, data)
}
}
private fun generateMetaDataForParents(clazz: Class<out Entity>, entityData: JsonObject, data: JsonObject) {
if (entityData.has("parent")) {
return
}
generateMetaData(clazz).let {
if (it.size() > 0) {
entityData.add("meta", it)
}
}
val superClass: Class<*> = clazz.superclass
if (superClass != Object::class.java) {
entityData.addProperty("parent", correctClassName(superClass.simpleName))
val parentEntityName = if (entityClassMappings[superClass] == null) {
// abstract class
correctClassName(superClass.simpleName)
} else {
entityClassMappings[superClass].toString()
}
var parentData: JsonObject? = data[parentEntityName]?.asJsonObject
if (parentData == null) {
parentData = JsonObject()
data.add(parentEntityName, parentData)
}
generateMetaDataForParents(superClass as Class<out Entity>, parentData, data)
}
}
private fun correctClassName(className: String): String {
return when (className) {
"AgableMob" -> "AgeableMob"
else -> className
}
}
private fun generateMetaData(clazz: Class<out Entity>): JsonObject {
val json = JsonObject()
for (field in clazz.declaredFields) {
if (field.type != EntityDataAccessor::class.java) {
continue
}
field.isAccessible = true
val dataAccessor: EntityDataAccessor<*> = field.get(null) as EntityDataAccessor<*>
val entityClazzData = PixLyzer.ENTITY_META_DATA_MAPPING[correctClassName(clazz.simpleName)]?.asJsonObject ?: error(correctClassName(clazz.simpleName))
val entityData = entityClazzData["data"].asJsonObject
val realFieldName = entityData[field.name].asString
json.addProperty(realFieldName, dataAccessor.id)
}
return json
}
private fun summonEntity(entityType: EntityType<*>): Entity {
var entity = entityType.spawn(DummyLevel, null, DummyPlayer, BlockPos(0, 0, 0), MobSpawnType.COMMAND, true, true)
if (entity == null) {
entity = when (entityType) {
EntityType.PLAYER -> DummyPlayer
EntityType.LIGHTNING_BOLT -> LightningBolt(DummyLevel, 0.0, 0.0, 0.0, false)
EntityType.FISHING_BOBBER -> FishingHook(DummyPlayer, DummyLevel, 0, 0)
else -> entity
}
}
if (entity == null) {
error("Can not spawn entity ${Registry.ENTITY_TYPE.getKey(entityType)}")
}
return entity
}
}

View File

@ -1,5 +1,6 @@
package de.bixilon.pixlyzer.generator
object Generators {
val GENERATORS: List<Generator> = mutableListOf(
BiomeGenerator,
@ -11,5 +12,12 @@ object Generators {
MotiveGenerator,
DimensionGenerator,
BlockGenerator,
RarityGenerator,
MobCategoryGenerator,
EntityGenerator,
ParticleGenerator,
BlockEntityGenerator,
StatisticsGenerator,
VersionGenerator,
)
}

View File

@ -22,7 +22,7 @@ object ItemGenerator : Generator(
item.itemCategory?.let {
itemData.addProperty("category", CreativeInventoryTabGenerator.CATEGORY_ID_FIELD.getInt(it))
}
itemData.addProperty("rarity", item.getRarity(ItemStack.EMPTY).name.toLowerCase())
itemData.addProperty("rarity", item.getRarity(ItemStack.EMPTY).ordinal)
itemData.addProperty("max_stack_size", item.maxStackSize)
itemData.addProperty("max_damage", item.maxDamage)
itemData.addProperty("is_complex", item.isComplex)
@ -60,10 +60,10 @@ object ItemGenerator : Generator(
itemData.addProperty("attack_speed", DIGGER_ITEM_ATTACK_SPEED.getFloat(item))
}
if (item is ArmorItem) {
itemData.addProperty("equipment_slot", (ARMOR_ITEM_EQUIPMENT_SLOT_FIELD.get(item) as EquipmentSlot).name)
itemData.addProperty("equipment_slot", (ARMOR_ITEM_EQUIPMENT_SLOT_FIELD.get(item) as EquipmentSlot).name.toLowerCase())
itemData.addProperty("defense", item.defense)
itemData.addProperty("toughness", ARMOR_ITEM_TOUGHNESS_FIELD.getFloat(item))
itemData.addProperty("armor_material", item.material.name)
itemData.addProperty("armor_material", item.material.name.toLowerCase())
}
if (item is AxeItem) {
val stripables = JsonArray()
@ -82,7 +82,7 @@ object ItemGenerator : Generator(
}
}
if (item is DyeItem) {
itemData.addProperty("dye_color", item.dyeColor.name)
itemData.addProperty("dye_color", item.dyeColor.name.toLowerCase())
}
if (item is FishBucketItem) {
(BUCKED_FISH_ITEM_TYPE_FIELD.get(item) as EntityType<*>?)?.let {
@ -131,7 +131,6 @@ object ItemGenerator : Generator(
// ToDo: Record Item,
itemData.addProperty("class", item::class.java.simpleName)
// ToDo
data.add(resourceIdentifier.toString(), itemData)
}

View File

@ -0,0 +1,22 @@
package de.bixilon.pixlyzer.generator
import com.google.gson.JsonObject
import net.minecraft.world.entity.MobCategory
object MobCategoryGenerator : Generator(
"mob categories",
"mob_categories"
) {
override fun generate() {
for (category in MobCategory.values()) {
val categoryData = JsonObject()
categoryData.addProperty("max_instances_per_chunk", category.maxInstancesPerChunk)
categoryData.addProperty("is_friendly", category.isFriendly)
categoryData.addProperty("is_persistent", category.isPersistent)
categoryData.addProperty("name", category.name.toLowerCase())
data.add(category.ordinal.toString(), categoryData)
}
}
}

View File

@ -28,12 +28,12 @@ object MobEffectGenerator : Generator(
for ((attribute, modifier) in mobEffect.getModifiers()) {
val modifierData = JsonObject()
modifierData.addProperty("name", modifier.name)
modifierData.addProperty("name", modifier.name.toLowerCase())
modifierData.addProperty("uuid", modifier.id.toString())
modifierData.addProperty("amount", modifier.amount)
modifierData.addProperty("operation", modifier.operation.name.toLowerCase())
modifiers.add(attribute.name, modifierData)
modifiers.add(attribute.name.toLowerCase(), modifierData)
}
if (modifiers.size() > 0) {

View File

@ -0,0 +1,22 @@
package de.bixilon.pixlyzer.generator
import com.google.gson.JsonObject
import net.minecraft.core.Registry
object ParticleGenerator : Generator(
"particles"
) {
override fun generate() {
for (particleType in Registry.PARTICLE_TYPE) {
val resourceIdentifier = Registry.PARTICLE_TYPE.getKey(particleType)
val particleData = JsonObject()
particleData.addProperty("id", Registry.PARTICLE_TYPE.getId(particleType))
if (particleType.overrideLimiter) {
particleData.addProperty("override_limiter", particleType.overrideLimiter)
}
// ToDo type and meta data
data.add(resourceIdentifier.toString(), particleData)
}
}
}

View File

@ -0,0 +1,18 @@
package de.bixilon.pixlyzer.generator
import com.google.gson.JsonObject
import net.minecraft.world.item.Rarity
object RarityGenerator : Generator(
"rarities"
) {
override fun generate() {
for (rarity in Rarity.values()) {
val rarityData = JsonObject()
rarityData.addProperty("name", rarity.name.toLowerCase())
rarityData.addProperty("color", rarity.color.name.toLowerCase())
data.add(rarity.ordinal.toString(), rarityData)
}
}
}

View File

@ -0,0 +1,49 @@
package de.bixilon.pixlyzer.generator
import com.google.gson.JsonArray
import com.google.gson.JsonObject
import net.minecraft.core.Registry
import net.minecraft.stats.Stat
import net.minecraft.stats.StatFormatter
object StatisticsGenerator : Generator(
"statistics"
) {
override fun generate() {
for (statistic in Registry.STAT_TYPE) {
val resourceIdentifier = Registry.STAT_TYPE.getKey(statistic)
val statisticData = JsonObject()
statisticData.addProperty("id", Registry.STAT_TYPE.getId(statistic))
statisticData.addProperty("translation_id", statistic.translationKey)
statisticData.addProperty("unit", when (statistic.registry) {
Registry.BIOME -> "biome"
Registry.BLOCK -> "block"
Registry.ITEM -> "item"
Registry.ENTITY_TYPE -> "entity_type"
Registry.CUSTOM_STAT -> "custom"
StatFormatter.DECIMAL_FORMAT -> "decimal_format"
StatFormatter.DEFAULT -> "default"
StatFormatter.DIVIDE_BY_TEN -> "divide_by_ten"
StatFormatter.DISTANCE -> "distance"
StatFormatter.TIME -> "time"
else -> "other"
})
val subStatistics = JsonArray()
for (subStatistic in statistic) {
val key = when (subStatistic) {
is Stat -> subStatistic.name
else -> subStatistic.toString()
}
subStatistics.add(key)
}
if (subStatistics.size() > 0) {
statisticData.add("sub_statistics", subStatistics)
}
data.add(resourceIdentifier.toString(), statisticData)
}
}
}

View File

@ -0,0 +1,20 @@
package de.bixilon.pixlyzer.generator
import net.minecraft.DetectedVersion
object VersionGenerator : Generator(
"version"
) {
override fun generate() {
val version = DetectedVersion.tryDetectVersion()
data.addProperty("id", version.id)
data.addProperty("name", version.name)
data.addProperty("stable", version.isStable)
data.addProperty("world_version", version.worldVersion)
data.addProperty("protocol_version", version.protocolVersion)
data.addProperty("pack_version", version.packVersion)
data.addProperty("build_time", version.buildTime.toString())
data.addProperty("release_target", version.releaseTarget)
}
}

View File

@ -1,5 +1,9 @@
package de.bixilon.pixlyzer.util
import com.google.gson.JsonObject
import com.google.gson.JsonParser
import java.io.InputStreamReader
object Util {
fun <T> forceClassInit(clazz: Class<T>) {
try {
@ -9,4 +13,11 @@ object Util {
}
}
fun readJsonResource(path: String): JsonObject {
val reader = InputStreamReader(Util::class.java.getResourceAsStream("/$path"))
val json: JsonObject = JsonParser().parse(reader).asJsonObject
reader.close()
return json
}
}

View File

@ -0,0 +1,494 @@
{
"Entity": {
"data": {
"DATA_SHARED_FLAGS_ID": "ENTITY_FLAGS",
"DATA_AIR_SUPPLY_ID": "ENTITY_AIR_SUPPLY",
"DATA_CUSTOM_NAME": "ENTITY_CUSTOM_NAME",
"DATA_CUSTOM_NAME_VISIBLE": "ENTITY_CUSTOM_NAME_VISIBLE",
"DATA_SILENT": "ENTITY_SILENT",
"DATA_NO_GRAVITY": "ENTITY_NO_GRAVITY",
"DATA_POSE": "ENTITY_POSE",
"DATA_TICKS_FROZEN": "ENTITY_TICKS_FROZEN"
}
},
"LivingEntity": {
"data": {
"DATA_LIVING_ENTITY_FLAGS": "LIVING_ENTITY_FLAGS",
"DATA_HEALTH_ID": "LIVING_ENTITY_HEALTH",
"DATA_EFFECT_COLOR_ID": "LIVING_ENTITY_EFFECT_COLOR",
"DATA_EFFECT_AMBIENCE_ID": "LIVING_ENTITY_EFFECT_AMBIENCE",
"DATA_ARROW_COUNT_ID": "LIVING_ENTITY_ARROW_COUNT",
"DATA_STINGER_COUNT_ID": "LIVING_ENTITY_ABSORPTION_HEARTS",
"SLEEPING_POS_ID": "LIVING_ENTITY_BED_POSITION"
}
},
"Mob": {
"data": {
"DATA_MOB_FLAGS_ID": "MOB_FLAGS"
}
},
"Zombie": {
"data": {
"DATA_BABY_ID": "ZOMBIE_IS_BABY",
"DATA_SPECIAL_TYPE_ID": "ZOMBIE_SPECIAL_TYPE",
"DATA_DROWNED_CONVERSION_ID": "ZOMBIE_DROWNING_CONVERSION"
}
},
"AreaEffectCloud": {
"data": {
"DATA_RADIUS": "AREA_EFFECT_CLOUD_RADIUS",
"DATA_COLOR": "AREA_EFFECT_CLOUD_COLOR",
"DATA_WAITING": "AREA_EFFECT_CLOUD_WAITING",
"DATA_PARTICLE": "AREA_EFFECT_CLOUD_PARTICLE"
}
},
"ArmorStand": {
"data": {
"DATA_CLIENT_FLAGS": "ARMOR_STAND_FLAGS",
"DATA_HEAD_POSE": "ARMOR_STAND_HEAD_ROTATION",
"DATA_BODY_POSE": "ARMOR_STAND_BODY_ROTATION",
"DATA_LEFT_ARM_POSE": "ARMOR_STAND_LEFT_ARM_ROTATION",
"DATA_RIGHT_ARM_POSE": "ARMOR_STAND_RIGHT_ARM_ROTATION",
"DATA_LEFT_LEG_POSE": "ARMOR_STAND_LEFT_LAG_ROTATION",
"DATA_RIGHT_LEG_POSE": "ARMOR_STAND_RIGHT_LAG_ROTATION"
}
},
"Arrow": {
"data": {
"ID_EFFECT_COLOR": "ARROW_EFFECT_COLOR"
}
},
"ThrowableItemProjectile": {
"data": {
"DATA_ITEM_STACK": "THROWABLE_ITEM_PROJECTILE_ITEM"
}
},
"FallingBlockEntity": {
"data": {
"DATA_START_POS": "FALLING_BLOCK_SPAWN_POSITION"
}
},
"AbstractArrow": {
"data": {
"ID_FLAGS": "ABSTRACT_ARROW_FLAGS",
"PIERCE_LEVEL": "ABSTRACT_ARROW_PIERCE_LEVEL",
"DATA_OWNERUUID_ID": "ABSTRACT_ARROW_OWNER_UUID"
}
},
"FishingHook": {
"data": {
"DATA_HOOKED_ENTITY": "FISHING_HOOK_HOOKED_ENTITY",
"DATA_BITING": "FISHING_HOOK_CATCHABLE"
}
},
"ThrownTrident": {
"data": {
"ID_LOYALTY": "THROWN_TRIDENT_LOYALTY_LEVEL",
"ID_FOIL": "THROWN_TRIDENT_FOIL"
}
},
"Boat": {
"data": {
"DATA_ID_HURT": "BOAT_HURT",
"DATA_ID_HURTDIR": "BOAT_HURT_DIRECTION",
"DATA_ID_DAMAGE": "BOAT_DAMAGE_TAKEN",
"DATA_ID_TYPE": "BOAT_MATERIAL",
"DATA_ID_PADDLE_LEFT": "BOAT_PADDLE_LEFT",
"DATA_ID_PADDLE_RIGHT": "BOAT_PADDLE_RIGHT",
"DATA_ID_BUBBLE_TIME": "BOAT_BUBBLE_TIME"
}
},
"EndCrystal": {
"data": {
"DATA_BEAM_TARGET": "END_CRYSTAL_BEAM_TARGET",
"DATA_SHOW_BOTTOM": "END_CRYSTAL_SHOW_BOTTOM"
}
},
"Fireball": {
"data": {
"DATA_ITEM_STACK": "FIREBALL_ITEM"
}
},
"WitherSkull": {
"data": {
"DATA_DANGEROUS": "WITHER_SKULL_DANGEROUS"
}
},
"FireworkRocketEntity": {
"data": {
"DATA_ID_FIREWORKS_ITEM": "FIREWORK_ROCKET_ENTITY_ITEM",
"DATA_ATTACHED_TO_TARGET": "FIREWORK_ROCKET_ENTITY_ATTACHED_ENTITY",
"DATA_SHOT_AT_ANGLE": "FIREWORK_ROCKET_ENTITY_SHOT_AT_ANGLE"
}
},
"ItemFrame": {
"data": {
"DATA_ITEM": "ITEM_FRAME_ITEM",
"DATA_ROTATION": "ITEM_FRAME_ROTATION"
}
},
"ItemEntity": {
"data": {
"DATA_ITEM": "ITEM_ITEM"
}
},
"Player": {
"data": {
"DATA_PLAYER_ABSORPTION_ID": "PLAYER_ABSORPTION_HEARTS",
"DATA_SCORE_ID": "PLAYER_SCORE",
"DATA_PLAYER_MODE_CUSTOMISATION": "PLAYER_SKIN_PARTS_FLAGS",
"DATA_PLAYER_MAIN_HAND": "PLAYER_SKIN_MAIN_HAND",
"DATA_SHOULDER_LEFT": "PLAYER_LEFT_SHOULDER_DATA",
"DATA_SHOULDER_RIGHT": "PLAYER_RIGHT_SHOULDER_DATA"
}
},
"Bat": {
"data": {
"DATA_ID_FLAGS": "BAT_FLAGS"
}
},
"AgeableMob": {
"data": {
"DATA_BABY_ID": "AGEABLE_IS_BABY"
}
},
"Dolphin": {
"data": {
"TREASURE_POS": "DOLPHIN_TREASURE_POSITION",
"GOT_FISH": "DOLPHIN_HAS_FISH",
"MOISTNESS_LEVEL": "DOLPHIN_MOISTNESS_LEVEL",
"MOISNTESS_LEVEL": "DOLPHIN_MOISTNESS_LEVEL"
}
},
"AbstractFish": {
"data": {
"FROM_BUCKET": "ABSTRACT_FISH_FROM_BUCKET"
}
},
"AbstractChestedHorse": {
"data": {
"DATA_ID_CHEST": "ABSTRACT_CHESTED_HORSE_HAS_CHEST"
}
},
"AbstractHorse": {
"data": {
"DATA_ID_FLAGS": "ABSTRACT_HORSE_FLAGS",
"DATA_ID_OWNER_UUID": "ABSTRACT_HORSE_OWNER_UUID"
}
},
"Horse": {
"data": {
"DATA_ID_TYPE_VARIANT": "HORSE_VARIANT"
}
},
"Llama": {
"data": {
"DATA_STRENGTH_ID": "LLAMA_STRENGTH",
"DATA_SWAG_ID": "LLAMA_CARPET_COLOR",
"DATA_VARIANT_ID": "LLAMA_VARIANT"
}
},
"Bee": {
"data": {
"DATA_FLAGS_ID": "BEE_FLAGS",
"DATA_REMAINING_ANGER_TIME": "BEE_REMAINING_ANGER_TIME",
"ANGER_TIME": "BEE_REMAINING_ANGER_TIME"
}
},
"Cat": {
"data": {
"DATA_TYPE_ID": "CAT_VARIANT",
"IS_LYING": "CAT_IS_LYING",
"RELAX_STATE_ONE": "CAT_IS_RELAXED",
"DATA_COLLAR_COLOR": "CAT_GET_COLLAR_COLOR"
}
},
"TamableAnimal": {
"data": {
"DATA_FLAGS_ID": "TAMABLE_ENTITY_FLAGS",
"DATA_OWNERUUID_ID": "TAMABLE_ENTITY_OWNER_UUID"
}
},
"Fox": {
"data": {
"DATA_TYPE_ID": "FOX_VARIANT",
"DATA_FLAGS_ID": "FOX_FLAGS",
"DATA_TRUSTED_ID_0": "FOX_TRUSTED_1",
"DATA_TRUSTED_ID_1": "FOX_TRUSTED_2"
}
},
"IronGolem": {
"data": {
"DATA_FLAGS_ID": "IRON_GOLEM_FLAGS"
}
},
"MushroomCow": {
"data": {
"DATA_TYPE": "MOOSHROOM_VARIANT"
}
},
"Ocelot": {
"data": {
"DATA_TRUSTING": "OCELOT_IS_TRUSTING"
}
},
"Panda": {
"data": {
"UNHAPPY_COUNTER": "PANDA_UNHAPPY_TIMER",
"SNEEZE_COUNTER": "PANDA_SNEEZE_TIMER",
"EAT_COUNTER": "PANDA_EAT_TIMER",
"MAIN_GENE_ID": "PANDA_MAIN_GENE",
"HIDDEN_GENE_ID": "PANDA_HIDDEN_GAME",
"DATA_ID_FLAGS": "PANDA_FLAGS"
}
},
"Parrot": {
"data": {
"DATA_VARIANT_ID": "PARROT_VARIANT"
}
},
"Pig": {
"data": {
"DATA_SADDLE_ID": "PIG_HAS_SADDLE",
"DATA_BOOST_TIME": "PIG_BOOST_TIME"
}
},
"PolarBear": {
"data": {
"DATA_STANDING_ID": "POLAR_BEAR_STANDING"
}
},
"Pufferfish": {
"data": {
"PUFF_STATE": "PUFFERFISH_PUFF_STATE"
}
},
"Rabbit": {
"data": {
"DATA_TYPE_ID": "RABBIT_VARIANT"
}
},
"Sheep": {
"data": {
"DATA_WOOL_ID": "SHEEP_FLAGS"
}
},
"SnowGolem": {
"data": {
"DATA_PUMPKIN_ID": "SNOW_GOLEM_FLAGS"
}
},
"TropicalFish": {
"data": {
"DATA_ID_TYPE_VARIANT": "TROPICAL_FISH_VARIANT"
}
},
"Turtle": {
"data": {
"HOME_POS": "TURTLE_HOME_POSITION",
"HAS_EGG": "TURTLE_HAS_EGG",
"LAYING_EGG": "TURTLE_IS_LAYING_EGG",
"TRAVEL_POS": "TURTLE_TRAVEL_POSITION",
"GOING_HOME": "TURTLE_IS_GOING_HOME",
"TRAVELLING": "TURTLE_IS_TRAVELING"
}
},
"Wolf": {
"data": {
"DATA_INTERESTED_ID": "WOLF_IS_BEGGING",
"DATA_COLLAR_COLOR": "WOLF_COLLAR_COLOR",
"DATA_REMAINING_ANGER_TIME": "WOLF_ANGER_TIME",
"DATA_HEALTH_ID": "WOLF_HEALTH"
}
},
"EnderDragon": {
"data": {
"DATA_PHASE": "ENDER_DRAGON_PHASE"
}
},
"WitherBoss": {
"data": {
"DATA_TARGET_A": "WITHER_BOSS_CENTER_HEAD_TARGET_ENTITY_ID",
"DATA_TARGET_B": "WITHER_BOSS_LEFT_HEAD_TARGET_ENTITY_ID",
"DATA_TARGET_C": "WITHER_BOSS_RIGHT_HEAD_TARGET_ENTITY_ID",
"DATA_ID_INV": "WITHER_BOSS_INVULNERABLE_TIME"
}
},
"PrimedTnt": {
"data": {
"DATA_FUSE_ID": "PRIMED_TNT_FUSE_TIME"
}
},
"Hoglin": {
"data": {
"DATA_IMMUNE_TO_ZOMBIFICATION": "HOGLIN_IMMUNE_TO_ZOMBIFICATION"
}
},
"AbstractPiglin": {
"data": {
"DATA_IMMUNE_TO_ZOMBIFICATION": "ABSTRACT_PIGLIN_IMMUNE_TO_ZOMBIFICATION"
}
},
"Piglin": {
"data": {
"DATA_BABY_ID": "PIGLIN_IS_BABY",
"DATA_IS_CHARGING_CROSSBOW": "PIGLIN_IS_CHARGING_CROSSBOW",
"DATA_IS_DANCING": "PIGLIN_IS_DANCING",
"DATA_IMMUNE_TO_ZOMBIFICATION": "PIGLIN_IMMUNE_TO_ZOMBIFICATION"
}
},
"Blaze": {
"data": {
"DATA_FLAGS_ID": "BLAZE_FLAGS"
}
},
"Creeper": {
"data": {
"DATA_SWELL_DIR": "CREEPER_STATE",
"DATA_IS_POWERED": "CREEPER_IS_CHARGED",
"DATA_IS_IGNITED": "CREEPER_IS_IGNITED"
}
},
"EnderMan": {
"data": {
"DATA_CARRY_STATE": "ENDERMAN_CARRIED_BLOCK",
"DATA_CREEPY": "ENDERMAN_IS_SCREAMING",
"DATA_STARED_AT": "ENDERMAN_IS_STARRING"
}
},
"SpellcasterIllager": {
"data": {
"DATA_SPELL_CASTING_ID": "SPELLCASTER_ILLAGER_SPELL"
}
},
"Ghast": {
"data": {
"DATA_IS_CHARGING": "GHAST_IS_ATTACKING"
}
},
"Guardian": {
"data": {
"DATA_ID_MOVING": "GUARDIAN_IS_MOVING",
"DATA_ID_ATTACK_TARGET": "GUARDIAN_TARGET_ENTITY_ID"
}
},
"Phantom": {
"data": {
"ID_SIZE": "PHANTOM_SIZE"
}
},
"Pillager": {
"data": {
"IS_CHARGING_CROSSBOW": "PILLAGER_IS_CHARGING_CROSSBOW"
}
},
"Shulker": {
"data": {
"DATA_ATTACH_FACE_ID": "SHULKER_ATTACH_FACE",
"DATA_ATTACH_POS_ID": "SHULKER_ATTACHMENT_POSITION",
"DATA_PEEK_ID": "SHULKER_PEEK",
"DATA_COLOR_ID": "SHULKER_COLOR"
}
},
"Skeleton": {
"data": {
"DATA_STRAY_CONVERSION_ID": "SKELETON_STRAY_FREEZE_CONVERTING"
}
},
"Slime": {
"data": {
"ID_SIZE": "SLIME_SIZE"
}
},
"Spider": {
"data": {
"DATA_FLAGS_ID": "SPIDER_FLAGS"
}
},
"Strider": {
"data": {
"DATA_BOOST_TIME": "STRIDER_TIME_TO_BOOST",
"DATA_SUFFOCATING": "STRIDER_IS_SUFFOCATING",
"DATA_SADDLE_ID": "STRIDER_HAS_SADDLE"
}
},
"Vex": {
"data": {
"DATA_FLAGS_ID": "VEX_FLAGS"
}
},
"Witch": {
"data": {
"DATA_USING_ITEM": "WITCH_IS_DRINKING_POTION"
}
},
"ZombieVillager": {
"data": {
"DATA_CONVERTING_ID": "ZOMBIE_VILLAGER_IS_CONVERTING",
"DATA_VILLAGER_DATA": "ZOMBIE_VILLAGER_DATA"
}
},
"AbstractVillager": {
"data": {
"DATA_UNHAPPY_COUNTER": "ABSTRACT_VILLAGER_UNHAPPY_TIMER"
}
},
"Villager": {
"data": {
"DATA_VILLAGER_DATA": "VILLAGER_VILLAGER_DATA"
}
},
"EyeOfEnder": {
"data": {
"DATA_ITEM_STACK": "THROWN_EYE_OF_ENDER_ITEM"
}
},
"ThrownPotion": {
"data": {
"DATA_ITEM_STACK": "THROWN_POTION_ITEM"
}
},
"Raider": {
"data": {
"IS_CELEBRATING": "RAIDER_IS_CELEBRATING"
}
},
"AbstractMinecart": {
"data": {
"DATA_ID_HURT": "MINECART_HURT",
"DATA_ID_HURTDIR": "MINECART_HURT_DIRECTION",
"DATA_ID_DAMAGE": "MINECART_DAMAGE_TAKEN",
"DATA_ID_DISPLAY_BLOCK": "MINECART_BLOCK_ID",
"DATA_ID_DISPLAY_OFFSET": "MINECART_BLOCK_Y_OFFSET",
"DATA_ID_CUSTOM_DISPLAY": "MINECART_SHOW_BLOCK"
}
},
"MinecartCommandBlock": {
"data": {
"DATA_ID_COMMAND_NAME": "MINECART_COMMAND_BLOCK_COMMAND",
"DATA_ID_LAST_OUTPUT": "MINECART_COMMAND_BLOCK_LAST_OUTPUT"
}
},
"MinecartFurnace": {
"data": {
"DATA_ID_FUEL": "MINECART_FURNACE_HAS_FUEL"
}
},
"Zoglin": {
"data": {
"DATA_BABY_ID": "ZOGLIN_IS_BABY"
}
},
"Axolotl": {
"data": {
"DATA_VARIANT": "AXOLOTL_VARIANT",
"DATA_PLAYING_DEAD": "AXOLOTL_PLAYING_DEAD",
"FROM_BUCKET": "AXOLOTL_FROM_BUCKET"
}
},
"GlowSquid": {
"data": {
"DATA_DARK_TICKS_REMAINING": "GLOW_SQUID_DARK_TICKS_REMAINING"
}
}
}