support for version: 1.16.5

This commit is contained in:
Bixilon 2021-02-22 00:19:18 +01:00
parent 687313c607
commit 8dca0bd5b4
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
20 changed files with 359 additions and 122 deletions

View File

@ -15,7 +15,7 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<kotlin.code.style>official</kotlin.code.style>
<kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>
<minecraft.version>1.15.2</minecraft.version>
<minecraft.version>1.16.5</minecraft.version>
</properties>
<repositories>

View File

@ -2,23 +2,21 @@ package de.bixilon.pixlyzer
import de.bixilon.pixlyzer.dummy.DummyPlayer
import de.bixilon.pixlyzer.dummy.chunk.DummyLevel
import net.minecraft.core.BlockPos
import net.minecraft.core.Registry
import net.minecraft.world.entity.Entity
import net.minecraft.world.entity.EntityType
import net.minecraft.world.entity.MobSpawnType
import net.minecraft.world.entity.fishing.FishingHook
import net.minecraft.world.entity.global.LightningBolt
import net.minecraft.world.entity.LightningBolt
import net.minecraft.world.entity.projectile.FishingHook
object EntitySpawner {
fun summonEntity(entityType: EntityType<*>): Entity {
var entity = entityType.spawn(DummyLevel, null, DummyPlayer, BlockPos(0, 0, 0), MobSpawnType.COMMAND, true, true)
var entity = entityType.create(DummyLevel)
if (entity == null) {
entity = when (entityType) {
EntityType.PLAYER -> DummyPlayer
EntityType.LIGHTNING_BOLT -> LightningBolt(DummyLevel, 0.0, 0.0, 0.0, false)
EntityType.LIGHTNING_BOLT -> LightningBolt(EntityType.LIGHTNING_BOLT, DummyLevel)
EntityType.FISHING_BOBBER -> FishingHook(DummyPlayer, DummyLevel, 0, 0)
else -> entity
}

View File

@ -0,0 +1,13 @@
package de.bixilon.pixlyzer.dummy
import net.minecraft.world.level.dimension.DimensionType
object DimensionTypeProvider {
val DIMENSION_TYPE_OVERWORLD_FIELD = DimensionType::class.java.getDeclaredField("DEFAULT_OVERWORLD")
init {
DIMENSION_TYPE_OVERWORLD_FIELD.isAccessible = true
}
val DIMENSION_TYPE_OVERWORLD = DIMENSION_TYPE_OVERWORLD_FIELD.get(null) as DimensionType
}

View File

@ -2,10 +2,13 @@ package de.bixilon.pixlyzer.dummy
import de.bixilon.pixlyzer.dummy.chunk.DummyGameProfile
import de.bixilon.pixlyzer.dummy.chunk.DummyLevel
import net.minecraft.core.BlockPos
import net.minecraft.world.entity.player.Player
object DummyPlayer : Player(
DummyLevel,
BlockPos(0, 0, 0),
0f,
DummyGameProfile
) {
override fun isSpectator(): Boolean {

View File

@ -0,0 +1,18 @@
package de.bixilon.pixlyzer.dummy.chunk
import net.minecraft.core.IdMap
import net.minecraft.world.level.biome.Biome
object BiomeIdMap : IdMap<Biome> {
override fun iterator(): MutableIterator<Biome> {
TODO("Not yet implemented")
}
override fun getId(p0: Biome?): Int {
return 0
}
override fun byId(p0: Int): Biome? {
return null
}
}

View File

@ -1,11 +0,0 @@
package de.bixilon.pixlyzer.dummy.chunk
import net.minecraft.core.Registry
import net.minecraft.world.level.biome.Biome
import net.minecraft.world.level.biome.BiomeSource
object DummyBiomeSource : BiomeSource(mutableSetOf(Registry.BIOME.byId(0)!!)) {
override fun getNoiseBiome(p0: Int, p1: Int, p2: Int): Biome {
return Registry.BIOME.byId(0)!!
}
}

View File

@ -5,7 +5,6 @@ import net.minecraft.world.level.chunk.ChunkAccess
import net.minecraft.world.level.chunk.ChunkSource
import net.minecraft.world.level.chunk.ChunkStatus
import net.minecraft.world.level.lighting.LevelLightEngine
import java.util.function.BooleanSupplier
object DummyChunkSource : ChunkSource() {
override fun getLevel(): BlockGetter {
@ -16,9 +15,6 @@ object DummyChunkSource : ChunkSource() {
return DummyLevelChunk
}
override fun tick(p0: BooleanSupplier?) {
}
override fun gatherStats(): String {
return ""
}

View File

@ -1,41 +1,55 @@
package de.bixilon.pixlyzer.dummy.chunk
import de.bixilon.pixlyzer.dummy.DimensionTypeProvider
import de.bixilon.pixlyzer.dummy.DummyProfileFiller
import de.bixilon.pixlyzer.dummy.DummyScoreboard
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.core.Registry
import net.minecraft.core.RegistryAccess
import net.minecraft.resources.ResourceKey
import net.minecraft.resources.ResourceLocation
import net.minecraft.sounds.SoundEvent
import net.minecraft.sounds.SoundSource
import net.minecraft.tags.TagManager
import net.minecraft.tags.TagContainer
import net.minecraft.world.entity.Entity
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.crafting.RecipeManager
import net.minecraft.world.level.*
import net.minecraft.world.level.Level
import net.minecraft.world.level.TickList
import net.minecraft.world.level.biome.Biome
import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.chunk.ChunkSource
import net.minecraft.world.level.material.Fluid
import net.minecraft.world.level.saveddata.maps.MapItemSavedData
import net.minecraft.world.level.storage.LevelData
import net.minecraft.world.scores.Scoreboard
import java.util.function.BiFunction
import java.util.function.Supplier
object DummyLevel : Level(
LevelData(LevelSettings(0, GameType.CREATIVE, true, true, LevelType.CUSTOMIZED), "lol"),
Registry.DIMENSION_TYPE.get(ResourceLocation("overworld")),
BiFunction { t, u ->
DummyChunkSource
},
DummyProfileFiller,
false
DummyWritableLevelData,
ResourceKey.create(Registry.DIMENSION_REGISTRY, ResourceLocation("dummy")),
DimensionTypeProvider.DIMENSION_TYPE_OVERWORLD,
Supplier { DummyProfileFiller },
false,
false,
0L
) {
override fun players(): MutableList<out Player> {
return mutableListOf()
}
override fun getUncachedNoiseBiome(p0: Int, p1: Int, p2: Int): Biome {
return Registry.BIOME.byId(0)!!
override fun getShade(p0: Direction?, p1: Boolean): Float {
return 0f
}
override fun getUncachedNoiseBiome(p0: Int, p1: Int, p2: Int): Biome? {
//return Registry.BIOME.byId(0)!!
return null
}
override fun registryAccess(): RegistryAccess {
TODO("Not yet implemented")
}
override fun getBlockTicks(): TickList<Block> {
@ -46,6 +60,10 @@ object DummyLevel : Level(
TODO("Not yet implemented")
}
override fun getChunkSource(): ChunkSource {
return DummyChunkSource
}
override fun playSound(p0: Player?, p1: Double, p2: Double, p3: Double, p4: SoundEvent?, p5: SoundSource?, p6: Float, p7: Float) {
}
@ -81,10 +99,12 @@ object DummyLevel : Level(
}
override fun getRecipeManager(): RecipeManager {
return RecipeManager()
}
override fun getTagManager(): TagContainer {
TODO("Not yet implemented")
}
override fun getTagManager(): TagManager {
TODO("Not yet implemented")
}
}

View File

@ -4,4 +4,4 @@ import net.minecraft.world.level.ChunkPos
import net.minecraft.world.level.chunk.ChunkBiomeContainer
import net.minecraft.world.level.chunk.LevelChunk
object DummyLevelChunk : LevelChunk(DummyLevel, ChunkPos(0, 0), ChunkBiomeContainer(ChunkPos(0, 0), DummyBiomeSource))
object DummyLevelChunk : LevelChunk(DummyLevel, ChunkPos(0, 0), ChunkBiomeContainer(BiomeIdMap, intArrayOf(0)))

View File

@ -0,0 +1,70 @@
package de.bixilon.pixlyzer.dummy.chunk
import net.minecraft.world.Difficulty
import net.minecraft.world.level.GameRules
import net.minecraft.world.level.storage.WritableLevelData
object DummyWritableLevelData : WritableLevelData {
override fun getXSpawn(): Int {
return 0
}
override fun getYSpawn(): Int {
return 0
}
override fun getZSpawn(): Int {
return 0
}
override fun getSpawnAngle(): Float {
return 0f
}
override fun getGameTime(): Long {
return 0L
}
override fun getDayTime(): Long {
return 0L
}
override fun isThundering(): Boolean {
return false
}
override fun isRaining(): Boolean {
return false
}
override fun setRaining(p0: Boolean) {
}
override fun isHardcore(): Boolean {
return false
}
override fun getGameRules(): GameRules {
return GameRules()
}
override fun getDifficulty(): Difficulty {
return Difficulty.HARD
}
override fun isDifficultyLocked(): Boolean {
return false
}
override fun setXSpawn(p0: Int) {
}
override fun setYSpawn(p0: Int) {
}
override fun setZSpawn(p0: Int) {
}
override fun setSpawnAngle(p0: Float) {
}
}

View File

@ -5,26 +5,28 @@ import de.bixilon.pixlyzer.generator.generators.*
object Generators {
val GENERATORS: List<Generator> = mutableListOf(
BiomeGenerator,
ItemGenerator,
CreativeInventoryTabGenerator,
MobEffectGenerator,
EnchantmentGenerator,
PotionGenerator,
MotiveGenerator,
DimensionGenerator,
BlockGenerator,
RarityGenerator,
MobCategoryGenerator,
EntityGenerator,
ParticleGenerator,
BlockEntityGenerator,
StatisticsGenerator,
VersionGenerator,
VillagerTypeGenerator,
PointOfInterestGenerator,
VillagerProfessionGenerator,
MenuTypeGenerator,
SoundEventGenerator,
BiomeGenerator,
ItemGenerator,
CreativeInventoryTabGenerator,
MobEffectGenerator,
EnchantmentGenerator,
PotionGenerator,
MotiveGenerator,
DimensionGenerator,
BlockGenerator,
RarityGenerator,
MobCategoryGenerator,
EntityGenerator,
ParticleGenerator,
BlockEntityGenerator,
StatisticsGenerator,
VersionGenerator,
VillagerTypeGenerator,
PointOfInterestGenerator,
VillagerProfessionGenerator,
MenuTypeGenerator,
SoundEventGenerator,
BiomeCategoryGenerator,
BiomePrecipationsGenerator,
)
}

View File

@ -0,0 +1,19 @@
package de.bixilon.pixlyzer.generator.generators
import com.google.gson.JsonObject
import de.bixilon.pixlyzer.generator.Generator
import net.minecraft.world.level.biome.Biome
object BiomeCategoryGenerator : Generator(
"biome_categories"
) {
override fun generate() {
for (biomeCategory in Biome.BiomeCategory.values()) {
val biomeCategoryData = JsonObject()
biomeCategoryData.addProperty("name", biomeCategory.name)
data.add(biomeCategory.ordinal.toString(), biomeCategoryData)
}
}
}

View File

@ -3,34 +3,48 @@ package de.bixilon.pixlyzer.generator.generators
import com.google.gson.JsonObject
import de.bixilon.pixlyzer.generator.Generator
import net.minecraft.core.Registry
import net.minecraft.world.level.biome.Biome
import net.minecraft.data.BuiltinRegistries
object BiomeGenerator : Generator(
"biomes"
) {
override fun generate() {
for (biome in Registry.BIOME) {
val resourceIdentifier = Registry.BIOME.getKey(biome)
for (biome in BuiltinRegistries.BIOME) {
val resourceIdentifier = BuiltinRegistries.BIOME.getKey(biome)
val biomeData = JsonObject()
biomeData.addProperty("id", Registry.BIOME.getId(biome))
biome.descriptionId?.let {
biomeData.addProperty("description_id", it)
}
biomeData.addProperty("id", BuiltinRegistries.BIOME.getId(biome))
biomeData.addProperty("depth", biome.depth)
biomeData.addProperty("scale", biome.scale)
biomeData.addProperty("temperature", biome.temperature)
biomeData.addProperty("temperature", biome.baseTemperature)
biomeData.addProperty("downfall", biome.downfall)
biomeData.addProperty("water_color", biome.waterColor)
biomeData.addProperty("water_fog_color", biome.waterFogColor)
biomeData.addProperty("sky_color", SKY_COLOR_FIELD.getInt(biome))
biomeData.addProperty("category", biome.biomeCategory.ordinal)
biomeData.addProperty("precipitation", biome.precipitation.ordinal)
biome.specialEffects?.let {
biomeData.addProperty("fog_color", it.fogColor)
biomeData.addProperty("water_color", it.waterColor)
biomeData.addProperty("water_fog_color", it.waterFogColor)
biomeData.addProperty("sky_color", it.skyColor)
if (it.foliageColorOverride.isPresent) {
biomeData.addProperty("foliage_color_override", it.foliageColorOverride.get())
}
if (it.grassColorOverride.isPresent) {
biomeData.addProperty("grass_color_override", it.grassColorOverride.get())
}
it.grassColorModifier?.let {
biomeData.addProperty("grass_color_modifier", it.name.toLowerCase())
}
if (it.ambientLoopSoundEvent.isPresent) {
biomeData.addProperty("ambient_sound_event_loop", Registry.SOUND_EVENT.getId(it.ambientLoopSoundEvent.get()))
}
if (it.backgroundMusic.isPresent) {
biomeData.addProperty("background_music", Registry.SOUND_EVENT.getId(it.backgroundMusic.get().event))
}
}
data.add(resourceIdentifier.toString(), biomeData)
}
}
private val SKY_COLOR_FIELD = Biome::class.java.getDeclaredField("skyColor")
init {
SKY_COLOR_FIELD.isAccessible = true
}
}

View File

@ -0,0 +1,19 @@
package de.bixilon.pixlyzer.generator.generators
import com.google.gson.JsonObject
import de.bixilon.pixlyzer.generator.Generator
import net.minecraft.world.level.biome.Biome
object BiomePrecipationsGenerator : Generator(
"biome_precipations"
) {
override fun generate() {
for (biomeCategory in Biome.Precipitation.values()) {
val biomeCategoryData = JsonObject()
biomeCategoryData.addProperty("name", biomeCategory.name)
data.add(biomeCategory.ordinal.toString(), biomeCategoryData)
}
}
}

View File

@ -5,10 +5,12 @@ import de.bixilon.pixlyzer.generator.Generator
import net.minecraft.client.color.block.BlockColors
import net.minecraft.core.IdMapper
import net.minecraft.core.Registry
import net.minecraft.sounds.SoundEvents
import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.Blocks
import net.minecraft.world.level.block.state.AbstractStateHolder
import net.minecraft.world.level.block.state.BlockBehaviour
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.StateHolder
object BlockGenerator : Generator(
"blocks"
@ -30,8 +32,8 @@ object BlockGenerator : Generator(
val resourceIdentifier = Registry.BLOCK.getKey(block)
val blockData = JsonObject()
blockData.addProperty("id", Registry.BLOCK.getId(block))
blockData.addProperty("destroy_speed", BLOCK_DESTROY_SPEED_FIELD.getFloat(block))
blockData.addProperty("explosion_resistance", block.explosionResistance)
blockData.addProperty("item", Registry.ITEM.getId(block.asItem()))
if (block.friction != 0.6f) {
blockData.addProperty("friction", block.friction)
}
@ -44,7 +46,6 @@ object BlockGenerator : Generator(
blockData.addProperty("default_state", Block.getId(block.defaultBlockState()))
blockData.addProperty("has_collision", BLOCK_HAS_COLLISION_FIELD.getBoolean(block))
blockData.addProperty("has_dynamic_shape", block.hasDynamicShape())
blockData.addProperty("can_occlude", BLOCK_CAN_OCCLUDE_FIELD.getBoolean(block))
val states = JsonObject()
@ -88,7 +89,37 @@ object BlockGenerator : Generator(
if (state.useShapeForLightOcclusion()) {
stateData.addProperty("use_shape_for_light_occlusion", state.useShapeForLightOcclusion())
}
// ToDo stateData.addProperty("sound_type", state.soundType)
if (state.soundType.volume != 1f) {
stateData.addProperty("sound_type_volume", state.soundType.volume)
}
if (state.soundType.pitch != 1f) {
stateData.addProperty("sound_type_volume", state.soundType.pitch)
}
if (state.soundType.breakSound != SoundEvents.STONE_BREAK) {
stateData.addProperty("break_sound_type", Registry.SOUND_EVENT.getId(state.soundType.breakSound))
}
if (state.soundType.stepSound != SoundEvents.STONE_STEP) {
stateData.addProperty("step_sound_type", Registry.SOUND_EVENT.getId(state.soundType.stepSound))
}
if (state.soundType.placeSound != SoundEvents.STONE_PLACE) {
stateData.addProperty("place_sound_type", Registry.SOUND_EVENT.getId(state.soundType.placeSound))
}
if (state.soundType.hitSound != SoundEvents.STONE_HIT) {
stateData.addProperty("hit_sound_type", Registry.SOUND_EVENT.getId(state.soundType.hitSound))
}
if (state.soundType.fallSound != SoundEvents.STONE_FALL) {
stateData.addProperty("fall_sound_type", Registry.SOUND_EVENT.getId(state.soundType.fallSound))
}
if (state.requiresCorrectToolForDrops()) {
stateData.addProperty("requires_correct_tool_for_drop", state.requiresCorrectToolForDrops())
}
if (!state.canOcclude()) {
stateData.addProperty("can_occlude", state.canOcclude())
}
stateData.addProperty("destroy_speed", BLOCK_DESTROY_SPEED_FIELD.getFloat(state))
try {
if (colorProperties.size > 0) {
@ -139,21 +170,17 @@ object BlockGenerator : Generator(
}
}
private val BLOCK_STATE_REGISTRY_FIELD = Block::class.java.getDeclaredField("BLOCK_STATE_REGISTRY")
private val BLOCK_DESTROY_SPEED_FIELD = Block::class.java.getDeclaredField("destroySpeed")
private val BLOCK_HAS_COLLISION_FIELD = Block::class.java.getDeclaredField("hasCollision")
private val BLOCK_CAN_OCCLUDE_FIELD = Block::class.java.getDeclaredField("canOcclude")
private val BLOCK_STATE_OWNER_FIELD = AbstractStateHolder::class.java.getDeclaredField("owner")
private val BLOCK_DESTROY_SPEED_FIELD = BlockBehaviour.BlockStateBase::class.java.getDeclaredField("destroySpeed")
private val BLOCK_HAS_COLLISION_FIELD = BlockBehaviour::class.java.getDeclaredField("hasCollision")
private val BLOCK_STATE_OWNER_FIELD = StateHolder::class.java.getDeclaredField("owner")
init {
BLOCK_STATE_REGISTRY_FIELD.isAccessible = true
BLOCK_DESTROY_SPEED_FIELD.isAccessible = true
BLOCK_HAS_COLLISION_FIELD.isAccessible = true
BLOCK_CAN_OCCLUDE_FIELD.isAccessible = true
BLOCK_STATE_OWNER_FIELD.isAccessible = true
}
private val BLOCK_STATE_REGISTRY: IdMapper<BlockState> = BLOCK_STATE_REGISTRY_FIELD.get(null) as IdMapper<BlockState>
private val BLOCK_STATE_REGISTRY: IdMapper<BlockState> = Block.BLOCK_STATE_REGISTRY
private val DEFAULT_BLOCK_COLORS = BlockColors.createDefault()

View File

@ -2,21 +2,64 @@ package de.bixilon.pixlyzer.generator.generators
import com.google.gson.JsonObject
import de.bixilon.pixlyzer.generator.Generator
import net.minecraft.core.Registry
import net.minecraft.world.level.dimension.DimensionType
import java.lang.reflect.Modifier
import java.util.*
object DimensionGenerator : Generator(
"dimensions"
) {
override fun generate() {
for (dimension in Registry.DIMENSION_TYPE) {
val resourceIdentifier = Registry.DIMENSION_TYPE.getKey(dimension)
// val registry = Registry.REGISTRY.get(Registry.DIMENSION_TYPE_REGISTRY.location()) as Registry<DimensionType>
for (dimension in getDimensions()) {
val dimensionData = JsonObject()
dimensionData.addProperty("id", dimension.id)
dimensionData.addProperty("has_sky_light", dimension.hasSkyLight())
dimensionData.addProperty("file_suffix", dimension.fileSuffix)
(FIXED_TIME_FIELD.get(dimension) as OptionalLong?)?.let {
if (it.isPresent) {
dimensionData.addProperty("fixed_time", it.asLong)
}
}
dimensionData.addProperty("has_sky_light", dimension.hasSkyLight())
dimensionData.addProperty("ultra_warm", dimension.ultraWarm())
dimensionData.addProperty("natural", dimension.natural())
dimensionData.addProperty("coordinate_scale", dimension.coordinateScale())
dimensionData.addProperty("create_dragon_fight", dimension.createDragonFight())
dimensionData.addProperty("piglin_safe", dimension.piglinSafe())
dimensionData.addProperty("bed_works", dimension.bedWorks())
dimensionData.addProperty("respawn_anchor_works", dimension.respawnAnchorWorks())
dimensionData.addProperty("has_raids", dimension.hasRaids())
dimensionData.addProperty("logical_height", dimension.logicalHeight())
dimensionData.addProperty("infiniburn", dimension.infiniburn().toString())
dimensionData.addProperty("effects_location", dimension.effectsLocation().toString())
dimensionData.addProperty("ambient_light", AMBIENT_LIGHT_FIELD.getFloat(dimension))
data.add(resourceIdentifier.toString(), dimensionData)
data.add(dimension.effectsLocation().toString(), dimensionData)
}
}
private val FIXED_TIME_FIELD = DimensionType::class.java.getDeclaredField("fixedTime")
private val AMBIENT_LIGHT_FIELD = DimensionType::class.java.getDeclaredField("ambientLight")
init {
FIXED_TIME_FIELD.isAccessible = true
AMBIENT_LIGHT_FIELD.isAccessible = true
}
private fun getDimensions(): List<DimensionType> {
val types: MutableList<DimensionType> = mutableListOf()
for (field in DimensionType::class.java.declaredFields) {
if (field.type != DimensionType::class.java) {
continue
}
if (!Modifier.isStatic(field.modifiers)) {
continue
}
field.isAccessible = true
types.add(field.get(null) as DimensionType)
}
return types
}
}

View File

@ -9,7 +9,7 @@ import net.minecraft.network.syncher.EntityDataAccessor
import net.minecraft.resources.ResourceLocation
import net.minecraft.world.entity.Entity
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.monster.SharedMonsterAttributes
import net.minecraft.world.entity.ai.attributes.Attributes
object EntityGenerator : Generator(
"entities"
@ -43,54 +43,66 @@ object EntityGenerator : Generator(
// some entities have random values, we can and will ignore these ones
if (entity is LivingEntity && entity2 is LivingEntity) {
entity.attributes.getInstance(SharedMonsterAttributes.MAX_HEALTH)?.value?.let {
if (it != entity2.attributes.getInstance(SharedMonsterAttributes.MAX_HEALTH)?.value) {
entity.attributes.getInstance(Attributes.MAX_HEALTH)?.value?.let {
if (it != entity2.attributes.getInstance(Attributes.MAX_HEALTH)?.value) {
return
}
entityData.addProperty("max_health", it)
}
entity.attributes.getInstance(SharedMonsterAttributes.FOLLOW_RANGE)?.value?.let {
if (it != entity2.attributes.getInstance(SharedMonsterAttributes.FOLLOW_RANGE)?.value) {
entity.attributes.getInstance(Attributes.FOLLOW_RANGE)?.value?.let {
if (it != entity2.attributes.getInstance(Attributes.FOLLOW_RANGE)?.value) {
return
}
entityData.addProperty("follow_range", it)
}
entity.attributes.getInstance(SharedMonsterAttributes.MOVEMENT_SPEED)?.value?.let {
if (it != entity2.attributes.getInstance(SharedMonsterAttributes.MOVEMENT_SPEED)?.value) {
entity.attributes.getInstance(Attributes.MOVEMENT_SPEED)?.value?.let {
if (it != entity2.attributes.getInstance(Attributes.MOVEMENT_SPEED)?.value) {
return
}
entityData.addProperty("movement_speed", it)
}
entity.attributes.getInstance(SharedMonsterAttributes.FLYING_SPEED)?.value?.let {
if (it != entity2.attributes.getInstance(SharedMonsterAttributes.FLYING_SPEED)?.value) {
entity.attributes.getInstance(Attributes.FLYING_SPEED)?.value?.let {
if (it != entity2.attributes.getInstance(Attributes.FLYING_SPEED)?.value) {
return
}
entityData.addProperty("flying_speed", it)
}
entity.attributes.getInstance(SharedMonsterAttributes.ATTACK_DAMAGE)?.value?.let {
if (it != entity2.attributes.getInstance(SharedMonsterAttributes.ATTACK_DAMAGE)?.value) {
entity.attributes.getInstance(Attributes.ATTACK_DAMAGE)?.value?.let {
if (it != entity2.attributes.getInstance(Attributes.ATTACK_DAMAGE)?.value) {
return
}
entityData.addProperty("attack_damage", it)
}
entity.attributes.getInstance(SharedMonsterAttributes.ARMOR)?.value?.let {
if (it != entity2.attributes.getInstance(SharedMonsterAttributes.ARMOR)?.value) {
entity.attributes.getInstance(Attributes.ARMOR)?.value?.let {
if (it != entity2.attributes.getInstance(Attributes.ARMOR)?.value) {
return
}
entityData.addProperty("armor", it)
}
entity.attributes.getInstance(SharedMonsterAttributes.ARMOR_TOUGHNESS)?.value?.let {
if (it != entity2.attributes.getInstance(SharedMonsterAttributes.ARMOR_TOUGHNESS)?.value) {
entity.attributes.getInstance(Attributes.ARMOR_TOUGHNESS)?.value?.let {
if (it != entity2.attributes.getInstance(Attributes.ARMOR_TOUGHNESS)?.value) {
return
}
entityData.addProperty("armor_toughness", it)
}
entity.attributes.getInstance(SharedMonsterAttributes.LUCK)?.value?.let {
if (it != entity2.attributes.getInstance(SharedMonsterAttributes.LUCK)?.value) {
entity.attributes.getInstance(Attributes.LUCK)?.value?.let {
if (it != entity2.attributes.getInstance(Attributes.LUCK)?.value) {
return
}
entityData.addProperty("luck", it)
}
entity.attributes.getInstance(Attributes.SPAWN_REINFORCEMENTS_CHANCE)?.value?.let {
if (it != entity2.attributes.getInstance(Attributes.SPAWN_REINFORCEMENTS_CHANCE)?.value) {
return
}
entityData.addProperty("spawn_reinforcements_chance", it)
}
entity.attributes.getInstance(Attributes.JUMP_STRENGTH)?.value?.let {
if (it != entity2.attributes.getInstance(Attributes.JUMP_STRENGTH)?.value) {
return
}
entityData.addProperty("jump_strength", it)
}
}

View File

@ -26,6 +26,7 @@ object ItemGenerator : Generator(
itemData.addProperty("rarity", item.getRarity(ItemStack.EMPTY).ordinal)
itemData.addProperty("max_stack_size", item.maxStackSize)
itemData.addProperty("max_damage", item.maxDamage)
itemData.addProperty("is_fire_resistant", item.isFireResistant)
itemData.addProperty("is_complex", item.isComplex)
item.descriptionId?.let {
itemData.addProperty("description_id", it)
@ -58,13 +59,13 @@ object ItemGenerator : Generator(
}
itemData.addProperty("speed", DIGGER_ITEM_SPEED_FIELD.getFloat(item))
itemData.addProperty("attack_damage", DIGGER_ITEM_ATTACK_DAMAGE.getFloat(item))
itemData.addProperty("attack_speed", DIGGER_ITEM_ATTACK_SPEED.getFloat(item))
}
if (item is ArmorItem) {
itemData.addProperty("equipment_slot", (ARMOR_ITEM_EQUIPMENT_SLOT_FIELD.get(item) as EquipmentSlot).name.toLowerCase())
itemData.addProperty("defense", item.defense)
itemData.addProperty("toughness", ARMOR_ITEM_TOUGHNESS_FIELD.getFloat(item))
itemData.addProperty("armor_material", item.material.name.toLowerCase())
itemData.addProperty("knockback_resistance", ARMOR_ITEM_KNOCKBACK_RESISTANCE.getFloat(item))
}
if (item is AxeItem) {
val stripables = JsonArray()
@ -100,7 +101,6 @@ object ItemGenerator : Generator(
if (tillables.size() > 0) {
itemData.add("tillables_block_states", tillables)
}
itemData.addProperty("attack_speed", HOE_ITEM_ATTACK_SPEED_FIELD.getFloat(item))
}
if (item is HorseArmorItem) {
itemData.addProperty("horse_protection", item.protection)
@ -126,7 +126,6 @@ object ItemGenerator : Generator(
}
if (item is SwordItem) {
itemData.addProperty("attack_damage", item.damage)
itemData.addProperty("attack_speed", ATTACK_SPEED_SWORD_ITEM_FIELD.getFloat(item))
}
if (item is RecordItem) {
@ -153,34 +152,30 @@ object ItemGenerator : Generator(
private val DIGGER_ITEM_BLOCKS_FIELD = DiggerItem::class.java.getDeclaredField("blocks")
private val DIGGER_ITEM_SPEED_FIELD = DiggerItem::class.java.getDeclaredField("speed")
private val DIGGER_ITEM_ATTACK_DAMAGE = DiggerItem::class.java.getDeclaredField("attackDamage")
private val DIGGER_ITEM_ATTACK_SPEED = DiggerItem::class.java.getDeclaredField("attackSpeed")
private val DIGGER_ITEM_ATTACK_DAMAGE = DiggerItem::class.java.getDeclaredField("attackDamageBaseline")
private val ARMOR_ITEM_EQUIPMENT_SLOT_FIELD = ArmorItem::class.java.getDeclaredField("slot")
private val ARMOR_ITEM_TOUGHNESS_FIELD = ArmorItem::class.java.getDeclaredField("toughness")
private val AXE_ITEM_STRIPABLES_FIELD = AxeItem::class.java.getDeclaredField("STRIPABLES")
private val BUCKED_ITEM_CONTENT_FIELD = BucketItem::class.java.getDeclaredField("content")
private val BUCKED_FISH_ITEM_TYPE_FIELD = FishBucketItem::class.java.getDeclaredField("type")
private val HOE_ITEM_ATTACK_SPEED_FIELD = HoeItem::class.java.getDeclaredField("attackSpeed")
private val HOE_ITEM_TILLABLES_FIELD = HoeItem::class.java.getDeclaredField("TILLABLES")
private val SHOVEL_ITEM_FLATTENABLES_FIELD = ShovelItem::class.java.getDeclaredField("FLATTENABLES")
private val SPAWN_EGG_ITEM_ENTITY_TYPE_FIELD = SpawnEggItem::class.java.getDeclaredField("defaultType")
private val ATTACK_SPEED_SWORD_ITEM_FIELD = SwordItem::class.java.getDeclaredField("attackSpeed")
private val ARMOR_ITEM_KNOCKBACK_RESISTANCE = ArmorItem::class.java.getDeclaredField("knockbackResistance")
init {
DIGGER_ITEM_BLOCKS_FIELD.isAccessible = true
DIGGER_ITEM_SPEED_FIELD.isAccessible = true
DIGGER_ITEM_ATTACK_DAMAGE.isAccessible = true
DIGGER_ITEM_ATTACK_SPEED.isAccessible = true
ARMOR_ITEM_EQUIPMENT_SLOT_FIELD.isAccessible = true
ARMOR_ITEM_TOUGHNESS_FIELD.isAccessible = true
AXE_ITEM_STRIPABLES_FIELD.isAccessible = true
BUCKED_ITEM_CONTENT_FIELD.isAccessible = true
BUCKED_FISH_ITEM_TYPE_FIELD.isAccessible = true
HOE_ITEM_ATTACK_SPEED_FIELD.isAccessible = true
HOE_ITEM_TILLABLES_FIELD.isAccessible = true
SHOVEL_ITEM_FLATTENABLES_FIELD.isAccessible = true
SPAWN_EGG_ITEM_ENTITY_TYPE_FIELD.isAccessible = true
ATTACK_SPEED_SWORD_ITEM_FIELD.isAccessible = true
ARMOR_ITEM_KNOCKBACK_RESISTANCE.isAccessible = true
}

View File

@ -34,7 +34,7 @@ object MobEffectGenerator : Generator(
modifierData.addProperty("amount", modifier.amount)
modifierData.addProperty("operation", modifier.operation.name.toLowerCase())
modifiers.add(attribute.name.toLowerCase(), modifierData)
modifiers.add(Registry.ATTRIBUTE.getKey(attribute).toString(), modifierData)
}
if (modifiers.size() > 0) {

View File

@ -19,7 +19,6 @@ object StatisticsGenerator : Generator(
statisticData.addProperty("translation_id", statistic.translationKey)
statisticData.addProperty("unit", when (statistic.registry) {
Registry.BIOME -> "biome"
Registry.BLOCK -> "block"
Registry.ITEM -> "item"
Registry.ENTITY_TYPE -> "entity_type"