diff --git a/src/main/java/de/bixilon/minosoft/data/entities/block/DefaultBlockDataFactory.kt b/src/main/java/de/bixilon/minosoft/data/entities/block/DefaultBlockDataFactory.kt index 98dcdc407..89cd62a99 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/block/DefaultBlockDataFactory.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/block/DefaultBlockDataFactory.kt @@ -22,7 +22,6 @@ import de.bixilon.minosoft.data.entities.block.piston.StickyPistonBlockEntity import de.bixilon.minosoft.data.entities.block.redstone.ComparatorBlockEntity import de.bixilon.minosoft.data.entities.block.redstone.DaylightDetectorBlockEntity import de.bixilon.minosoft.data.registries.factory.DefaultFactory -import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection object DefaultBlockDataFactory : DefaultFactory>( BedBlockEntity, @@ -61,9 +60,4 @@ object DefaultBlockDataFactory : DefaultFactory, connection: PlayConnection): BlockEntity { - return factory.build(connection) - } -} +) diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/DefaultBlockFactories.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/DefaultBlockFactories.kt index 72ca41d25..74ce82e85 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/DefaultBlockFactories.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/DefaultBlockFactories.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * Copyright (C) 2020-2022 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -16,6 +16,8 @@ package de.bixilon.minosoft.data.registries.blocks import de.bixilon.minosoft.data.registries.blocks.types.* import de.bixilon.minosoft.data.registries.blocks.types.button.StoneButtonBlock import de.bixilon.minosoft.data.registries.blocks.types.button.WoodenButtonBlock +import de.bixilon.minosoft.data.registries.blocks.types.entity.NoteBlock +import de.bixilon.minosoft.data.registries.blocks.types.entity.storage.ChestBlock import de.bixilon.minosoft.data.registries.blocks.types.leaves.LeavesBlock import de.bixilon.minosoft.data.registries.blocks.types.plant.CropBlock import de.bixilon.minosoft.data.registries.blocks.types.plant.PlantBlock @@ -52,4 +54,5 @@ object DefaultBlockFactories : DefaultClassFactory>( LeavesBlock, PlantBlock, CropBlock, + ChestBlock, ) 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 ad6f1fc28..41d6c316b 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 @@ -24,18 +24,18 @@ import de.bixilon.minosoft.data.registries.registries.registry.ResourceLocationD import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.util.CastUtil.asAnyCollection -data class BlockEntityType( +data class BlockEntityType( override val resourceLocation: ResourceLocation, val blocks: Set, - val factory: BlockEntityFactory, + val factory: BlockEntityFactory, ) : RegistryItem() { - fun build(connection: PlayConnection): BlockEntity { - return DefaultBlockDataFactory.buildBlockEntity(factory, connection) + fun build(connection: PlayConnection): T { + return factory.build(connection) } - companion object : ResourceLocationDeserializer { - override fun deserialize(registries: Registries?, resourceLocation: ResourceLocation, data: Map): BlockEntityType? { + companion object : ResourceLocationDeserializer> { + override fun deserialize(registries: Registries?, resourceLocation: ResourceLocation, data: Map): BlockEntityType<*>? { // ToDo: Fix resource location check(registries != null) val factory = DefaultBlockDataFactory[resourceLocation] ?: return null // ToDo 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 a1005fa35..66265b542 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 @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * Copyright (C) 2020-2022 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -21,15 +21,15 @@ import de.bixilon.minosoft.data.registries.registries.registry.ResourceLocationD class BlockEntityTypeRegistry( parentRegistry: BlockEntityTypeRegistry? = null, -) : Registry(parentRegistry) { - private val blockTypeMap: MutableMap = mutableMapOf() +) : Registry>(parentRegistry) { + private val blockTypeMap: MutableMap> = mutableMapOf() - operator fun get(block: Block): BlockEntityType? { + operator fun get(block: Block): BlockEntityType<*>? { val parentRegistry = super.parent as BlockEntityTypeRegistry? return blockTypeMap[block] ?: parentRegistry?.get(block) } - override fun initialize(data: Map?, registries: Registries?, deserializer: ResourceLocationDeserializer, flattened: Boolean, metaType: MetaTypes, alternative: Registry?): Registry { + 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) { 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 afed68649..b2109abb9 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 @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * Copyright (C) 2020-2022 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -29,7 +29,6 @@ import de.bixilon.minosoft.data.registries.blocks.BlockFactory import de.bixilon.minosoft.data.registries.blocks.BlockState import de.bixilon.minosoft.data.registries.blocks.DefaultBlockFactories import de.bixilon.minosoft.data.registries.blocks.RandomOffsetTypes -import de.bixilon.minosoft.data.registries.blocks.entites.BlockEntityType import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties import de.bixilon.minosoft.data.registries.items.Item import de.bixilon.minosoft.data.registries.registries.Registries @@ -51,8 +50,6 @@ open class Block( open val explosionResistance: Float = data["explosion_resistance"]?.toFloat() ?: 0.0f open val randomOffsetType: RandomOffsetTypes? = data["offset_type"].nullCast()?.let { RandomOffsetTypes[it] } open val tint: ResourceLocation? = data["tint"].nullCast()?.let { ResourceLocation(it) } - open var blockEntityType: BlockEntityType? = null - protected set open lateinit var states: Set protected set @@ -69,10 +66,6 @@ open class Block( this::item.inject(data["item"]) } - override fun postInit(registries: Registries) { - blockEntityType = registries.blockEntityTypeRegistry[this] - } - override fun toString(): String { return resourceLocation.full } @@ -86,10 +79,7 @@ open class Block( open fun canPlaceAt(connection: PlayConnection, blockPosition: Vec3i, blockState: BlockState): Boolean = true open fun onUse(connection: PlayConnection, target: BlockTarget, hand: Hands, itemStack: ItemStack?): InteractionResults { - if (blockEntityType == null) { - return InteractionResults.PASS - } - return InteractionResults.SUCCESS + return InteractionResults.PASS } fun withProperties(vararg properties: Pair): BlockState { diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/NoteBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/entity/BlockWithEntity.kt similarity index 70% rename from src/main/java/de/bixilon/minosoft/data/registries/blocks/types/NoteBlock.kt rename to src/main/java/de/bixilon/minosoft/data/registries/blocks/types/entity/BlockWithEntity.kt index f4fa443e8..996f18e6b 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/NoteBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/entity/BlockWithEntity.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * Copyright (C) 2020-2022 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -11,27 +11,27 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.data.registries.blocks.types +package de.bixilon.minosoft.data.registries.blocks.types.entity import de.bixilon.minosoft.data.container.stack.ItemStack +import de.bixilon.minosoft.data.entities.block.BlockEntity import de.bixilon.minosoft.data.player.Hands import de.bixilon.minosoft.data.registries.ResourceLocation -import de.bixilon.minosoft.data.registries.blocks.BlockFactory +import de.bixilon.minosoft.data.registries.blocks.entites.BlockEntityType +import de.bixilon.minosoft.data.registries.blocks.types.Block import de.bixilon.minosoft.data.registries.registries.Registries import de.bixilon.minosoft.gui.rendering.camera.target.targets.BlockTarget import de.bixilon.minosoft.gui.rendering.input.interaction.InteractionResults import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection -open class NoteBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : Block(resourceLocation, registries, data) { +abstract class BlockWithEntity(resourceLocation: ResourceLocation, registries: Registries, data: Map) : Block(resourceLocation, registries, data) { + val factory: BlockEntityType? = null + + init { + this::factory.inject(this) + } override fun onUse(connection: PlayConnection, target: BlockTarget, hand: Hands, itemStack: ItemStack?): InteractionResults { return InteractionResults.SUCCESS } - - companion object : BlockFactory { - override fun build(resourceLocation: ResourceLocation, registries: Registries, data: Map): NoteBlock { - return NoteBlock(resourceLocation, registries, data) - } - } } - diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/entity/NoteBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/entity/NoteBlock.kt new file mode 100644 index 000000000..e8c6e2b53 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/entity/NoteBlock.kt @@ -0,0 +1,29 @@ +/* + * Minosoft + * Copyright (C) 2020-2022 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.data.registries.blocks.types.entity + +import de.bixilon.minosoft.data.entities.block.NoteBlockBlockEntity +import de.bixilon.minosoft.data.registries.ResourceLocation +import de.bixilon.minosoft.data.registries.blocks.BlockFactory +import de.bixilon.minosoft.data.registries.registries.Registries + +open class NoteBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : BlockWithEntity(resourceLocation, registries, data) { + + companion object : BlockFactory { + override fun build(resourceLocation: ResourceLocation, registries: Registries, data: Map): NoteBlock { + return NoteBlock(resourceLocation, registries, data) + } + } +} + diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/entity/storage/ChestBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/entity/storage/ChestBlock.kt new file mode 100644 index 000000000..e2cc101b2 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/entity/storage/ChestBlock.kt @@ -0,0 +1,30 @@ +/* + * Minosoft + * Copyright (C) 2020-2022 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.data.registries.blocks.types.entity.storage + +import de.bixilon.minosoft.data.entities.block.container.storage.ChestBlockEntity +import de.bixilon.minosoft.data.registries.ResourceLocation +import de.bixilon.minosoft.data.registries.blocks.BlockFactory +import de.bixilon.minosoft.data.registries.registries.Registries + +open class ChestBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : StorageBlock(resourceLocation, registries, data) { + + + companion object : BlockFactory { + override fun build(resourceLocation: ResourceLocation, registries: Registries, data: Map): ChestBlock { + return ChestBlock(resourceLocation, registries, data) + } + } +} + diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/entity/storage/StorageBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/entity/storage/StorageBlock.kt new file mode 100644 index 000000000..a07dd1208 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/entity/storage/StorageBlock.kt @@ -0,0 +1,21 @@ +/* + * Minosoft + * Copyright (C) 2020-2022 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.data.registries.blocks.types.entity.storage + +import de.bixilon.minosoft.data.entities.block.container.storage.StorageBlockEntity +import de.bixilon.minosoft.data.registries.ResourceLocation +import de.bixilon.minosoft.data.registries.blocks.types.entity.BlockWithEntity +import de.bixilon.minosoft.data.registries.registries.Registries + +abstract class StorageBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : BlockWithEntity(resourceLocation, registries, data) diff --git a/src/main/java/de/bixilon/minosoft/data/registries/registries/Registries.kt b/src/main/java/de/bixilon/minosoft/data/registries/registries/Registries.kt index b4c6c68c6..750cbf876 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/registries/Registries.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/registries/Registries.kt @@ -15,6 +15,7 @@ package de.bixilon.minosoft.data.registries.registries import de.bixilon.kutil.cast.CastUtil.nullCast import de.bixilon.kutil.cast.CastUtil.unsafeCast import de.bixilon.kutil.json.JsonUtil.toJsonObject +import de.bixilon.kutil.unsafe.UnsafeUtil import de.bixilon.minosoft.data.container.InventorySlots import de.bixilon.minosoft.data.entities.EntityDataFields import de.bixilon.minosoft.data.entities.block.BlockEntityMetaType @@ -246,6 +247,11 @@ class Registries { val types: MutableMap, Field> = mutableMapOf() + val parameterizedClass = Class.forName("sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl") + val rawTypeField = parameterizedClass.getDeclaredField("rawType") + + val offset = UnsafeUtil.UNSAFE.objectFieldOffset(rawTypeField) + for (field in Registries::class.java.declaredFields) { if (!Registry::class.java.isAssignableFrom(field.type)) { continue @@ -266,7 +272,15 @@ class Registries { } - types[generic.unsafeCast().actualTypeArguments.first() as Class<*>] = field + val actualType = generic.unsafeCast().actualTypeArguments.first() + val clazz = if (actualType is Class<*>) { + actualType + } else if (actualType::class.java == parameterizedClass) { + UnsafeUtil.UNSAFE.getObject(actualType, offset).unsafeCast>() + } else { + TODO() + } + types[clazz] = field } types[Item::class.java] = Registries::class.java.getDeclaredField("itemRegistry") diff --git a/src/main/java/de/bixilon/minosoft/data/world/Chunk.kt b/src/main/java/de/bixilon/minosoft/data/world/Chunk.kt index 2789f1d8d..91a258966 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/Chunk.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/Chunk.kt @@ -16,6 +16,7 @@ import de.bixilon.kutil.cast.CastUtil.unsafeCast import de.bixilon.minosoft.data.entities.block.BlockEntity import de.bixilon.minosoft.data.registries.biomes.Biome import de.bixilon.minosoft.data.registries.blocks.BlockState +import de.bixilon.minosoft.data.registries.blocks.types.entity.BlockWithEntity import de.bixilon.minosoft.data.world.ChunkSection.Companion.index import de.bixilon.minosoft.data.world.biome.accessor.BiomeAccessor import de.bixilon.minosoft.data.world.biome.source.BiomeSource @@ -89,7 +90,24 @@ class Chunk( return this[y.sectionHeight]?.blockEntities?.get(x, y.inSectionHeight, z) } + fun getOrPutBlockEntity(x: Int, y: Int, z: Int): BlockEntity? { + var blockEntity = this[y.sectionHeight]?.blockEntities?.get(x, y.inSectionHeight, z) + if (blockEntity != null) { + return blockEntity + } + val block = this[y.sectionHeight]?.blocks?.get(x, y, z) ?: return null + if (block.block !is BlockWithEntity<*>) { + return null + } + blockEntity = block.block.factory?.build(connection) ?: return null + val section = this.getOrPut(y.sectionHeight) + section.blockEntities[x, y, z] = blockEntity + + return blockEntity + } + fun getBlockEntity(position: Vec3i): BlockEntity? = getBlockEntity(position.x, position.y, position.z) + fun getOrPutBlockEntity(position: Vec3i): BlockEntity? = getOrPutBlockEntity(position.x, position.y, position.z) fun setBlockEntity(x: Int, y: Int, z: Int, blockEntity: BlockEntity?) { getOrPut(y.sectionHeight).blockEntities[x, y.inSectionHeight, z] = blockEntity diff --git a/src/main/java/de/bixilon/minosoft/data/world/World.kt b/src/main/java/de/bixilon/minosoft/data/world/World.kt index 8d9b740af..361fd8dd0 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/World.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/World.kt @@ -100,6 +100,7 @@ class World( previousBlock?.block?.onBreak(connection, blockPosition, previousBlock, chunk.getBlockEntity(inChunkPosition)) blockState?.block?.onPlace(connection, blockPosition, blockState) chunk[inChunkPosition] = blockState + chunk.getOrPutBlockEntity(inChunkPosition) connection.fireEvent(BlockSetEvent( connection = connection, blockPosition = blockPosition, @@ -136,6 +137,10 @@ class World( return get(blockPosition.chunkPosition)?.getBlockEntity(blockPosition.inChunkPosition) } + fun getOrPutBlockEntity(blockPosition: Vec3i): BlockEntity? { + return get(blockPosition.chunkPosition)?.getOrPutBlockEntity(blockPosition.inChunkPosition) + } + fun setBlockEntity(blockPosition: Vec3i, blockEntity: BlockEntity?) { get(blockPosition.chunkPosition)?.setBlockEntity(blockPosition.inChunkPosition, blockEntity) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/CrosshairHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/CrosshairHUDElement.kt index d35dc5788..4dc2a276f 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/CrosshairHUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/CrosshairHUDElement.kt @@ -16,6 +16,7 @@ package de.bixilon.minosoft.gui.rendering.gui.hud.elements.other import de.bixilon.minosoft.config.profile.delegate.watcher.SimpleProfileDelegateWatcher.Companion.profileWatch import de.bixilon.minosoft.data.abilities.Gamemodes import de.bixilon.minosoft.data.registries.ResourceLocation +import de.bixilon.minosoft.data.registries.blocks.types.entity.BlockWithEntity import de.bixilon.minosoft.gui.rendering.camera.target.targets.BlockTarget import de.bixilon.minosoft.gui.rendering.camera.target.targets.EntityTarget import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer @@ -72,7 +73,7 @@ class CrosshairHUDElement(guiRenderer: GUIRenderer) : CustomHUDElement(guiRender // Custom draw to make the crosshair inverted if (renderWindow.connection.player.gamemode == Gamemodes.SPECTATOR) { val hitResult = renderWindow.camera.targetHandler.target ?: return - if (hitResult !is EntityTarget && (hitResult !is BlockTarget || renderWindow.connection.world.getBlockEntity(hitResult.blockPosition) == null)) { + if (hitResult !is EntityTarget && (hitResult !is BlockTarget || hitResult.blockState.block is BlockWithEntity<*>)) { return } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/SkeletalManager.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/SkeletalManager.kt index 248ea5a4d..b1654b228 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/SkeletalManager.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/SkeletalManager.kt @@ -24,7 +24,7 @@ class SkeletalManager( val renderWindow: RenderWindow, ) { val shader = renderWindow.renderSystem.createShader(ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "skeletal")) - private val uniformBuffer = renderWindow.renderSystem.createFloatUniformBuffer(2, memAllocFloat(TRANSFORMS * 4 * 4)) + private val uniformBuffer = renderWindow.renderSystem.createFloatUniformBuffer(2, memAllocFloat(TRANSFORMS * MAT4_SIZE)) fun init() { uniformBuffer.init() @@ -44,14 +44,15 @@ class SkeletalManager( val transforms = instance.calculateTransforms() for ((index, transform) in transforms.withIndex()) { - uniformBuffer.buffer.put(index * 16, transform.array) + uniformBuffer.buffer.put(index * MAT4_SIZE, transform.array) } - uniformBuffer.upload(0 until (transforms.size * 4 * 4)) + uniformBuffer.upload(0 until (transforms.size * MAT4_SIZE)) instance.model.mesh.draw() } private companion object { private const val TRANSFORMS = 32 + private const val MAT4_SIZE = 4 * 4 } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/outline/BlockOutlineRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/outline/BlockOutlineRenderer.kt index b2d56994f..9780138eb 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/world/outline/BlockOutlineRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/outline/BlockOutlineRenderer.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * Copyright (C) 2020-2022 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -19,6 +19,7 @@ import de.bixilon.minosoft.config.profile.delegate.watcher.SimpleProfileDelegate import de.bixilon.minosoft.data.abilities.Gamemodes import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.blocks.BlockState +import de.bixilon.minosoft.data.registries.blocks.types.entity.BlockWithEntity import de.bixilon.minosoft.gui.rendering.RenderConstants import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.camera.target.targets.BlockTarget @@ -98,7 +99,7 @@ class BlockOutlineRenderer( } if (connection.player.gamemode == Gamemodes.ADVENTURE || connection.player.gamemode == Gamemodes.SPECTATOR) { - if (target.blockState.block.blockEntityType == null) { + if (target.blockState.block is BlockWithEntity<*>) { unload() return } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/BlockActionS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/BlockActionS2CP.kt index ffd59efc6..7d726ec24 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/BlockActionS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/BlockActionS2CP.kt @@ -13,9 +13,7 @@ package de.bixilon.minosoft.protocol.packets.s2c.play.block import de.bixilon.minosoft.data.entities.block.BlockActionEntity -import de.bixilon.minosoft.data.entities.block.DefaultBlockDataFactory import de.bixilon.minosoft.data.registries.blocks.types.Block -import de.bixilon.minosoft.datafixer.BlockEntityFixer.fix import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.packets.factory.LoadPacket import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket @@ -38,18 +36,7 @@ class BlockActionS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { val block: Block = buffer.connection.registries.blockRegistry[buffer.readVarInt()] override fun handle(connection: PlayConnection) { - val blockEntity = connection.world.getBlockEntity(position) ?: let { - val fixedResourceLocation = block.resourceLocation.fix() - val factory = connection.registries.blockEntityTypeRegistry[fixedResourceLocation]?.factory - ?: DefaultBlockDataFactory[fixedResourceLocation] - ?: let { - Log.log(LogMessageType.NETWORK_PACKETS_IN, LogLevels.WARN) { "Unknown block entity $fixedResourceLocation" } - return - } - val blockEntity = factory.build(connection) - connection.world.setBlockEntity(position, blockEntity) - blockEntity - } + val blockEntity = connection.world.getOrPutBlockEntity(position) ?: return if (blockEntity !is BlockActionEntity) { Log.log(LogMessageType.NETWORK_PACKETS_IN, LogLevels.WARN) { "Block entity $blockEntity can not accept block entity actions!" } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/BlockDataS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/BlockDataS2CP.kt index 8fd7a19ff..25fdd27f7 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/BlockDataS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/BlockDataS2CP.kt @@ -13,7 +13,6 @@ package de.bixilon.minosoft.protocol.packets.s2c.play.block import de.bixilon.kutil.json.JsonUtil.asJsonObject -import de.bixilon.minosoft.data.entities.block.DefaultBlockDataFactory import de.bixilon.minosoft.modding.event.events.BlockEntityMetaDataChangeEvent import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.packets.factory.LoadPacket @@ -41,11 +40,7 @@ class BlockDataS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { val nbt = buffer.readNBT().asJsonObject() override fun handle(connection: PlayConnection) { - connection.world.getBlockEntity(position)?.updateNBT(nbt) ?: let { - val blockEntity = DefaultBlockDataFactory.buildBlockEntity(DefaultBlockDataFactory[type]!!, connection) - blockEntity.updateNBT(nbt) - connection.world.setBlockEntity(position, blockEntity) - } + connection.world.getOrPutBlockEntity(position)?.updateNBT(nbt) ?: return connection.fireEvent(BlockEntityMetaDataChangeEvent(connection, this)) }