diff --git a/src/main/java/de/bixilon/minosoft/data/entities/EntityObjectType.kt b/src/main/java/de/bixilon/minosoft/data/entities/EntityObjectType.kt index 802c92cc1..e8e325294 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/EntityObjectType.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/EntityObjectType.kt @@ -21,7 +21,7 @@ import de.bixilon.minosoft.data.registries.versions.Registries class EntityObjectType( override val resourceLocation: ResourceLocation, -) : RegistryItem { +) : RegistryItem() { companion object : ResourceLocationDeserializer { override fun deserialize(registries: Registries?, resourceLocation: ResourceLocation, data: JsonObject): EntityObjectType { diff --git a/src/main/java/de/bixilon/minosoft/data/entities/block/BlockEntityMetaType.kt b/src/main/java/de/bixilon/minosoft/data/entities/block/BlockEntityMetaType.kt index 42b7d0c38..5fc40ff5c 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/block/BlockEntityMetaType.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/block/BlockEntityMetaType.kt @@ -22,7 +22,7 @@ import de.bixilon.minosoft.data.registries.versions.Registries class BlockEntityMetaType( override val resourceLocation: ResourceLocation, -) : RegistryItem { +) : RegistryItem() { companion object : ResourceLocationDeserializer { override fun deserialize(registries: Registries?, resourceLocation: ResourceLocation, data: JsonObject): BlockEntityMetaType { diff --git a/src/main/java/de/bixilon/minosoft/data/registries/Dimension.kt b/src/main/java/de/bixilon/minosoft/data/registries/Dimension.kt index c568a843f..b9052738c 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/Dimension.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/Dimension.kt @@ -37,7 +37,7 @@ data class Dimension( val ultraWarm: Boolean = false, val height: Int = 256, val supports3DBiomes: Boolean = true, -) : RegistryItem { +) : RegistryItem() { val lowestSection = if (minY < 0) { (minY + 1) / ProtocolDefinition.SECTION_HEIGHT_Y - 1 } else { diff --git a/src/main/java/de/bixilon/minosoft/data/registries/Motive.kt b/src/main/java/de/bixilon/minosoft/data/registries/Motive.kt index a12fadd0f..42d4f43ee 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/Motive.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/Motive.kt @@ -21,7 +21,7 @@ data class Motive( override val resourceLocation: ResourceLocation, val width: Int, val height: Int, -) : RegistryItem { +) : RegistryItem() { override fun toString(): String { return resourceLocation.full diff --git a/src/main/java/de/bixilon/minosoft/data/registries/PluginChannel.kt b/src/main/java/de/bixilon/minosoft/data/registries/PluginChannel.kt index dd13efce6..6a42a7f5e 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/PluginChannel.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/PluginChannel.kt @@ -21,7 +21,7 @@ import de.bixilon.minosoft.data.registries.versions.Registries data class PluginChannel( override val resourceLocation: ResourceLocation, val name: ResourceLocation, -) : RegistryItem { +) : RegistryItem() { override fun toString(): String { return resourceLocation.full diff --git a/src/main/java/de/bixilon/minosoft/data/registries/biomes/Biome.kt b/src/main/java/de/bixilon/minosoft/data/registries/biomes/Biome.kt index 7ed7f8dd5..547dd180c 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/biomes/Biome.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/biomes/Biome.kt @@ -41,7 +41,7 @@ data class Biome( val grassColorOverride: RGBColor?, val descriptionId: String?, val grassColorModifier: GrassColorModifiers = GrassColorModifiers.NONE, -) : RegistryItem { +) : RegistryItem() { val temperatureColorMapCoordinate = getColorMapCoordinate(temperature) val downfallColorMapCoordinate = getColorMapCoordinate(downfall * temperature) diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/entites/BlockEntityType.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/entites/BlockEntityType.kt index b7e2baa69..f572b946d 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/entites/BlockEntityType.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/entites/BlockEntityType.kt @@ -26,22 +26,9 @@ import de.bixilon.minosoft.protocol.network.connection.PlayConnection data class BlockEntityType( override val resourceLocation: ResourceLocation, - private var blockIds: Set?, + val blocks: Set, val factory: BlockEntityFactory, -) : RegistryItem { - lateinit var blocks: Set - private set - - override fun postInit(registries: Registries) { - val blocks: MutableSet = mutableSetOf() - - for (blockId in blockIds!!) { - blocks += registries.blockRegistry[blockId] - } - this.blockIds = null - - this.blocks = blocks.toSet() - } +) : RegistryItem() { fun build(connection: PlayConnection): BlockEntity { return DefaultBlockEntityMetaDataFactory.buildBlockEntity(factory, connection) @@ -49,17 +36,18 @@ data class BlockEntityType( companion object : ResourceLocationDeserializer { override fun deserialize(registries: Registries?, resourceLocation: ResourceLocation, data: JsonObject): BlockEntityType? { + check(registries != null) val factory = DefaultBlockEntityMetaDataFactory[resourceLocation] ?: return null // ToDo - val blockIds: MutableSet = mutableSetOf() + val blocks: MutableSet = mutableSetOf() - for (blockId in data["blocks"].asJsonArray) { - blockIds += blockId.asInt + for (block in data["blocks"].asJsonArray) { + blocks += registries.blockRegistry[block]?:continue } return BlockEntityType( resourceLocation = resourceLocation, - blockIds = blockIds, + blocks = blocks, factory = factory, ) } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/entites/BlockEntityTypeRegistry.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/entites/BlockEntityTypeRegistry.kt index e3f37e563..16a720e1a 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/entites/BlockEntityTypeRegistry.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/entites/BlockEntityTypeRegistry.kt @@ -13,27 +13,32 @@ package de.bixilon.minosoft.data.registries.blocks.entites +import com.google.gson.JsonObject +import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.blocks.types.Block import de.bixilon.minosoft.data.registries.registry.Registry +import de.bixilon.minosoft.data.registries.registry.ResourceLocationDeserializer import de.bixilon.minosoft.data.registries.versions.Registries class BlockEntityTypeRegistry( parentRegistry: BlockEntityTypeRegistry? = null, ) : Registry(parentRegistry) { - private lateinit var blockTypeMap: MutableMap + private val blockTypeMap: MutableMap = mutableMapOf() - fun getByBlock(block: Block): BlockEntityType? { + operator fun get(block: Block): BlockEntityType? { val parentRegistry = super.parent as BlockEntityTypeRegistry? - return blockTypeMap[block] ?: parentRegistry?.getByBlock(block) + return blockTypeMap[block] ?: parentRegistry?.get(block) } - override fun postInit(registries: Registries) { - super.postInit(registries) - blockTypeMap = mutableMapOf() + override fun initialize(data: Map?, registries: Registries?, deserializer: ResourceLocationDeserializer, flattened: Boolean, metaType: MetaTypes, alternative: Registry?): Registry { + super.initialize(data, registries, deserializer, flattened, metaType, alternative) + for ((_, type) in resourceLocationMap) { for (block in type.blocks) { blockTypeMap[block] = type } } + + return this } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/Block.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/Block.kt index 29ff2f75e..b59283cfd 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/Block.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/Block.kt @@ -44,7 +44,7 @@ open class Block( final override val resourceLocation: ResourceLocation, registries: Registries, data: JsonObject, -) : RegistryItem { +) : RegistryItem() { open val explosionResistance: Float = data["explosion_resistance"]?.asFloat ?: 0.0f open val tintColor: RGBColor? = data["tint_color"]?.asInt?.let { TintColorCalculator.getJsonColor(it) } open val randomOffsetType: RandomOffsetTypes? = data["offset_type"]?.asString?.let { RandomOffsetTypes[it] } @@ -53,22 +53,22 @@ open class Block( open var blockEntityType: BlockEntityType? = null protected set - private val itemId: Int = data["item"]?.asInt ?: 0 - open lateinit var states: Set protected set open lateinit var defaultState: BlockState protected set - open lateinit var item: Item - protected set + val item: Item? = null open lateinit var properties: Map> open val friction = data["friction"]?.asDouble ?: 0.6 open val velocityMultiplier = data["velocity_multiplier"]?.asDouble ?: 1.0 // ToDo: They exist since ~1.15 open val jumpVelocityMultiplier = data["jump_velocity_multiplier"]?.asDouble ?: 1.0 + init { + this::item.inject(data["item"]?.asInt) + } + override fun postInit(registries: Registries) { - item = registries.itemRegistry[itemId] - blockEntityType = registries.blockEntityTypeRegistry.getByBlock(this) + blockEntityType = registries.blockEntityTypeRegistry[this] } override fun toString(): String { diff --git a/src/main/java/de/bixilon/minosoft/data/registries/effects/StatusEffect.kt b/src/main/java/de/bixilon/minosoft/data/registries/effects/StatusEffect.kt index fbb38a30a..10082caaa 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/effects/StatusEffect.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/effects/StatusEffect.kt @@ -31,7 +31,7 @@ data class StatusEffect( val color: RGBColor, val attributes: Map, val uuidAttributes: Map, -) : RegistryItem, Translatable { +) : RegistryItem(), Translatable { override fun toString(): String { return resourceLocation.full diff --git a/src/main/java/de/bixilon/minosoft/data/registries/enchantment/Enchantment.kt b/src/main/java/de/bixilon/minosoft/data/registries/enchantment/Enchantment.kt index f61864b2f..3a9a23cc6 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/enchantment/Enchantment.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/enchantment/Enchantment.kt @@ -21,7 +21,7 @@ import de.bixilon.minosoft.data.registries.versions.Registries data class Enchantment( override val resourceLocation: ResourceLocation, // ToDo -) : RegistryItem { +) : RegistryItem() { override fun toString(): String { return resourceLocation.full diff --git a/src/main/java/de/bixilon/minosoft/data/registries/entities/EntityType.kt b/src/main/java/de/bixilon/minosoft/data/registries/entities/EntityType.kt index c856e9f00..2b51a4e79 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/entities/EntityType.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/entities/EntityType.kt @@ -38,7 +38,7 @@ data class EntityType( val fireImmune: Boolean, val attributes: Map, val factory: EntityFactory, -) : RegistryItem, Translatable { +) : RegistryItem(), Translatable { fun build(connection: PlayConnection, position: Vec3d, rotation: EntityRotation, entityMetaData: EntityMetaData?, versionId: Int): Entity? { return DefaultEntityFactories.buildEntity(factory, connection, position, rotation, entityMetaData, versionId) diff --git a/src/main/java/de/bixilon/minosoft/data/registries/entities/villagers/VillagerProfession.kt b/src/main/java/de/bixilon/minosoft/data/registries/entities/villagers/VillagerProfession.kt index 6f522efc4..1262319aa 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/entities/villagers/VillagerProfession.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/entities/villagers/VillagerProfession.kt @@ -22,7 +22,7 @@ import de.bixilon.minosoft.data.registries.versions.Registries data class VillagerProfession( override val resourceLocation: ResourceLocation, // ToDo -) : RegistryItem { +) : RegistryItem() { override fun toString(): String { return resourceLocation.full diff --git a/src/main/java/de/bixilon/minosoft/data/registries/fluid/Fluid.kt b/src/main/java/de/bixilon/minosoft/data/registries/fluid/Fluid.kt index e4e2e4b9f..8394b0901 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/fluid/Fluid.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/fluid/Fluid.kt @@ -37,21 +37,20 @@ open class Fluid( override val resourceLocation: ResourceLocation, registries: Registries, data: JsonObject, -) : RegistryItem { - private val bucketItemId = data["bucket"]?.asInt - val dripParticle: ParticleType? = data["drip_particle_type"]?.asInt?.let { registries.particleTypeRegistry[it] } +) : RegistryItem() { open val stillTexture: ResourceLocation? = null - var bucketItem: Item? = null - private set + val dripParticle: ParticleType? = null + val bucketItem: Item? = null + + init { + this::bucketItem.inject(data["bucket"]) + this::dripParticle.inject(data["drip_particle_type"]) + } override fun toString(): String { return resourceLocation.full } - override fun postInit(registries: Registries) { - bucketItem = bucketItemId?.let { registries.itemRegistry[it] } - } - open fun matches(other: Fluid): Boolean { return other == this } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/fluid/lava/LavaFluid.kt b/src/main/java/de/bixilon/minosoft/data/registries/fluid/lava/LavaFluid.kt index 1a2d8f9cc..24c465711 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/fluid/lava/LavaFluid.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/fluid/lava/LavaFluid.kt @@ -21,6 +21,7 @@ import de.bixilon.minosoft.data.registries.blocks.BlockState import de.bixilon.minosoft.data.registries.fluid.DefaultFluids import de.bixilon.minosoft.data.registries.fluid.FlowableFluid import de.bixilon.minosoft.data.registries.fluid.Fluid +import de.bixilon.minosoft.data.registries.particle.ParticleType import de.bixilon.minosoft.data.registries.versions.Registries import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.lava.LavaParticle import de.bixilon.minosoft.gui.rendering.util.VecUtil.horizontal @@ -39,10 +40,14 @@ class LavaFluid( registries: Registries, data: JsonObject, ) : FlowableFluid(resourceLocation, registries, data) { - private val lavaParticleType = registries.particleTypeRegistry[LavaParticle] + private val lavaParticleType: ParticleType? = null override val stillTexture: ResourceLocation = "minecraft:block/lava_still".asResourceLocation() override val flowingTexture: ResourceLocation = "minecraft:block/lava_flow".asResourceLocation() + init { + this::lavaParticleType.inject(LavaParticle) + } + override fun getVelocityMultiplier(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i): Double { return (connection.world.dimension?.ultraWarm == true).decide(0.007, 0.0023333333333333335) } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/fluid/water/WaterFluid.kt b/src/main/java/de/bixilon/minosoft/data/registries/fluid/water/WaterFluid.kt index 397f197c3..d5920099b 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/fluid/water/WaterFluid.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/fluid/water/WaterFluid.kt @@ -20,7 +20,9 @@ import de.bixilon.minosoft.data.registries.blocks.BlockState import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties import de.bixilon.minosoft.data.registries.blocks.types.FluidFillable import de.bixilon.minosoft.data.registries.effects.DefaultStatusEffects +import de.bixilon.minosoft.data.registries.effects.StatusEffect import de.bixilon.minosoft.data.registries.enchantment.DefaultEnchantments +import de.bixilon.minosoft.data.registries.enchantment.Enchantment import de.bixilon.minosoft.data.registries.fluid.FlowableFluid import de.bixilon.minosoft.data.registries.fluid.Fluid import de.bixilon.minosoft.data.registries.versions.Registries @@ -40,11 +42,17 @@ class WaterFluid( registries: Registries, data: JsonObject, ) : FlowableFluid(resourceLocation, registries, data) { - private val depthStriderEnchantment = registries.enchantmentRegistry[DefaultEnchantments.DEPTH_STRIDER] - private val dolphinsGraceStatusEffect = registries.statusEffectRegistry[DefaultStatusEffects.DOLPHINS_GRACE] + private val depthStriderEnchantment: Enchantment? = null + private val dolphinsGraceStatusEffect: StatusEffect? = null override val stillTexture: ResourceLocation = "minecraft:block/water_still".asResourceLocation() override val flowingTexture: ResourceLocation = "minecraft:block/water_flow".asResourceLocation() + + init { + this::depthStriderEnchantment.inject(DefaultEnchantments.DEPTH_STRIDER) + this::dolphinsGraceStatusEffect.inject(DefaultStatusEffects.DOLPHINS_GRACE) + } + override fun getVelocityMultiplier(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i): Double { return VELOCITY_MULTIPLIER } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/items/BlockItem.kt b/src/main/java/de/bixilon/minosoft/data/registries/items/BlockItem.kt index 008e07a83..1327fc271 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/items/BlockItem.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/items/BlockItem.kt @@ -33,7 +33,11 @@ open class BlockItem( registries: Registries, data: JsonObject, ) : Item(resourceLocation, registries, data) { - val block: Block = registries.blockRegistry[data["block"].asInt] + val block: Block? = null + + init { + this::block.inject(data["block"]) + } override fun use(connection: PlayConnection, raycastHit: RaycastHit, hands: Hands, itemStack: ItemStack): BlockUsages { if (!connection.player.gamemode.canBuild) { @@ -56,7 +60,7 @@ open class BlockItem( } - val placeBlockState = block.getPlacementState(connection, raycastHit) ?: return BlockUsages.PASS + val placeBlockState = block!!.getPlacementState(connection, raycastHit) ?: return BlockUsages.PASS connection.world[placePosition] = placeBlockState diff --git a/src/main/java/de/bixilon/minosoft/data/registries/items/BucketItem.kt b/src/main/java/de/bixilon/minosoft/data/registries/items/BucketItem.kt index 2f2b828b5..b403895c0 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/items/BucketItem.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/items/BucketItem.kt @@ -15,6 +15,7 @@ package de.bixilon.minosoft.data.registries.items import com.google.gson.JsonObject import de.bixilon.minosoft.data.registries.ResourceLocation +import de.bixilon.minosoft.data.registries.fluid.Fluid import de.bixilon.minosoft.data.registries.versions.Registries @@ -23,5 +24,9 @@ open class BucketItem( registries: Registries, data: JsonObject, ) : Item(resourceLocation, registries, data) { - val fluid = registries.fluidRegistry[data["bucked_fluid_type"].asInt] + val fluid: Fluid? = null + + init { + this::fluid.inject(data["bucked_fluid_type"]) + } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/items/Item.kt b/src/main/java/de/bixilon/minosoft/data/registries/items/Item.kt index e47c584ae..8069dc6f0 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/items/Item.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/items/Item.kt @@ -34,7 +34,7 @@ open class Item( override val resourceLocation: ResourceLocation, registries: Registries, data: JsonObject, -) : RegistryItem, Translatable { +) : RegistryItem(), Translatable { val rarity: Rarities = data["rarity"]?.asInt?.let { Rarities[it] } ?: Rarities.COMMON val maxStackSize: Int = data["max_stack_size"]?.asInt ?: 64 val maxDamage: Int = data["max_damage"]?.asInt ?: 1 diff --git a/src/main/java/de/bixilon/minosoft/data/registries/items/MusicDiscItem.kt b/src/main/java/de/bixilon/minosoft/data/registries/items/MusicDiscItem.kt index e6587dda6..d548c04c6 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/items/MusicDiscItem.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/items/MusicDiscItem.kt @@ -15,6 +15,7 @@ package de.bixilon.minosoft.data.registries.items import com.google.gson.JsonObject import de.bixilon.minosoft.data.registries.ResourceLocation +import de.bixilon.minosoft.data.registries.sounds.SoundEvent import de.bixilon.minosoft.data.registries.versions.Registries open class MusicDiscItem( @@ -23,5 +24,9 @@ open class MusicDiscItem( data: JsonObject, ) : Item(resourceLocation, registries, data) { val analogOutput = data["analog_output"]?.asInt ?: 0 - val sound = data["sound"]?.asInt?.let { registries.soundEventRegistry[it] } + val sound:SoundEvent? = null + + init { + this::sound.inject(data["sound"]) + } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/items/SpawnEggItem.kt b/src/main/java/de/bixilon/minosoft/data/registries/items/SpawnEggItem.kt index 3043e9800..2f1f6dfd9 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/items/SpawnEggItem.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/items/SpawnEggItem.kt @@ -15,6 +15,7 @@ package de.bixilon.minosoft.data.registries.items import com.google.gson.JsonObject import de.bixilon.minosoft.data.registries.ResourceLocation +import de.bixilon.minosoft.data.registries.entities.EntityType import de.bixilon.minosoft.data.registries.versions.Registries import de.bixilon.minosoft.data.text.RGBColor.Companion.asRGBColor @@ -25,5 +26,9 @@ open class SpawnEggItem( ) : Item(resourceLocation, registries, data) { val color1 = data["spawn_egg_color_1"]?.asInt?.asRGBColor() val color2 = data["spawn_egg_color_2"]?.asInt?.asRGBColor() - val entityType = data["spawn_egg_entity_type"]?.asInt?.let { registries.entityTypeRegistry[it] } + val entityType: EntityType? = null + + init { + this::entityType.inject(data["spawn_egg_entity_type"]) + } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/materials/Material.kt b/src/main/java/de/bixilon/minosoft/data/registries/materials/Material.kt index 8e1adbc03..e62c429ec 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/materials/Material.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/materials/Material.kt @@ -32,7 +32,7 @@ data class Material( val solidBlocking: Boolean, val replaceable: Boolean, val solid: Boolean, -) : RegistryItem { +) : RegistryItem() { override fun toString(): String { return resourceLocation.full diff --git a/src/main/java/de/bixilon/minosoft/data/registries/other/containers/ContainerType.kt b/src/main/java/de/bixilon/minosoft/data/registries/other/containers/ContainerType.kt index 765b1350a..8e0fa58b3 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/other/containers/ContainerType.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/other/containers/ContainerType.kt @@ -20,7 +20,7 @@ import de.bixilon.minosoft.data.registries.versions.Registries data class ContainerType( override val resourceLocation: ResourceLocation, -) : RegistryItem { +) : RegistryItem() { override fun toString(): String { return resourceLocation.toString() diff --git a/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/GameEvent.kt b/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/GameEvent.kt index d014f6413..25d7bf29a 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/GameEvent.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/GameEvent.kt @@ -20,7 +20,7 @@ import de.bixilon.minosoft.data.registries.versions.Registries data class GameEvent( override val resourceLocation: ResourceLocation, -) : RegistryItem { +) : RegistryItem() { override fun toString(): String { return resourceLocation.toString() diff --git a/src/main/java/de/bixilon/minosoft/data/registries/particle/ParticleType.kt b/src/main/java/de/bixilon/minosoft/data/registries/particle/ParticleType.kt index df9b37c4b..25529e6c0 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/particle/ParticleType.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/particle/ParticleType.kt @@ -28,7 +28,7 @@ data class ParticleType( val textures: List, val overrideLimiter: Boolean = false, val factory: ParticleFactory? = null, -) : RegistryItem { +) : RegistryItem() { override fun toString(): String { return resourceLocation.full diff --git a/src/main/java/de/bixilon/minosoft/data/registries/registry/Registry.kt b/src/main/java/de/bixilon/minosoft/data/registries/registry/Registry.kt index c4d86a1e1..6eaa76c85 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/registry/Registry.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/registry/Registry.kt @@ -22,6 +22,7 @@ import de.bixilon.minosoft.data.registries.versions.Registries import de.bixilon.minosoft.util.KUtil.asResourceLocation import de.bixilon.minosoft.util.KUtil.nullCast import de.bixilon.minosoft.util.json.ResourceLocationJsonMap.toResourceLocationMap +import kotlin.reflect.KClass open class Registry( override var parent: AbstractRegistry? = null, @@ -133,6 +134,7 @@ open class Registry( open fun postInit(registries: Registries) { for ((_, value) in resourceLocationMap) { + value.inject(registries) value.postInit(registries) } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/registry/RegistryItem.kt b/src/main/java/de/bixilon/minosoft/data/registries/registry/RegistryItem.kt index 0c4cd0f6d..fb832c22e 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/registry/RegistryItem.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/registry/RegistryItem.kt @@ -14,9 +14,42 @@ package de.bixilon.minosoft.data.registries.registry import de.bixilon.minosoft.data.registries.ResourceLocationAble +import de.bixilon.minosoft.data.registries.blocks.types.Block +import de.bixilon.minosoft.data.registries.items.BlockItem import de.bixilon.minosoft.data.registries.versions.Registries +import de.bixilon.minosoft.util.KUtil.setValue +import kotlin.reflect.KProperty +import kotlin.reflect.jvm.javaField -interface RegistryItem : ResourceLocationAble { +abstract class RegistryItem : ResourceLocationAble { + private val injects: MutableMap, List> = mutableMapOf() - fun postInit(registries: Registries) {} + fun KProperty.inject(vararg keys: Any?) { + val keyList: MutableList = mutableListOf() + for (key in keys) { + key ?: continue + keyList += key + } + if (keyList.isEmpty()) { + return + } + injects[this] = keyList + } + + fun inject(registries: Registries) { + for ((field, keys) in injects) { + val javaField = field.javaField ?: continue + var value: Any? = null + for (key in keys) { + val currentValue = registries[javaField.type as Class]?.get(key) ?: continue + value = currentValue + break + } + value ?: continue + + javaField.setValue(this, value) + } + } + + open fun postInit(registries: Registries) { } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/sounds/SoundEvent.kt b/src/main/java/de/bixilon/minosoft/data/registries/sounds/SoundEvent.kt index fddfb4187..30eb6cef2 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/sounds/SoundEvent.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/sounds/SoundEvent.kt @@ -20,7 +20,7 @@ import de.bixilon.minosoft.data.registries.versions.Registries data class SoundEvent( override val resourceLocation: ResourceLocation, -) : RegistryItem { +) : RegistryItem() { companion object : ResourceLocationDeserializer { override fun deserialize(registries: Registries?, resourceLocation: ResourceLocation, data: JsonObject): SoundEvent { diff --git a/src/main/java/de/bixilon/minosoft/data/registries/statistics/Statistic.kt b/src/main/java/de/bixilon/minosoft/data/registries/statistics/Statistic.kt index 397b56cc3..6831adf38 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/statistics/Statistic.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/statistics/Statistic.kt @@ -20,7 +20,7 @@ data class Statistic( override val resourceLocation: ResourceLocation, override val translationKey: String?, val subStatistics: Map, -) : RegistryItem, Translatable { +) : RegistryItem(), Translatable { override fun toString(): String { return resourceLocation.full diff --git a/src/main/java/de/bixilon/minosoft/data/registries/versions/Registries.kt b/src/main/java/de/bixilon/minosoft/data/registries/versions/Registries.kt index 02fb5b802..d04032615 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/versions/Registries.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/versions/Registries.kt @@ -50,9 +50,11 @@ import de.bixilon.minosoft.gui.rendering.chunk.models.loading.BlockModel import de.bixilon.minosoft.protocol.packets.c2s.play.EntityActionC2SP import de.bixilon.minosoft.protocol.packets.s2c.play.EntityAnimationS2CP import de.bixilon.minosoft.protocol.packets.s2c.play.title.TitleS2CF +import de.bixilon.minosoft.util.KUtil.unsafeCast import de.bixilon.minosoft.util.collections.Clearable import de.bixilon.minosoft.util.json.ResourceLocationJsonMap.toResourceLocationMap import java.lang.reflect.Field +import java.lang.reflect.ParameterizedType class Registries { @@ -159,7 +161,6 @@ class Registries { containerTypeRegistry.initialize(pixlyzerData["container_types"]?.asJsonObject, this, ContainerType, alternative = DefaultRegistries.CONTAINER_TYPE_REGISTRY.forVersion(version)) gameEventRegistry.initialize(pixlyzerData["game_events"]?.asJsonObject, this, GameEvent, alternative = DefaultRegistries.GAME_EVENT_REGISTRY.forVersion(version)) - blockEntityTypeRegistry.initialize(pixlyzerData["block_entities"]?.asJsonObject, this, BlockEntityType) entityTypeRegistry.initialize(pixlyzerData["entities"]?.asJsonObject, this, EntityType) @@ -175,6 +176,8 @@ class Registries { blockRegistry.initialize(pixlyzerData["blocks"]?.asJsonObject, this, Block, version.isFlattened(), Registry.MetaTypes.BITS_4) itemRegistry.initialize(pixlyzerData["items"]?.asJsonObject, this, Item, version.isFlattened(), Registry.MetaTypes.BITS_16) + blockEntityTypeRegistry.initialize(pixlyzerData["block_entities"]?.asJsonObject, this, BlockEntityType) + villagerProfessionRegistry.initialize(pixlyzerData["villager_professions"]?.asJsonObject, this, VillagerProfession) @@ -182,10 +185,10 @@ class Registries { // post init - biomeRegistry.postInit(this) - fluidRegistry.postInit(this) - blockEntityTypeRegistry.postInit(this) - blockRegistry.postInit(this) + for (field in TYPE_MAP.values) { + val registry = field.get(this) as Registry<*> + registry.postInit(this) + } isFullyLoaded = true } @@ -248,9 +251,21 @@ class Registries { } } + operator fun get(type: Class): Registry? { + var currentField: Field? + var currentClass: Class<*> = type + do { + currentField = TYPE_MAP[currentClass] + currentClass = currentClass.superclass + } while (currentField == null && currentClass != Object::class.java) + return currentField?.get(this) as Registry? + } + + companion object { private val PARENTABLE_FIELDS: List private val PARENTABLE_SET_PARENT_METHOD = Parentable::class.java.getDeclaredMethod("setParent", Any::class.java) + private val TYPE_MAP: Map, Field> init { val fields: MutableList = mutableListOf() @@ -264,5 +279,37 @@ class Registries { PARENTABLE_FIELDS = fields.toList() } + + init { + val types: MutableMap, Field> = mutableMapOf() + + + for (field in Registries::class.java.declaredFields) { + if (!Registry::class.java.isAssignableFrom(field.type)) { + continue + } + field.isAccessible = true + + var generic = field.genericType + + if (field.type != Registry::class.java) { + var type = field.type + while (type != Object::class.java) { + if (type.superclass == Registry::class.java) { + generic = type.genericSuperclass + break + } + type = type.superclass + } + } + + + types[generic.unsafeCast().actualTypeArguments.first() as Class<*>] = field + } + + types[Item::class.java] = Registries::class.java.getDeclaredField("itemRegistry") + + TYPE_MAP = types.toMap() + } } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/versions/Version.kt b/src/main/java/de/bixilon/minosoft/data/registries/versions/Version.kt index f7d95d197..fee7af6bc 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/versions/Version.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/versions/Version.kt @@ -111,9 +111,9 @@ data class Version( registries.load(this, pixlyzerData) latch.dec() if (pixlyzerData.size() > 0) { - Log.log(LogMessageType.VERSION_LOADING, level = LogLevels.INFO) { "Loaded registries for $this $versionName in ${System.currentTimeMillis() - startTime}ms" } + Log.log(LogMessageType.VERSION_LOADING, level = LogLevels.INFO) { "Loaded registries for $versionName in ${System.currentTimeMillis() - startTime}ms" } } else { - Log.log(LogMessageType.VERSION_LOADING, level = LogLevels.WARN) { "Could not load registries for $this (${versionName}. Some features might not work." } + Log.log(LogMessageType.VERSION_LOADING, level = LogLevels.WARN) { "Could not load registries for ${versionName}. Some features might not work." } } isLoaded = true latch.dec() diff --git a/src/main/java/de/bixilon/minosoft/util/KUtil.kt b/src/main/java/de/bixilon/minosoft/util/KUtil.kt index e2ba27c15..9f0b0535f 100644 --- a/src/main/java/de/bixilon/minosoft/util/KUtil.kt +++ b/src/main/java/de/bixilon/minosoft/util/KUtil.kt @@ -21,6 +21,7 @@ import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.util.collections.SynchronizedMap import de.bixilon.minosoft.util.enum.AliasableEnum import sun.misc.Unsafe +import java.lang.reflect.Field import java.util.* import kotlin.Pair import kotlin.random.Random @@ -208,4 +209,17 @@ object KUtil { else -> this.toString() }) } + + + fun Field.setValue(instance: Any, value: Any) { + this.isAccessible = true + + // ToDo + // if (Modifier.isFinal(this.modifiers)) { + // FieldUtils.removeFinalModifier(this) + // } + + this.set(instance, value) + } + }