mirror of
https://gitlab.bixilon.de/bixilon/pixlyzer.git
synced 2025-09-25 05:01:50 -04:00
support for version: 1.16.5
This commit is contained in:
parent
687313c607
commit
8dca0bd5b4
2
pom.xml
2
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.15.2</minecraft.version>
|
||||
<minecraft.version>1.16.5</minecraft.version>
|
||||
</properties>
|
||||
|
||||
<repositories>
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
@ -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 {
|
||||
|
@ -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
|
||||
}
|
||||
}
|
@ -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)!!
|
||||
}
|
||||
}
|
@ -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 ""
|
||||
}
|
||||
|
@ -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")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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)))
|
||||
|
@ -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) {
|
||||
}
|
||||
}
|
@ -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,
|
||||
)
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -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()
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user