mirror of
https://gitlab.bixilon.de/bixilon/pixlyzer.git
synced 2025-10-02 16:41:40 -04:00
wip port yarn generator to 21w13a
This commit is contained in:
parent
71b7b75586
commit
13a6612b57
10
pom.xml
10
pom.xml
@ -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>
|
||||
|
||||
|
@ -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")
|
||||
}
|
||||
|
||||
|
@ -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.")
|
||||
|
@ -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()
|
||||
|
@ -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,
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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")
|
||||
|
@ -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))
|
||||
|
@ -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?>
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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")
|
||||
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
|
@ -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 {
|
||||
|
@ -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")!!
|
||||
|
||||
}
|
||||
|
@ -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
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
||||
|
||||
|
22
src/main/kotlin/net/fabricmc/yarn/constants/CatTypes.java
Normal file
22
src/main/kotlin/net/fabricmc/yarn/constants/CatTypes.java
Normal 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() {
|
||||
}
|
||||
}
|
@ -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() {
|
||||
}
|
||||
}
|
@ -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() {
|
||||
}
|
||||
}
|
@ -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() {
|
||||
}
|
||||
}
|
18
src/main/kotlin/net/fabricmc/yarn/constants/RabbitTypes.java
Normal file
18
src/main/kotlin/net/fabricmc/yarn/constants/RabbitTypes.java
Normal 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() {
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user