mirror of
https://gitlab.bixilon.de/bixilon/pixlyzer.git
synced 2025-09-27 05:59:53 -04:00
port until 19w11b
This commit is contained in:
parent
b71df12783
commit
6dc1eb0a75
6
pom.xml
6
pom.xml
@ -15,7 +15,7 @@
|
|||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<kotlin.code.style>official</kotlin.code.style>
|
<kotlin.code.style>official</kotlin.code.style>
|
||||||
<kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>
|
<kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>
|
||||||
<minecraft.version>1.14.4</minecraft.version>
|
<minecraft.version>1.14.3</minecraft.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<repositories>
|
<repositories>
|
||||||
@ -78,7 +78,7 @@
|
|||||||
<artifactId>client</artifactId>
|
<artifactId>client</artifactId>
|
||||||
<version>1</version>
|
<version>1</version>
|
||||||
<scope>system</scope>
|
<scope>system</scope>
|
||||||
<systemPath>${project.basedir}/wrapper/data/data/${minecraft.version}_yarn/${minecraft.version}_yarn_client.jar</systemPath>
|
<systemPath>${project.basedir}/wrapper/data/data/${minecraft.version}_yarn/${minecraft.version}-named.jar</systemPath>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -86,7 +86,7 @@
|
|||||||
<artifactId>server</artifactId>
|
<artifactId>server</artifactId>
|
||||||
<version>1</version>
|
<version>1</version>
|
||||||
<scope>system</scope>
|
<scope>system</scope>
|
||||||
<systemPath>${project.basedir}/wrapper/data/data/${minecraft.version}_yarn/${minecraft.version}_server.jar</systemPath>
|
<systemPath>${project.basedir}/wrapper/data/data/${minecraft.version}_yarn/${minecraft.version}_server_mojang.jar</systemPath>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.objenesis</groupId>
|
<groupId>org.objenesis</groupId>
|
||||||
|
@ -7,6 +7,7 @@ import de.bixilon.pixlyzer.util.ReflectionUtil.setFinalField
|
|||||||
import net.minecraft.client.network.OtherClientPlayerEntity
|
import net.minecraft.client.network.OtherClientPlayerEntity
|
||||||
import net.minecraft.entity.Entity
|
import net.minecraft.entity.Entity
|
||||||
import net.minecraft.entity.EntityType
|
import net.minecraft.entity.EntityType
|
||||||
|
import net.minecraft.entity.decoration.ItemFrameEntity
|
||||||
import net.minecraft.scoreboard.Scoreboard
|
import net.minecraft.scoreboard.Scoreboard
|
||||||
import net.minecraft.world.World
|
import net.minecraft.world.World
|
||||||
import net.minecraft.world.border.WorldBorder
|
import net.minecraft.world.border.WorldBorder
|
||||||
@ -18,21 +19,29 @@ import java.util.*
|
|||||||
object EntitySpawner {
|
object EntitySpawner {
|
||||||
|
|
||||||
fun summonEntity(entityType: EntityType<*>): Entity {
|
fun summonEntity(entityType: EntityType<*>): Entity {
|
||||||
val factory = FACTORY_FIELD.get(entityType) as EntityType.EntityFactory<Entity>
|
when (entityType) {
|
||||||
val entity = factory.create(entityType as EntityType<Entity>?, CLIENT_LEVEL)
|
EntityType.PLAYER -> return OtherClientPlayerEntity::class.java.getConstructor(levelClass, GameProfile::class.java).newInstance(CLIENT_LEVEL, GameProfile(UUID.randomUUID(), "dummy"))
|
||||||
|
EntityType.LIGHTNING_BOLT -> return OBJENSIS.newInstance(LIGHTNING_BOLT_CLASS) as Entity
|
||||||
|
EntityType.FISHING_BOBBER -> return OBJENSIS.newInstance(FISHING_HOOK_CLASS) as Entity
|
||||||
|
EntityType.ITEM_FRAME -> return OBJENSIS.newInstance(ItemFrameEntity::class.java) as Entity
|
||||||
|
}
|
||||||
|
|
||||||
|
val entity = try {
|
||||||
|
ENTITY_CREATE_METHOD?.invoke(FACTORY_FIELD.get(entityType), entityType, CLIENT_LEVEL) as Entity?
|
||||||
|
} catch (exception: Exception) {
|
||||||
|
exception.printStackTrace()
|
||||||
|
TODO()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (entity != null) {
|
if (entity != null) {
|
||||||
return entity
|
return entity
|
||||||
}
|
}
|
||||||
return when (entityType) {
|
|
||||||
EntityType.PLAYER -> OtherClientPlayerEntity::class.java.getConstructor(levelClass, GameProfile::class.java).newInstance(CLIENT_LEVEL, GameProfile(UUID.randomUUID(), "dummy"))
|
TODO("Entity type: $entityType")
|
||||||
EntityType.LIGHTNING_BOLT -> OBJENSIS.newInstance(LIGHTNING_BOLT_CLASS) as Entity
|
|
||||||
EntityType.FISHING_BOBBER -> OBJENSIS.newInstance(FISHING_HOOK_CLASS) as Entity
|
|
||||||
else -> TODO("Entity type: $entityType")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private val LIGHTNING_BOLT_CLASS = getClass("net.minecraft.entity.LightningEntity")!!
|
private val LIGHTNING_BOLT_CLASS = getClass("net.minecraft.entity.LightningEntity")!!
|
||||||
private val FISHING_HOOK_CLASS = getClass("net.minecraft.entity.projectile.FishingBobberEntity")!!
|
private val FISHING_HOOK_CLASS = getClass("net.minecraft.entity.projectile.FishingBobberEntity")!!
|
||||||
|
|
||||||
@ -40,9 +49,21 @@ object EntitySpawner {
|
|||||||
|
|
||||||
private val FACTORY_FIELD = getField(EntityType::class.java, "factory")!!
|
private val FACTORY_FIELD = getField(EntityType::class.java, "factory")!!
|
||||||
|
|
||||||
|
private val ENTITY_CREATE_METHOD = try {
|
||||||
|
getClass("net.minecraft.entity.EntityType\$EntityFactory")?.getDeclaredMethod("create", EntityType::class.java, World::class.java)
|
||||||
|
} catch (exception: Exception) {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
|
private val LEGACY_ENTITY_CREATE_METHOD = try {
|
||||||
|
getClass("net.minecraft.entity.EntityType\$EntityFactory")?.getDeclaredMethod("create", EntityType::class.java, World::class.java)
|
||||||
|
} catch (exception: Exception) {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
var OBJENSIS: Objenesis = ObjenesisStd()
|
var OBJENSIS: Objenesis = ObjenesisStd()
|
||||||
|
|
||||||
val CLIENT_LEVEL = OBJENSIS.newInstance(levelClass) as World
|
private val CLIENT_LEVEL = OBJENSIS.newInstance(levelClass) as World
|
||||||
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
@ -70,7 +70,13 @@ object PixLyzer {
|
|||||||
val startTime = System.currentTimeMillis()
|
val startTime = System.currentTimeMillis()
|
||||||
println("Starting ${generator.name}...")
|
println("Starting ${generator.name}...")
|
||||||
|
|
||||||
|
try {
|
||||||
generator.generate()
|
generator.generate()
|
||||||
|
} catch (exception: IllegalArgumentException) {
|
||||||
|
// not implemented
|
||||||
|
println("Skipping ${generator.name}: ${exception.message}")
|
||||||
|
continue
|
||||||
|
}
|
||||||
if (generator.data.size() == 0) {
|
if (generator.data.size() == 0) {
|
||||||
error("${generator.fileName} has 0 entries!")
|
error("${generator.fileName} has 0 entries!")
|
||||||
}
|
}
|
||||||
@ -125,7 +131,7 @@ object PixLyzer {
|
|||||||
|
|
||||||
val assetsIndexJson = Util.readJsonFile(assetsIndex.absolutePath + ".json")
|
val assetsIndexJson = Util.readJsonFile(assetsIndex.absolutePath + ".json")
|
||||||
|
|
||||||
val versionId = MinecraftVersion.create().id
|
val versionId = MinecraftVersion.create().name // ToDo: Should be id, but in 1.14 there is a hash in the id???
|
||||||
|
|
||||||
assetsIndexJson.addProperty(versionId, hash)
|
assetsIndexJson.addProperty(versionId, hash)
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ package de.bixilon.pixlyzer.generator.generators
|
|||||||
import com.google.gson.JsonArray
|
import com.google.gson.JsonArray
|
||||||
import com.google.gson.JsonObject
|
import com.google.gson.JsonObject
|
||||||
import de.bixilon.pixlyzer.generator.Generator
|
import de.bixilon.pixlyzer.generator.Generator
|
||||||
|
import de.bixilon.pixlyzer.util.ReflectionUtil
|
||||||
import net.minecraft.block.Block
|
import net.minecraft.block.Block
|
||||||
import net.minecraft.block.entity.BlockEntityType
|
import net.minecraft.block.entity.BlockEntityType
|
||||||
import net.minecraft.util.registry.Registry
|
import net.minecraft.util.registry.Registry
|
||||||
@ -16,7 +17,7 @@ object BlockEntityGenerator : Generator(
|
|||||||
val blockEntityData = JsonObject()
|
val blockEntityData = JsonObject()
|
||||||
blockEntityData.addProperty("id", Registry.BLOCK_ENTITY.getRawId(blockEntityType))
|
blockEntityData.addProperty("id", Registry.BLOCK_ENTITY.getRawId(blockEntityType))
|
||||||
|
|
||||||
(BLOCK_ENTITY_VALID_BLOCKS_FIELD.get(blockEntityType) as Set<Block>).let {
|
(BLOCK_ENTITY_VALID_BLOCKS_FIELD?.get(blockEntityType) as Set<Block>?)?.let {
|
||||||
val blockTypes = JsonArray()
|
val blockTypes = JsonArray()
|
||||||
|
|
||||||
for (block in it) {
|
for (block in it) {
|
||||||
@ -32,9 +33,5 @@ object BlockEntityGenerator : Generator(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val BLOCK_ENTITY_VALID_BLOCKS_FIELD = BlockEntityType::class.java.getDeclaredField("blocks")
|
private val BLOCK_ENTITY_VALID_BLOCKS_FIELD = ReflectionUtil.getField(BlockEntityType::class.java, "blocks")
|
||||||
|
|
||||||
init {
|
|
||||||
BLOCK_ENTITY_VALID_BLOCKS_FIELD.isAccessible = true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -126,7 +126,9 @@ object BlockGenerator : Generator(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val colorProperties = DEFAULT_BLOCK_COLORS.method_21592(block)
|
val hasColorProperties = (TINT_PROPERTIES_METHOD?.invoke(DEFAULT_BLOCK_COLORS, block) as Set<*>?)?.size?.let { it > 0 } ?: let {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
val states = JsonObject()
|
val states = JsonObject()
|
||||||
|
|
||||||
@ -195,7 +197,7 @@ object BlockGenerator : Generator(
|
|||||||
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (colorProperties.size > 0) {
|
if (hasColorProperties) {
|
||||||
val tintColor = DEFAULT_BLOCK_COLORS.getColor(state, null, null)
|
val tintColor = DEFAULT_BLOCK_COLORS.getColor(state, null, null)
|
||||||
if (tintColor == -1) {
|
if (tintColor == -1) {
|
||||||
throw IllegalStateException()
|
throw IllegalStateException()
|
||||||
@ -270,7 +272,7 @@ object BlockGenerator : Generator(
|
|||||||
}
|
}
|
||||||
stateData.addProperty("large_collision_shape", it)
|
stateData.addProperty("large_collision_shape", it)
|
||||||
}
|
}
|
||||||
IS_COLLISION_SHAPE_FULL_BLOCK.getBoolean(cache).let {
|
IS_COLLISION_SHAPE_FULL_BLOCK?.getBoolean(cache)?.let {
|
||||||
if (!it) {
|
if (!it) {
|
||||||
return@let
|
return@let
|
||||||
}
|
}
|
||||||
@ -298,13 +300,13 @@ object BlockGenerator : Generator(
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
(CACHE_COLLISION_SHAPES_FIELD.get(cache) as VoxelShape?)?.let {
|
(CACHE_COLLISION_SHAPES_FIELD?.get(cache) as VoxelShape?)?.let {
|
||||||
if (it.isEmpty) {
|
if (it.isEmpty) {
|
||||||
return@let
|
return@let
|
||||||
}
|
}
|
||||||
stateData.addProperty("collision_shapes", getOrAddVoxelShape(it))
|
stateData.addProperty("collision_shapes", getOrAddVoxelShape(it))
|
||||||
}
|
}
|
||||||
(IS_FACE_STURDY.get(cache) as BooleanArray?)?.let {
|
(IS_FACE_STURDY?.get(cache) as BooleanArray?)?.let {
|
||||||
if (allTheSame(it)) {
|
if (allTheSame(it)) {
|
||||||
stateData.addProperty("is_sturdy", it[0])
|
stateData.addProperty("is_sturdy", it[0])
|
||||||
return@let
|
return@let
|
||||||
@ -330,6 +332,13 @@ object BlockGenerator : Generator(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val TINT_PROPERTIES_METHOD = try {
|
||||||
|
BlockColors::class.java.getDeclaredMethod("method_21592")
|
||||||
|
} catch (exception: Exception) {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private val PROPERTY_METHOD = getClass("net.minecraft.state.property.Property")!!
|
private val PROPERTY_METHOD = getClass("net.minecraft.state.property.Property")!!
|
||||||
|
|
||||||
private val PROPERTY_NAME_METHOD = PROPERTY_METHOD.getDeclaredMethod("getName")
|
private val PROPERTY_NAME_METHOD = PROPERTY_METHOD.getDeclaredMethod("getName")
|
||||||
@ -378,10 +387,10 @@ object BlockGenerator : Generator(
|
|||||||
private val CACHE_PROPAGATES_SKYLIGHT_DOWN_FIELD = BLOCK_STATE_CACHE_CLASS.getDeclaredField("translucent")
|
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_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 = BLOCK_STATE_CACHE_CLASS.getDeclaredField("shapes")
|
||||||
private val CACHE_COLLISION_SHAPES_FIELD = BLOCK_STATE_CACHE_CLASS.getDeclaredField("collisionShape")
|
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 = BLOCK_STATE_CACHE_CLASS.getDeclaredField("field_17651")
|
||||||
private val IS_FACE_STURDY = getField(BLOCK_STATE_CACHE_CLASS, "faceSturdy", "isFaceSturdy", "solidFullSquare")!!
|
private val IS_FACE_STURDY = getField(BLOCK_STATE_CACHE_CLASS, "faceSturdy", "isFaceSturdy", "solidFullSquare")
|
||||||
private val IS_COLLISION_SHAPE_FULL_BLOCK = BLOCK_STATE_CACHE_CLASS.getDeclaredField("shapeIsFullCube")
|
private val IS_COLLISION_SHAPE_FULL_BLOCK = getField(BLOCK_STATE_CACHE_CLASS, "shapeIsFullCube", "field_17651")
|
||||||
|
|
||||||
|
|
||||||
private val BLOCK_SPEED_FACTOR_FIELD = getField(Block::class.java, "speedFactor")
|
private val BLOCK_SPEED_FACTOR_FIELD = getField(Block::class.java, "speedFactor")
|
||||||
@ -396,10 +405,7 @@ object BlockGenerator : Generator(
|
|||||||
CACHE_PROPAGATES_SKYLIGHT_DOWN_FIELD.isAccessible = true
|
CACHE_PROPAGATES_SKYLIGHT_DOWN_FIELD.isAccessible = true
|
||||||
CACHE_LIGHT_BLOCK_FIELD.isAccessible = true
|
CACHE_LIGHT_BLOCK_FIELD.isAccessible = true
|
||||||
CACHE_OCCLUSION_SHAPES_FIELD.isAccessible = true
|
CACHE_OCCLUSION_SHAPES_FIELD.isAccessible = true
|
||||||
CACHE_COLLISION_SHAPES_FIELD.isAccessible = true
|
|
||||||
LARGE_COLLISION_SHAPE_FIELD.isAccessible = true
|
LARGE_COLLISION_SHAPE_FIELD.isAccessible = true
|
||||||
IS_FACE_STURDY.isAccessible = true
|
|
||||||
IS_COLLISION_SHAPE_FULL_BLOCK.isAccessible = true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private val BLOCK_STATE_REGISTRY: IdList<BlockState> = Block.STATE_IDS
|
private val BLOCK_STATE_REGISTRY: IdList<BlockState> = Block.STATE_IDS
|
||||||
|
@ -7,12 +7,15 @@ import de.bixilon.pixlyzer.generator.Generator
|
|||||||
import de.bixilon.pixlyzer.util.ReflectionUtil.getClass
|
import de.bixilon.pixlyzer.util.ReflectionUtil.getClass
|
||||||
import de.bixilon.pixlyzer.util.ReflectionUtil.getField
|
import de.bixilon.pixlyzer.util.ReflectionUtil.getField
|
||||||
import net.minecraft.entity.Entity
|
import net.minecraft.entity.Entity
|
||||||
|
import net.minecraft.entity.EntityCategory
|
||||||
|
import net.minecraft.entity.EntityType
|
||||||
import net.minecraft.entity.LivingEntity
|
import net.minecraft.entity.LivingEntity
|
||||||
import net.minecraft.entity.attribute.EntityAttribute
|
import net.minecraft.entity.attribute.EntityAttribute
|
||||||
import net.minecraft.entity.attribute.EntityAttributeInstance
|
import net.minecraft.entity.attribute.EntityAttributeInstance
|
||||||
import net.minecraft.entity.data.TrackedData
|
import net.minecraft.entity.data.TrackedData
|
||||||
import net.minecraft.util.Identifier
|
import net.minecraft.util.Identifier
|
||||||
import net.minecraft.util.registry.Registry
|
import net.minecraft.util.registry.Registry
|
||||||
|
import java.lang.reflect.Method
|
||||||
import java.lang.reflect.Modifier
|
import java.lang.reflect.Modifier
|
||||||
|
|
||||||
object EntityGenerator : Generator(
|
object EntityGenerator : Generator(
|
||||||
@ -28,24 +31,32 @@ object EntityGenerator : Generator(
|
|||||||
entityType.translationKey?.let {
|
entityType.translationKey?.let {
|
||||||
entityData.addProperty("description_id", it)
|
entityData.addProperty("description_id", it)
|
||||||
}
|
}
|
||||||
entityData.addProperty("category", entityType.category.ordinal)
|
|
||||||
entityData.addProperty("serialize", entityType.isSaveable)
|
entityData.addProperty("serialize", entityType.isSaveable)
|
||||||
entityData.addProperty("summon", entityType.isSummonable)
|
entityData.addProperty("summon", entityType.isSummonable)
|
||||||
entityData.addProperty("fire_immune", entityType.isFireImmune)
|
ENTITY_TYPE_FIRE_IMMUNE_FIELD?.getBoolean(entityType)?.let {
|
||||||
entityData.addProperty("can_spawn_far_from_player", entityType.method_20814())
|
entityData.addProperty("fire_immune", it)
|
||||||
|
}
|
||||||
|
CAN_SPAWN_FAR_AWAY_FROM_PLAYER_METHOD?.invoke(entityType)?.let {
|
||||||
|
entityData.addProperty("can_spawn_far_from_player", it as Boolean)
|
||||||
|
}
|
||||||
|
|
||||||
entityType.lootTableId?.let {
|
entityType.lootTableId?.let {
|
||||||
entityData.addProperty("loot_table", it.toString())
|
entityData.addProperty("loot_table", it.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
entityData.addProperty("width", entityType.dimensions.width)
|
getEntitySize(entityType).let {
|
||||||
entityData.addProperty("height", entityType.dimensions.height)
|
entityData.addProperty("width", it.first)
|
||||||
entityData.addProperty("size_fixed", entityType.dimensions.fixed)
|
entityData.addProperty("height", it.second)
|
||||||
|
entityData.addProperty("size_fixed", it.third)
|
||||||
|
}
|
||||||
|
|
||||||
val entity = EntitySpawner.summonEntity(entityType)
|
val entity = EntitySpawner.summonEntity(entityType)
|
||||||
val entity2 = EntitySpawner.summonEntity(entityType)
|
val entity2 = EntitySpawner.summonEntity(entityType)
|
||||||
// some entities have random values, we can and will ignore these ones
|
// some entities have random values, we can and will ignore these ones
|
||||||
|
|
||||||
|
|
||||||
|
entityData.addProperty("category", entityType.getEntityCategory(entity).ordinal)
|
||||||
|
|
||||||
if (entity is LivingEntity && entity2 is LivingEntity) {
|
if (entity is LivingEntity && entity2 is LivingEntity) {
|
||||||
for ((resourceLocation, attribute) in ATTRIBUTE_MAP) {
|
for ((resourceLocation, attribute) in ATTRIBUTE_MAP) {
|
||||||
val attributes = LIVING_ENTITY_GET_ATTRIBUTES_METHOD.invoke(entity) ?: continue
|
val attributes = LIVING_ENTITY_GET_ATTRIBUTES_METHOD.invoke(entity) ?: continue
|
||||||
@ -170,6 +181,14 @@ object EntityGenerator : Generator(
|
|||||||
return json
|
return json
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val CAN_SPAWN_FAR_AWAY_FROM_PLAYER_METHOD: Method? = try {
|
||||||
|
EntityType::class.java.getDeclaredMethod("method_20814")
|
||||||
|
} catch (exception: Exception) {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
|
private val ENTITY_TYPE_FIRE_IMMUNE_FIELD = getField(EntityType::class.java, "fireImmune")
|
||||||
|
|
||||||
private val ATTRIBUTE_CLASS = getClass("net.minecraft.world.entity.ai.attributes.Attributes", "net.minecraft.world.entity.monster.SharedMonsterAttributes", "net.minecraft.entity.attribute.EntityAttributes")!!
|
private val ATTRIBUTE_CLASS = getClass("net.minecraft.world.entity.ai.attributes.Attributes", "net.minecraft.world.entity.monster.SharedMonsterAttributes", "net.minecraft.entity.attribute.EntityAttributes")!!
|
||||||
|
|
||||||
private val ATTRIBUTE_MAP: Map<String, EntityAttribute> = getAttributes()
|
private val ATTRIBUTE_MAP: Map<String, EntityAttribute> = getAttributes()
|
||||||
@ -189,6 +208,25 @@ object EntityGenerator : Generator(
|
|||||||
|
|
||||||
private val ATTRIBUTE_INSTANCE_BASE_VALUE_METHOD = ATTRIBUTE_INSTANCE_CLASS.getMethod("getBaseValue")
|
private val ATTRIBUTE_INSTANCE_BASE_VALUE_METHOD = ATTRIBUTE_INSTANCE_CLASS.getMethod("getBaseValue")
|
||||||
|
|
||||||
|
private val ENTITY_DIMENSION_FIELD = getField(EntityType::class.java, "dimensions")
|
||||||
|
private val ENTITY_DIMENSION_CLASS = getClass("net.minecraft.entity.EntityDimensions")
|
||||||
|
private val ENTITY_DIMENSION_WIDTH_FIELD = getField(ENTITY_DIMENSION_CLASS, "width")
|
||||||
|
private val ENTITY_DIMENSION_HEIGHT_FIELD = getField(ENTITY_DIMENSION_CLASS, "height")
|
||||||
|
private val ENTITY_DIMENSION_FIXED_FIELD = getField(ENTITY_DIMENSION_CLASS, "fixed")
|
||||||
|
|
||||||
|
|
||||||
|
private val ENTITY_WIDTH_FIELD = getField(EntityType::class.java, "field_17488")
|
||||||
|
private val ENTITY_HEIGHT_FIELD = getField(EntityType::class.java, "field_17489")
|
||||||
|
|
||||||
|
private fun getEntitySize(entityType: EntityType<*>): Triple<Float, Float, Boolean?> {
|
||||||
|
ENTITY_DIMENSION_CLASS?.let {
|
||||||
|
val dimension = ENTITY_DIMENSION_FIELD!!.get(entityType)
|
||||||
|
|
||||||
|
return Triple(ENTITY_DIMENSION_WIDTH_FIELD!!.getFloat(dimension), ENTITY_DIMENSION_HEIGHT_FIELD!!.getFloat(dimension), ENTITY_DIMENSION_FIXED_FIELD!!.getBoolean(dimension))
|
||||||
|
}
|
||||||
|
return Triple(ENTITY_WIDTH_FIELD!!.getFloat(entityType), ENTITY_HEIGHT_FIELD!!.getFloat(entityType), null)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun getAttributes(): Map<String, EntityAttribute> {
|
private fun getAttributes(): Map<String, EntityAttribute> {
|
||||||
val attributeRegistryField = getField(Registry::class.java, "ATTRIBUTE", "ATTRIBUTES")
|
val attributeRegistryField = getField(Registry::class.java, "ATTRIBUTE", "ATTRIBUTES")
|
||||||
@ -227,3 +265,18 @@ object EntityGenerator : Generator(
|
|||||||
TODO()
|
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,21 +3,29 @@ package de.bixilon.pixlyzer.generator.generators
|
|||||||
import com.google.gson.JsonArray
|
import com.google.gson.JsonArray
|
||||||
import com.google.gson.JsonObject
|
import com.google.gson.JsonObject
|
||||||
import de.bixilon.pixlyzer.generator.Generator
|
import de.bixilon.pixlyzer.generator.Generator
|
||||||
|
import de.bixilon.pixlyzer.util.ReflectionUtil
|
||||||
import net.minecraft.block.Block
|
import net.minecraft.block.Block
|
||||||
import net.minecraft.block.BlockState
|
import net.minecraft.block.BlockState
|
||||||
import net.minecraft.util.registry.Registry
|
import net.minecraft.util.registry.Registry
|
||||||
import net.minecraft.world.poi.PointOfInterestType
|
import net.minecraft.world.poi.PointOfInterestType
|
||||||
|
import java.lang.reflect.Method
|
||||||
|
|
||||||
object PointOfInterestGenerator : Generator(
|
object PointOfInterestGenerator : Generator(
|
||||||
"points_of_interest"
|
"points_of_interest"
|
||||||
) {
|
) {
|
||||||
override fun generate() {
|
override fun generate() {
|
||||||
|
if (POINT_OF_INTEREST_REGISTRY == null) {
|
||||||
|
throw IllegalArgumentException("Not available in this version yet!")
|
||||||
|
}
|
||||||
|
|
||||||
for (pointOfInterestType in Registry.POINT_OF_INTEREST_TYPE) {
|
for (pointOfInterestType in Registry.POINT_OF_INTEREST_TYPE) {
|
||||||
val resourceIdentifier = Registry.POINT_OF_INTEREST_TYPE.getId(pointOfInterestType)
|
val resourceIdentifier = Registry.POINT_OF_INTEREST_TYPE.getId(pointOfInterestType)
|
||||||
val pointOfInterestData = JsonObject()
|
val pointOfInterestData = JsonObject()
|
||||||
pointOfInterestData.addProperty("id", Registry.POINT_OF_INTEREST_TYPE.getRawId(pointOfInterestType))
|
pointOfInterestData.addProperty("id", Registry.POINT_OF_INTEREST_TYPE.getRawId(pointOfInterestType))
|
||||||
pointOfInterestData.addProperty("max_tickets", pointOfInterestType.ticketCount)
|
pointOfInterestData.addProperty("max_tickets", pointOfInterestType.ticketCount)
|
||||||
pointOfInterestData.addProperty("valid_range", pointOfInterestType.method_21648())
|
VALID_RANGE_METHOD?.invoke(pointOfInterestType)?.let {
|
||||||
|
pointOfInterestData.addProperty("valid_range", it as Int)
|
||||||
|
}
|
||||||
|
|
||||||
(POINT_OF_INTEREST_MATCHING_STATES_FIELD.get(pointOfInterestType) as Set<BlockState>).let {
|
(POINT_OF_INTEREST_MATCHING_STATES_FIELD.get(pointOfInterestType) as Set<BlockState>).let {
|
||||||
val states = JsonArray()
|
val states = JsonArray()
|
||||||
@ -31,9 +39,18 @@ object PointOfInterestGenerator : Generator(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val POINT_OF_INTEREST_REGISTRY = ReflectionUtil.getField(Registry::class.java, "POINT_OF_INTEREST_TYPE")?.get(null) as Registry<Any>?
|
||||||
|
|
||||||
private val POINT_OF_INTEREST_MATCHING_STATES_FIELD = PointOfInterestType::class.java.getDeclaredField("blockStates")
|
private val POINT_OF_INTEREST_MATCHING_STATES_FIELD = PointOfInterestType::class.java.getDeclaredField("blockStates")
|
||||||
|
|
||||||
|
private val VALID_RANGE_METHOD: Method?
|
||||||
|
|
||||||
init {
|
init {
|
||||||
POINT_OF_INTEREST_MATCHING_STATES_FIELD.isAccessible = true
|
POINT_OF_INTEREST_MATCHING_STATES_FIELD.isAccessible = true
|
||||||
|
VALID_RANGE_METHOD = try {
|
||||||
|
PointOfInterestType::class.java.getDeclaredMethod("method_21648")
|
||||||
|
} catch (exception: Exception) {
|
||||||
|
null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
package de.bixilon.pixlyzer.generator.generators
|
package de.bixilon.pixlyzer.generator.generators
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet
|
||||||
import com.google.gson.JsonArray
|
import com.google.gson.JsonArray
|
||||||
import com.google.gson.JsonObject
|
import com.google.gson.JsonObject
|
||||||
import de.bixilon.pixlyzer.generator.Generator
|
import de.bixilon.pixlyzer.generator.Generator
|
||||||
import de.bixilon.pixlyzer.util.ReflectionUtil.getField
|
import de.bixilon.pixlyzer.util.ReflectionUtil.getField
|
||||||
|
import net.minecraft.block.Block
|
||||||
|
import net.minecraft.item.Item
|
||||||
import net.minecraft.sound.SoundEvent
|
import net.minecraft.sound.SoundEvent
|
||||||
import net.minecraft.util.registry.Registry
|
import net.minecraft.util.registry.Registry
|
||||||
import net.minecraft.village.VillagerProfession
|
import net.minecraft.village.VillagerProfession
|
||||||
@ -17,9 +20,11 @@ object VillagerProfessionGenerator : Generator(
|
|||||||
val villagerProfessionData = JsonObject()
|
val villagerProfessionData = JsonObject()
|
||||||
villagerProfessionData.addProperty("id", Registry.VILLAGER_PROFESSION.getRawId(villagerProfession))
|
villagerProfessionData.addProperty("id", Registry.VILLAGER_PROFESSION.getRawId(villagerProfession))
|
||||||
|
|
||||||
villagerProfessionData.addProperty("primary_point_of_interest", Registry.POINT_OF_INTEREST_TYPE.getRawId(villagerProfession.workStation))
|
PointOfInterestGenerator.POINT_OF_INTEREST_REGISTRY?.let {
|
||||||
|
villagerProfessionData.addProperty("primary_point_of_interest", it.getRawId(WORK_STATION_VILLAGER_PROFESSION_TYPE_FIELD!!.get(villagerProfession)))
|
||||||
|
}
|
||||||
|
|
||||||
villagerProfession.gatherableItems.let {
|
(GATHERABLE_ITEMS_FIELD?.get(villagerProfession) as ImmutableSet<Item>?)?.let {
|
||||||
val requestedItems = JsonArray()
|
val requestedItems = JsonArray()
|
||||||
for (item in it) {
|
for (item in it) {
|
||||||
requestedItems.add(Registry.ITEM.getRawId(item))
|
requestedItems.add(Registry.ITEM.getRawId(item))
|
||||||
@ -30,7 +35,7 @@ object VillagerProfessionGenerator : Generator(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
villagerProfession.secondaryJobSites.let {
|
(SECONDARY_JOB_SITES_FIELD?.get(villagerProfession) as ImmutableSet<Block>?)?.let {
|
||||||
val blocks = JsonArray()
|
val blocks = JsonArray()
|
||||||
for (block in it) {
|
for (block in it) {
|
||||||
blocks.add(Registry.BLOCK.getRawId(block))
|
blocks.add(Registry.BLOCK.getRawId(block))
|
||||||
@ -49,5 +54,11 @@ object VillagerProfessionGenerator : Generator(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val WORK_SOUND_PROFESSION = getField(VillagerProfession::class.java, "workSound")
|
private val WORK_SOUND_PROFESSION = getField(VillagerProfession::class.java, "workSound")
|
||||||
|
|
||||||
|
|
||||||
|
private val WORK_STATION_VILLAGER_PROFESSION_TYPE_FIELD = getField(VillagerProfession::class.java, "workStation")
|
||||||
|
|
||||||
|
private val SECONDARY_JOB_SITES_FIELD = getField(VillagerProfession::class.java, "secondaryJobSites")
|
||||||
|
private val GATHERABLE_ITEMS_FIELD = getField(VillagerProfession::class.java, "gatherableItems")
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ package de.bixilon.pixlyzer.generator.generators
|
|||||||
import com.google.gson.JsonArray
|
import com.google.gson.JsonArray
|
||||||
import com.google.gson.JsonObject
|
import com.google.gson.JsonObject
|
||||||
import de.bixilon.pixlyzer.generator.Generator
|
import de.bixilon.pixlyzer.generator.Generator
|
||||||
|
import de.bixilon.pixlyzer.util.ReflectionUtil
|
||||||
import net.minecraft.util.math.Box
|
import net.minecraft.util.math.Box
|
||||||
import net.minecraft.util.shape.VoxelShape
|
import net.minecraft.util.shape.VoxelShape
|
||||||
|
|
||||||
@ -27,16 +28,12 @@ object VoxelShapeGenerator : Generator(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private val VOXEL_SHAPE_FACES_FIELD = VoxelShape::class.java.getDeclaredField("shapeCache")
|
private val VOXEL_SHAPE_FACES_FIELD = ReflectionUtil.getField(VoxelShape::class.java, "shapeCache")
|
||||||
|
|
||||||
init {
|
|
||||||
VOXEL_SHAPE_FACES_FIELD.isAccessible = true
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private fun VoxelShape.serialize(): JsonObject {
|
private fun VoxelShape.serialize(): JsonObject {
|
||||||
val json = 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) {
|
if (faces != null) {
|
||||||
check(faces.size == 6)
|
check(faces.size == 6)
|
||||||
|
|
||||||
|
@ -320,7 +320,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"FUSE_SPEED": "CREEPER_STATE",
|
"FUSE_SPEED": "CREEPER_STATE",
|
||||||
"CHARGED": "CREEPER_IS_CHARGED",
|
"CHARGED": "CREEPER_IS_CHARGED",
|
||||||
"IGNITED": "CREEPER_IS_IGNITED"
|
"IGNITED": "CREEPER_IS_IGNITED",
|
||||||
|
"field_19170": "3d_SHAREWARE_D20_BOOLEAN"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"EndermanEntity": {
|
"EndermanEntity": {
|
||||||
|
@ -1,31 +1,33 @@
|
|||||||
import os
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
import urllib.request
|
import urllib.request
|
||||||
import zipfile
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
import ujson
|
import ujson
|
||||||
|
|
||||||
DOWNLOAD_UNTIL_VERSION = "1.14.4-pre7"
|
# ToDo: "19w35a", "19w34a","19w11a", "19w09a", "19w08b", "19w08a", "19w07a", "19w06a", "19w05a", "19w04b", "19w04a", "19w03c", "19w03b", "19w03a", "19w02a", "18w50a", "18w49a", "18w48b" "18w48a", "18w47b", "18w47a", "18w46a", "18w45a", "18w44a", "18w43c", "18w43b"
|
||||||
SKIP_VERSIONS = ["19w35a", "19w34a"]
|
VERSIONS_DO_GENERATE = ["1.14.4-pre7", "1.14.4-pre6", "1.14.4-pre5", "1.14.4-pre4", "1.14.4-pre3", "1.14.4-pre2", "1.14.4-pre1", "1.14.3", "1.14.3", "1.14.3-pre4",
|
||||||
|
"1.14.3-pre3", "1.14.3-pre2", "1.14.3-pre1", "1.14.2", "1.14.2 Pre-Release 4", "1.14.2 Pre-Release 3", "1.14.2 Pre-Release 2", "1.14.2 Pre-Release 1", "1.14.1",
|
||||||
|
"1.14.1 Pre-Release 2", "1.14.1 Pre-Release 1", "1.14", "1.14 Pre-Release 5", "1.14 Pre-Release 4", "1.14 Pre-Release 3", "1.14 Pre-Release 2", "1.14 Pre-Release 1",
|
||||||
|
"19w14b", "19w14a", "3D Shareware v1.34", "19w13b", "19w13a", "19w12b", "19w12a", "19w11b"]
|
||||||
|
|
||||||
HASH_FOLDER = os.path.abspath("data/hash/") + "/"
|
HASH_FOLDER = os.path.abspath("data/hash/") + "/"
|
||||||
ASSETS_HASH_INDEX_FILE = os.path.abspath("data/index")
|
ASSETS_HASH_INDEX_FILE = os.path.abspath("data/index")
|
||||||
OUT_FOLDER = os.path.abspath("data/version/") + "/"
|
OUT_FOLDER = os.path.abspath("data/version/") + "/"
|
||||||
DATA_FOLDER = os.path.abspath("data/data/") + "/"
|
DATA_FOLDER = os.path.abspath("data/data/") + "/"
|
||||||
|
|
||||||
MC_REMAPPER_EXECUTABLE = "/home/moritz/Games/Minecraft/MC-Remapper/build/install/MC-Remapper/bin/MC-Remapper"
|
JAVA_PATH = "/usr/lib/jvm/graalvm-ce-java8-21.0.0.2//bin/java"
|
||||||
JAVA_PATH = "/usr/lib/jvm/graalvm-ce-java11-21.0.0.2/bin/java"
|
|
||||||
ADDITIONAL_CLASSPATH = "/home/moritz/kotlin-stdlib-1.4.30.jar:/home/moritz/Games/Minecraft/PixLyzer/wrapper/data/objenesis-tck-3.1.jar"
|
ADDITIONAL_CLASSPATH = "/home/moritz/kotlin-stdlib-1.4.30.jar:/home/moritz/Games/Minecraft/PixLyzer/wrapper/data/objenesis-tck-3.1.jar"
|
||||||
|
|
||||||
VERSION_MANIFEST_URL = "https://launchermeta.mojang.com/mc/game/version_manifest.json"
|
VERSION_MANIFEST_URL = "https://launchermeta.mojang.com/mc/game/version_manifest.json"
|
||||||
|
|
||||||
COMPILE_VERSION = "21w08a"
|
COMPILE_VERSION = "19w35a"
|
||||||
|
|
||||||
failedVersionIds = []
|
failedVersionIds = []
|
||||||
partlyFailedVersionIds = []
|
partlyFailedVersionIds = []
|
||||||
|
|
||||||
print("Starting PixLyzer generator")
|
print("Starting PixLyzer-yarn generator")
|
||||||
print("Downloading version manifest")
|
print("Downloading version manifest")
|
||||||
VERSION_MANIFEST = ujson.loads(urllib.request.urlopen(VERSION_MANIFEST_URL).read().decode("utf-8"))
|
VERSION_MANIFEST = ujson.loads(urllib.request.urlopen(VERSION_MANIFEST_URL).read().decode("utf-8"))
|
||||||
|
|
||||||
@ -38,13 +40,6 @@ def searchVersion(versionId):
|
|||||||
raise Exception("Unknown version: %s" % versionId)
|
raise Exception("Unknown version: %s" % versionId)
|
||||||
|
|
||||||
|
|
||||||
startWithVersion = input("Enter version to start with: ")
|
|
||||||
if startWithVersion == "":
|
|
||||||
startWithVersion = VERSION_MANIFEST["versions"][0]["id"]
|
|
||||||
print("No version provided, starting with %s" % startWithVersion)
|
|
||||||
searchVersion(startWithVersion)
|
|
||||||
|
|
||||||
|
|
||||||
def runAndWait(command):
|
def runAndWait(command):
|
||||||
process = subprocess.Popen(command, cwd=r'../', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
process = subprocess.Popen(command, cwd=r'../', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
exitCode = process.wait()
|
exitCode = process.wait()
|
||||||
@ -58,7 +53,7 @@ def getVersionJson(versionEntry):
|
|||||||
# check cache
|
# check cache
|
||||||
global DATA_FOLDER
|
global DATA_FOLDER
|
||||||
versionId = versionEntry["id"]
|
versionId = versionEntry["id"]
|
||||||
path = DATA_FOLDER + versionId + "/" + versionId + ".json"
|
path = DATA_FOLDER + versionId + "_yarn/" + versionId + ".json"
|
||||||
if not os.path.isfile(path):
|
if not os.path.isfile(path):
|
||||||
# download
|
# download
|
||||||
print("Debug: Downloading %s.json" % versionEntry["id"])
|
print("Debug: Downloading %s.json" % versionEntry["id"])
|
||||||
@ -68,60 +63,28 @@ def getVersionJson(versionEntry):
|
|||||||
return ujson.load(open(path))
|
return ujson.load(open(path))
|
||||||
|
|
||||||
|
|
||||||
def checkDeobfuscatedJar(jarBasePath, jarType, version, versionJson):
|
def checkServerJar(jarBasePath, version, versionJson):
|
||||||
jarPath = jarBasePath + jarType + ".jar"
|
jarPath = jarBasePath + ".jar"
|
||||||
|
|
||||||
if not os.path.isfile(jarPath):
|
if not os.path.isfile(jarPath):
|
||||||
mojangJarPath = jarBasePath + jarType + "_mojang.jar"
|
mojangJarPath = jarBasePath + "_server_mojang.jar"
|
||||||
if not os.path.isfile(mojangJarPath):
|
if not os.path.isfile(mojangJarPath):
|
||||||
print("Downloading mojang %s jar for %s" % (jarType, version["id"]))
|
print("Downloading mojang server jar for %s" % (version["id"]))
|
||||||
urllib.request.urlretrieve(versionJson["downloads"][jarType]["url"], mojangJarPath + ".tmp")
|
urllib.request.urlretrieve(versionJson["downloads"]["server"]["url"], mojangJarPath + ".tmp")
|
||||||
os.rename(mojangJarPath + ".tmp", mojangJarPath)
|
os.rename(mojangJarPath + ".tmp", mojangJarPath)
|
||||||
|
|
||||||
mojangMappingsPath = jarBasePath + jarType + "_mappings.txt"
|
|
||||||
if not os.path.isfile(mojangMappingsPath):
|
|
||||||
print("Downloading mojang %s mappings for %s" % (jarType, version["id"]))
|
|
||||||
urllib.request.urlretrieve(versionJson["downloads"][jarType + "_mappings"]["url"], mojangMappingsPath + ".tmp")
|
|
||||||
os.rename(mojangMappingsPath + ".tmp", mojangMappingsPath)
|
|
||||||
|
|
||||||
# deobfuscate
|
def checkDeobfuscatedClientJar(jarBasePath, version, versionJson):
|
||||||
print("Deobfuscating %s jar for %s" % (jarType, version["id"]))
|
yarnJarPath = jarBasePath + "-named.jar"
|
||||||
global MC_REMAPPER_EXECUTABLE
|
if not os.path.isfile(yarnJarPath):
|
||||||
|
raise Exception("Yarn jar does not exist for %s. You must generate it first!" % version["id"])
|
||||||
deobfuscateProcess = subprocess.Popen('%s \"%s\" \"%s\" --output-name \"%s\"' % (MC_REMAPPER_EXECUTABLE, mojangJarPath, mojangMappingsPath, jarPath + ".tmp"), cwd=r'.', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
||||||
exitCode = deobfuscateProcess.wait()
|
|
||||||
if exitCode != 0:
|
|
||||||
print("Could not deobfuscate %s jar for %s" % (jarType, version["id"]))
|
|
||||||
print()
|
|
||||||
print(deobfuscateProcess.stdout.read().decode('utf-8'))
|
|
||||||
print(deobfuscateProcess.stderr.read().decode('utf-8'))
|
|
||||||
exit(5)
|
|
||||||
else:
|
|
||||||
# delete mojang jars
|
|
||||||
print("Deleting META-INF folder")
|
|
||||||
zipIn = zipfile.ZipFile(jarPath + ".tmp", 'r')
|
|
||||||
zipOut = zipfile.ZipFile(jarPath + ".tmp2", 'w')
|
|
||||||
for item in zipIn.infolist():
|
|
||||||
buffer = zipIn.read(item.filename)
|
|
||||||
if not item.filename.startswith("META-INF"):
|
|
||||||
zipOut.writestr(item, buffer)
|
|
||||||
|
|
||||||
zipOut.close()
|
|
||||||
zipIn.close()
|
|
||||||
|
|
||||||
os.remove(jarPath + ".tmp")
|
|
||||||
os.rename(jarPath + ".tmp2", jarPath)
|
|
||||||
|
|
||||||
print("Deleting %s jar and mappings for %s" % (jarType, version["id"]))
|
|
||||||
os.remove(mojangJarPath)
|
|
||||||
os.remove(mojangMappingsPath)
|
|
||||||
|
|
||||||
|
|
||||||
def checkDeobfuscatedJars(version, versionJson):
|
def checkJars(version, versionJson):
|
||||||
global DATA_FOLDER
|
global DATA_FOLDER
|
||||||
jarBasePath = DATA_FOLDER + version["id"] + "/" + version["id"] + "_"
|
jarBasePath = DATA_FOLDER + version["id"] + "_yarn/" + version["id"]
|
||||||
checkDeobfuscatedJar(jarBasePath, "client", version, versionJson)
|
checkDeobfuscatedClientJar(jarBasePath, version, versionJson)
|
||||||
checkDeobfuscatedJar(jarBasePath, "server", version, versionJson)
|
checkServerJar(jarBasePath, version, versionJson)
|
||||||
|
|
||||||
|
|
||||||
def replaceInFile(file, search, replace):
|
def replaceInFile(file, search, replace):
|
||||||
@ -139,7 +102,7 @@ def compilePixLyzer():
|
|||||||
for versionEntry in searched:
|
for versionEntry in searched:
|
||||||
compileVersion[versionEntry] = searched[versionEntry]
|
compileVersion[versionEntry] = searched[versionEntry]
|
||||||
|
|
||||||
checkDeobfuscatedJars(compileVersion, getVersionJson(compileVersion))
|
checkJars(compileVersion, getVersionJson(compileVersion))
|
||||||
if runAndWait('mvn clean verify') != 0:
|
if runAndWait('mvn clean verify') != 0:
|
||||||
raise Exception("Can not compile PixLyzer")
|
raise Exception("Can not compile PixLyzer")
|
||||||
print("PixLyzer is now compiled")
|
print("PixLyzer is now compiled")
|
||||||
@ -147,31 +110,18 @@ def compilePixLyzer():
|
|||||||
|
|
||||||
compilePixLyzer()
|
compilePixLyzer()
|
||||||
|
|
||||||
startWorking = False
|
|
||||||
|
|
||||||
for version in VERSION_MANIFEST["versions"]:
|
for version in VERSION_MANIFEST["versions"]:
|
||||||
if version["id"] == startWithVersion:
|
if version["id"] not in VERSIONS_DO_GENERATE:
|
||||||
startWorking = True
|
|
||||||
|
|
||||||
if not startWorking:
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if version["id"] in SKIP_VERSIONS:
|
|
||||||
print("Skipping %s" % version["id"])
|
|
||||||
continue
|
|
||||||
|
|
||||||
if version["id"] == DOWNLOAD_UNTIL_VERSION:
|
|
||||||
print("Breaking at %s" % version["id"])
|
|
||||||
break
|
|
||||||
|
|
||||||
versionJson = getVersionJson(version)
|
versionJson = getVersionJson(version)
|
||||||
|
|
||||||
checkDeobfuscatedJars(version, versionJson)
|
checkJars(version, versionJson)
|
||||||
|
|
||||||
versionStartTime = datetime.now()
|
versionStartTime = datetime.now()
|
||||||
print("Generating data for %s" % version["id"])
|
print("Generating data for %s" % version["id"])
|
||||||
# execute
|
# execute
|
||||||
if runAndWait("%s -classpath \"%s:%s:%s:%s\" de.bixilon.pixlyzer.PixLyzer %s %s %s" % (JAVA_PATH, ADDITIONAL_CLASSPATH, DATA_FOLDER + version["id"] + "/" + version["id"] + "_client.jar", DATA_FOLDER + version["id"] + "/" + version["id"] + "_server.jar", "target/classes", OUT_FOLDER + version["id"], HASH_FOLDER, ASSETS_HASH_INDEX_FILE)) != 0:
|
if runAndWait("%s -classpath \"%s:%s:%s:%s\" de.bixilon.pixlyzer.PixLyzer \"%s\" \"%s\" \"%s\"" % (JAVA_PATH, ADDITIONAL_CLASSPATH, DATA_FOLDER + version["id"] + "_yarn/" + version["id"] + "-named.jar", DATA_FOLDER + version["id"] + "_yarn/" + version["id"] + "_server_mojang.jar", "target/classes", OUT_FOLDER + version["id"], HASH_FOLDER, ASSETS_HASH_INDEX_FILE)) != 0:
|
||||||
print("PixLyzer did not run successfully for %s" % version["id"])
|
print("PixLyzer did not run successfully for %s" % version["id"])
|
||||||
break
|
break
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user