mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-11 08:27:29 -04:00
remove move model stuff
This commit is contained in:
parent
a228c4f412
commit
d9e1c3b97f
@ -38,3 +38,5 @@
|
|||||||
- Don't render bedrock on y == dimension::minHeight
|
- Don't render bedrock on y == dimension::minHeight
|
||||||
- Meshing
|
- Meshing
|
||||||
- Greedy meshing
|
- Greedy meshing
|
||||||
|
- Model deciding (for pre flattening versions)
|
||||||
|
- Assets manager: Create file from jar with all models inside and load models from there (make them moddable)
|
||||||
|
@ -12,7 +12,6 @@
|
|||||||
*/
|
*/
|
||||||
package de.bixilon.minosoft.data.registries.blocks
|
package de.bixilon.minosoft.data.registries.blocks
|
||||||
|
|
||||||
import de.bixilon.minosoft.Minosoft
|
|
||||||
import de.bixilon.minosoft.data.registries.ResourceLocation
|
import de.bixilon.minosoft.data.registries.ResourceLocation
|
||||||
import de.bixilon.minosoft.data.registries.VoxelShape
|
import de.bixilon.minosoft.data.registries.VoxelShape
|
||||||
import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
|
import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
|
||||||
@ -22,24 +21,15 @@ import de.bixilon.minosoft.data.registries.registries.Registries
|
|||||||
import de.bixilon.minosoft.data.registries.sounds.SoundEvent
|
import de.bixilon.minosoft.data.registries.sounds.SoundEvent
|
||||||
import de.bixilon.minosoft.data.text.RGBColor
|
import de.bixilon.minosoft.data.text.RGBColor
|
||||||
import de.bixilon.minosoft.gui.rendering.TintColorCalculator
|
import de.bixilon.minosoft.gui.rendering.TintColorCalculator
|
||||||
import de.bixilon.minosoft.gui.rendering.block.models.BlockModel
|
|
||||||
import de.bixilon.minosoft.gui.rendering.block.renderable.WorldEntryRenderer
|
|
||||||
import de.bixilon.minosoft.gui.rendering.block.renderable.block.BlockRenderer
|
|
||||||
import de.bixilon.minosoft.gui.rendering.block.renderable.block.MultipartRenderer
|
|
||||||
import de.bixilon.minosoft.util.KUtil.toBoolean
|
import de.bixilon.minosoft.util.KUtil.toBoolean
|
||||||
import de.bixilon.minosoft.util.KUtil.toInt
|
import de.bixilon.minosoft.util.KUtil.toInt
|
||||||
import de.bixilon.minosoft.util.KUtil.unsafeCast
|
import de.bixilon.minosoft.util.KUtil.unsafeCast
|
||||||
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound
|
|
||||||
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
|
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
|
||||||
import glm_.vec3.Vec3i
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.math.abs
|
|
||||||
import kotlin.random.Random
|
|
||||||
|
|
||||||
data class BlockState(
|
data class BlockState(
|
||||||
val block: Block,
|
val block: Block,
|
||||||
val properties: Map<BlockProperties, Any> = mapOf(),
|
val properties: Map<BlockProperties, Any> = mapOf(),
|
||||||
val renderers: MutableList<WorldEntryRenderer> = mutableListOf(),
|
|
||||||
val tintColor: RGBColor? = null,
|
val tintColor: RGBColor? = null,
|
||||||
val material: Material,
|
val material: Material,
|
||||||
val collisionShape: VoxelShape,
|
val collisionShape: VoxelShape,
|
||||||
@ -112,50 +102,13 @@ data class BlockState(
|
|||||||
return String.format("%s%s", block.resourceLocation, out)
|
return String.format("%s%s", block.resourceLocation, out)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getBlockRenderer(blockPosition: Vec3i): WorldEntryRenderer {
|
|
||||||
if (renderers.isEmpty()) {
|
|
||||||
throw IllegalArgumentException("$this has not renderer!")
|
|
||||||
}
|
|
||||||
if (renderers.size == 1 || !Minosoft.config.config.game.other.antiMoirePattern) {
|
|
||||||
return renderers[0]
|
|
||||||
}
|
|
||||||
val random = Random(getPositionSeed(blockPosition.x, blockPosition.y, blockPosition.z))
|
|
||||||
return renderers[abs(random.nextLong().toInt() % renderers.size)]
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
fun deserialize(block: Block, registries: Registries, data: Map<String, Any>, models: Map<ResourceLocation, BlockModel>): BlockState {
|
fun deserialize(block: Block, registries: Registries, data: Map<String, Any>): BlockState {
|
||||||
val properties = data["properties"]?.compoundCast()?.let {
|
val properties = data["properties"]?.compoundCast()?.let {
|
||||||
getProperties(it)
|
getProperties(it)
|
||||||
} ?: mutableMapOf()
|
} ?: mutableMapOf()
|
||||||
|
|
||||||
val renderers: MutableList<WorldEntryRenderer> = mutableListOf()
|
|
||||||
|
|
||||||
data["render"]?.let {
|
|
||||||
when (it) {
|
|
||||||
is Collection<*> -> {
|
|
||||||
for (model in it) {
|
|
||||||
when (model) {
|
|
||||||
is Map<*, *> -> {
|
|
||||||
addBlockModel(model.asCompound(), renderers, models)
|
|
||||||
}
|
|
||||||
is Collection<*> -> {
|
|
||||||
val modelList: MutableList<WorldEntryRenderer> = mutableListOf()
|
|
||||||
for (singleModel in model) {
|
|
||||||
addBlockModel(singleModel!!.asCompound(), modelList, models)
|
|
||||||
}
|
|
||||||
renderers.add(MultipartRenderer(modelList.toList()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
is Map<*, *> -> {
|
|
||||||
addBlockModel(it.asCompound(), renderers, models)
|
|
||||||
}
|
|
||||||
else -> error("Not a render json!")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val tintColor: RGBColor? = data["tint_color"]?.toInt()?.let { TintColorCalculator.getJsonColor(it) } ?: block.tintColor
|
val tintColor: RGBColor? = data["tint_color"]?.toInt()?.let { TintColorCalculator.getJsonColor(it) } ?: block.tintColor
|
||||||
|
|
||||||
@ -181,15 +134,10 @@ data class BlockState(
|
|||||||
val occlusionShape = data["occlusion_shapes"]?.asShape() ?: VoxelShape.EMPTY
|
val occlusionShape = data["occlusion_shapes"]?.asShape() ?: VoxelShape.EMPTY
|
||||||
val outlineShape = data["outline_shape"]?.asShape() ?: VoxelShape.EMPTY
|
val outlineShape = data["outline_shape"]?.asShape() ?: VoxelShape.EMPTY
|
||||||
|
|
||||||
block.renderOverride?.let {
|
|
||||||
renderers.clear()
|
|
||||||
renderers.addAll(it)
|
|
||||||
}
|
|
||||||
|
|
||||||
return BlockState(
|
return BlockState(
|
||||||
block = block,
|
block = block,
|
||||||
properties = properties.toMap(),
|
properties = properties.toMap(),
|
||||||
renderers = renderers,
|
|
||||||
tintColor = tintColor,
|
tintColor = tintColor,
|
||||||
material = material,
|
material = material,
|
||||||
collisionShape = collisionShape,
|
collisionShape = collisionShape,
|
||||||
@ -229,11 +177,6 @@ data class BlockState(
|
|||||||
}
|
}
|
||||||
return properties
|
return properties
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addBlockModel(data: Map<String, Any>, renderer: MutableList<WorldEntryRenderer>, models: Map<ResourceLocation, BlockModel>) {
|
|
||||||
val model = models[ResourceLocation(data["model"].unsafeCast())] ?: error("Can not find block model ${data["model"]}")
|
|
||||||
renderer.add(BlockRenderer(data, model))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -30,7 +30,6 @@ import de.bixilon.minosoft.data.registries.registries.registry.RegistryItem
|
|||||||
import de.bixilon.minosoft.data.registries.registries.registry.ResourceLocationDeserializer
|
import de.bixilon.minosoft.data.registries.registries.registry.ResourceLocationDeserializer
|
||||||
import de.bixilon.minosoft.data.text.RGBColor
|
import de.bixilon.minosoft.data.text.RGBColor
|
||||||
import de.bixilon.minosoft.gui.rendering.TintColorCalculator
|
import de.bixilon.minosoft.gui.rendering.TintColorCalculator
|
||||||
import de.bixilon.minosoft.gui.rendering.block.renderable.WorldEntryRenderer
|
|
||||||
import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit
|
||||||
import de.bixilon.minosoft.gui.rendering.input.interaction.InteractionResults
|
import de.bixilon.minosoft.gui.rendering.input.interaction.InteractionResults
|
||||||
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
||||||
@ -52,7 +51,6 @@ open class Block(
|
|||||||
open val tintColor: RGBColor? = data["tint_color"]?.toInt()?.let { TintColorCalculator.getJsonColor(it) }
|
open val tintColor: RGBColor? = data["tint_color"]?.toInt()?.let { TintColorCalculator.getJsonColor(it) }
|
||||||
open val randomOffsetType: RandomOffsetTypes? = data["offset_type"].nullCast<String>()?.let { RandomOffsetTypes[it] }
|
open val randomOffsetType: RandomOffsetTypes? = data["offset_type"].nullCast<String>()?.let { RandomOffsetTypes[it] }
|
||||||
open val tint: ResourceLocation? = data["tint"].nullCast<String>()?.let { ResourceLocation(it) }
|
open val tint: ResourceLocation? = data["tint"].nullCast<String>()?.let { ResourceLocation(it) }
|
||||||
open val renderOverride: List<WorldEntryRenderer>? = null
|
|
||||||
open var blockEntityType: BlockEntityType? = null
|
open var blockEntityType: BlockEntityType? = null
|
||||||
protected set
|
protected set
|
||||||
|
|
||||||
@ -130,7 +128,7 @@ open class Block(
|
|||||||
val states: MutableSet<BlockState> = mutableSetOf()
|
val states: MutableSet<BlockState> = mutableSetOf()
|
||||||
for ((stateId, stateJson) in data["states"]?.mapCast()!!) {
|
for ((stateId, stateJson) in data["states"]?.mapCast()!!) {
|
||||||
check(stateJson is Map<*, *>) { "Not a state element!" }
|
check(stateJson is Map<*, *>) { "Not a state element!" }
|
||||||
val state = BlockState.deserialize(block, registries, stateJson.asCompound(), registries.models)
|
val state = BlockState.deserialize(block, registries, stateJson.asCompound())
|
||||||
registries.blockStateRegistry[stateId.toInt()] = state
|
registries.blockStateRegistry[stateId.toInt()] = state
|
||||||
states.add(state)
|
states.add(state)
|
||||||
for ((property, value) in state.properties) {
|
for ((property, value) in state.properties) {
|
||||||
|
@ -20,8 +20,6 @@ import de.bixilon.minosoft.data.registries.blocks.BlockFactory
|
|||||||
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
||||||
import de.bixilon.minosoft.data.registries.fluid.Fluid
|
import de.bixilon.minosoft.data.registries.fluid.Fluid
|
||||||
import de.bixilon.minosoft.data.registries.registries.Registries
|
import de.bixilon.minosoft.data.registries.registries.Registries
|
||||||
import de.bixilon.minosoft.gui.rendering.block.renderable.WorldEntryRenderer
|
|
||||||
import de.bixilon.minosoft.gui.rendering.block.renderable.fluid.FluidRenderer
|
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.EMPTY
|
import de.bixilon.minosoft.gui.rendering.util.VecUtil.EMPTY
|
||||||
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
||||||
import glm_.vec3.Vec3
|
import glm_.vec3.Vec3
|
||||||
@ -31,24 +29,13 @@ import kotlin.random.Random
|
|||||||
open class FluidBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map<String, Any>) : Block(resourceLocation, registries, data) {
|
open class FluidBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map<String, Any>) : Block(resourceLocation, registries, data) {
|
||||||
open val fluid: Fluid = registries.fluidRegistry[data["still_fluid"]]!!
|
open val fluid: Fluid = registries.fluidRegistry[data["still_fluid"]]!!
|
||||||
|
|
||||||
val fluidRenderer: FluidRenderer
|
|
||||||
|
|
||||||
override val renderOverride: List<WorldEntryRenderer>
|
|
||||||
|
|
||||||
init {
|
|
||||||
let {
|
|
||||||
fluidRenderer = FluidRenderer(it, fluid)
|
|
||||||
renderOverride = listOf(fluidRenderer)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getOutlineShape(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i): VoxelShape {
|
override fun getOutlineShape(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i): VoxelShape {
|
||||||
return VoxelShape(mutableListOf(AABB(Vec3.EMPTY, Vec3(1.0f, fluid.getHeight(blockState), 1.0f))))
|
return VoxelShape(mutableListOf(AABB(Vec3.EMPTY, Vec3(1.0f, fluid.getHeight(blockState), 1.0f))))
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) {
|
override fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) {
|
||||||
super.randomTick(connection, blockState, blockPosition, random)
|
super.randomTick(connection, blockState, blockPosition, random)
|
||||||
// ToDO
|
// ToDo
|
||||||
fluid.randomTick(connection, blockState, blockPosition, random)
|
fluid.randomTick(connection, blockState, blockPosition, random)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,7 +16,10 @@ import de.bixilon.minosoft.data.entities.EntityMetaDataFields
|
|||||||
import de.bixilon.minosoft.data.entities.block.BlockEntityMetaType
|
import de.bixilon.minosoft.data.entities.block.BlockEntityMetaType
|
||||||
import de.bixilon.minosoft.data.entities.meta.EntityMetaData
|
import de.bixilon.minosoft.data.entities.meta.EntityMetaData
|
||||||
import de.bixilon.minosoft.data.inventory.InventorySlots
|
import de.bixilon.minosoft.data.inventory.InventorySlots
|
||||||
import de.bixilon.minosoft.data.registries.*
|
import de.bixilon.minosoft.data.registries.AABB
|
||||||
|
import de.bixilon.minosoft.data.registries.DefaultRegistries
|
||||||
|
import de.bixilon.minosoft.data.registries.Motive
|
||||||
|
import de.bixilon.minosoft.data.registries.VoxelShape
|
||||||
import de.bixilon.minosoft.data.registries.biomes.Biome
|
import de.bixilon.minosoft.data.registries.biomes.Biome
|
||||||
import de.bixilon.minosoft.data.registries.biomes.BiomeCategory
|
import de.bixilon.minosoft.data.registries.biomes.BiomeCategory
|
||||||
import de.bixilon.minosoft.data.registries.biomes.BiomePrecipitation
|
import de.bixilon.minosoft.data.registries.biomes.BiomePrecipitation
|
||||||
@ -40,7 +43,6 @@ import de.bixilon.minosoft.data.registries.registries.registry.*
|
|||||||
import de.bixilon.minosoft.data.registries.sounds.SoundEvent
|
import de.bixilon.minosoft.data.registries.sounds.SoundEvent
|
||||||
import de.bixilon.minosoft.data.registries.statistics.Statistic
|
import de.bixilon.minosoft.data.registries.statistics.Statistic
|
||||||
import de.bixilon.minosoft.data.registries.versions.Version
|
import de.bixilon.minosoft.data.registries.versions.Version
|
||||||
import de.bixilon.minosoft.gui.rendering.block.models.BlockModel
|
|
||||||
import de.bixilon.minosoft.protocol.packets.c2s.play.EntityActionC2SP
|
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.EntityAnimationS2CP
|
||||||
import de.bixilon.minosoft.protocol.packets.s2c.play.title.TitleS2CF
|
import de.bixilon.minosoft.protocol.packets.s2c.play.title.TitleS2CF
|
||||||
@ -49,8 +51,6 @@ import de.bixilon.minosoft.util.KUtil.mapCast
|
|||||||
import de.bixilon.minosoft.util.KUtil.nullCast
|
import de.bixilon.minosoft.util.KUtil.nullCast
|
||||||
import de.bixilon.minosoft.util.KUtil.unsafeCast
|
import de.bixilon.minosoft.util.KUtil.unsafeCast
|
||||||
import de.bixilon.minosoft.util.collections.Clearable
|
import de.bixilon.minosoft.util.collections.Clearable
|
||||||
import de.bixilon.minosoft.util.json.ResourceLocationJsonMap.toResourceLocationMap
|
|
||||||
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound
|
|
||||||
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
|
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
|
||||||
import java.lang.reflect.Field
|
import java.lang.reflect.Field
|
||||||
import java.lang.reflect.ParameterizedType
|
import java.lang.reflect.ParameterizedType
|
||||||
@ -101,9 +101,6 @@ class Registries {
|
|||||||
val containerTypeRegistry: Registry<ContainerType> = Registry()
|
val containerTypeRegistry: Registry<ContainerType> = Registry()
|
||||||
val gameEventRegistry: Registry<GameEvent> = Registry()
|
val gameEventRegistry: Registry<GameEvent> = Registry()
|
||||||
|
|
||||||
internal val models: MutableMap<ResourceLocation, BlockModel> = mutableMapOf()
|
|
||||||
|
|
||||||
|
|
||||||
var isFullyLoaded = false
|
var isFullyLoaded = false
|
||||||
private set
|
private set
|
||||||
|
|
||||||
@ -137,8 +134,6 @@ class Registries {
|
|||||||
// pre init stuff
|
// pre init stuff
|
||||||
loadShapes(pixlyzerData["shapes"]?.compoundCast())
|
loadShapes(pixlyzerData["shapes"]?.compoundCast())
|
||||||
|
|
||||||
loadBlockModels(pixlyzerData["models"]?.mapCast()?.toResourceLocationMap() ?: mutableMapOf())
|
|
||||||
|
|
||||||
// enums
|
// enums
|
||||||
loadEnumRegistry(version, pixlyzerData["equipment_slots"], equipmentSlotRegistry, DefaultRegistries.EQUIPMENT_SLOTS_REGISTRY)
|
loadEnumRegistry(version, pixlyzerData["equipment_slots"], equipmentSlotRegistry, DefaultRegistries.EQUIPMENT_SLOTS_REGISTRY)
|
||||||
loadEnumRegistry(version, pixlyzerData["hand_equipment_slots"], handEquipmentSlotRegistry, DefaultRegistries.HAND_EQUIPMENT_SLOTS_REGISTRY)
|
loadEnumRegistry(version, pixlyzerData["hand_equipment_slots"], handEquipmentSlotRegistry, DefaultRegistries.HAND_EQUIPMENT_SLOTS_REGISTRY)
|
||||||
@ -210,36 +205,6 @@ class Registries {
|
|||||||
return aabbs
|
return aabbs
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun loadBlockModels(data: Map<ResourceLocation, Any>) {
|
|
||||||
for ((resourceLocation, model) in data) {
|
|
||||||
if (models.containsKey(resourceLocation)) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
loadBlockModel(resourceLocation, model.asCompound(), data)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun loadBlockModel(resourceLocation: ResourceLocation, modelData: Map<String, Any>, fullModelData: Map<ResourceLocation, Any>): BlockModel {
|
|
||||||
var model = models[resourceLocation]
|
|
||||||
model?.let {
|
|
||||||
return it
|
|
||||||
}
|
|
||||||
var parent: BlockModel? = null
|
|
||||||
modelData["parent"].nullCast<String>()?.let {
|
|
||||||
val parentResourceLocation = ResourceLocation(it)
|
|
||||||
if (parentResourceLocation.path.startsWith("builtin/")) {
|
|
||||||
// ToDo
|
|
||||||
return@let
|
|
||||||
}
|
|
||||||
|
|
||||||
parent = loadBlockModel(parentResourceLocation, fullModelData[parentResourceLocation]!!.asCompound(), fullModelData)
|
|
||||||
}
|
|
||||||
model = BlockModel(parent, modelData)
|
|
||||||
|
|
||||||
models[resourceLocation] = model
|
|
||||||
return model
|
|
||||||
}
|
|
||||||
|
|
||||||
fun clear() {
|
fun clear() {
|
||||||
for (field in this::class.java.fields) {
|
for (field in this::class.java.fields) {
|
||||||
if (!field.type.isAssignableFrom(Clearable::class.java)) {
|
if (!field.type.isAssignableFrom(Clearable::class.java)) {
|
||||||
|
@ -20,8 +20,6 @@ import de.bixilon.minosoft.data.entities.entities.vehicle.*
|
|||||||
import de.bixilon.minosoft.data.entities.meta.EntityMetaData
|
import de.bixilon.minosoft.data.entities.meta.EntityMetaData
|
||||||
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
||||||
import de.bixilon.minosoft.data.world.ChunkSection
|
import de.bixilon.minosoft.data.world.ChunkSection
|
||||||
import de.bixilon.minosoft.data.world.ChunkSection.Companion.indexPosition
|
|
||||||
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
|
||||||
import de.bixilon.minosoft.protocol.protocol.ProtocolVersions
|
import de.bixilon.minosoft.protocol.protocol.ProtocolVersions
|
||||||
import glm_.vec3.Vec3i
|
import glm_.vec3.Vec3i
|
||||||
|
|
||||||
@ -88,38 +86,6 @@ object VersionTweaker {
|
|||||||
return fakeClass
|
return fakeClass
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
fun transformSections(sections: Map<Int, ChunkSection>, versionId: Int) {
|
|
||||||
// some blocks need to be tweaked. eg. Grass with a snow block on top becomes snowy grass block
|
|
||||||
if (versionId >= ProtocolDefinition.FLATTING_VERSION_ID) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for ((sectionHeight, section) in sections) {
|
|
||||||
for ((index, blockState) in section.blocks.withIndex()) {
|
|
||||||
if (blockState == null) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
val location = index.indexPosition
|
|
||||||
val newBlock = transformBlock(blockState, sections, location, sectionHeight)
|
|
||||||
if (newBlock === blockState) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if (newBlock == null) {
|
|
||||||
section.setBlockState(location, null)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
section.setBlockState(location, newBlock)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
fun transformBlock(originalBlock: BlockState?, sections: Map<Int, ChunkSection>, inChunkSectionPositions: Vec3i, sectionHeight: Int): BlockState? {
|
|
||||||
// ToDo: Broken
|
|
||||||
return originalBlock
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getBlockAbove(sections: Map<Int, ChunkSection>, inChunkSectionPositions: Vec3i, sectionHeight: Int): BlockState? {
|
private fun getBlockAbove(sections: Map<Int, ChunkSection>, inChunkSectionPositions: Vec3i, sectionHeight: Int): BlockState? {
|
||||||
return sections[sectionHeight]?.getBlockState(inChunkSectionPositions)
|
return sections[sectionHeight]?.getBlockState(inChunkSectionPositions)
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,6 @@ import de.bixilon.minosoft.data.registries.blocks.BlockState
|
|||||||
import de.bixilon.minosoft.data.registries.blocks.types.FluidBlock
|
import de.bixilon.minosoft.data.registries.blocks.types.FluidBlock
|
||||||
import de.bixilon.minosoft.data.registries.dimension.DimensionProperties
|
import de.bixilon.minosoft.data.registries.dimension.DimensionProperties
|
||||||
import de.bixilon.minosoft.data.registries.sounds.SoundEvent
|
import de.bixilon.minosoft.data.registries.sounds.SoundEvent
|
||||||
import de.bixilon.minosoft.data.registries.tweaker.VersionTweaker
|
|
||||||
import de.bixilon.minosoft.data.world.biome.accessor.BiomeAccessor
|
import de.bixilon.minosoft.data.world.biome.accessor.BiomeAccessor
|
||||||
import de.bixilon.minosoft.data.world.biome.accessor.NullBiomeAccessor
|
import de.bixilon.minosoft.data.world.biome.accessor.NullBiomeAccessor
|
||||||
import de.bixilon.minosoft.data.world.light.WorldLightAccessor
|
import de.bixilon.minosoft.data.world.light.WorldLightAccessor
|
||||||
@ -31,10 +30,8 @@ import de.bixilon.minosoft.gui.rendering.sound.AudioPlayer
|
|||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.blockPosition
|
import de.bixilon.minosoft.gui.rendering.util.VecUtil.blockPosition
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.chunkPosition
|
import de.bixilon.minosoft.gui.rendering.util.VecUtil.chunkPosition
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.inChunkPosition
|
import de.bixilon.minosoft.gui.rendering.util.VecUtil.inChunkPosition
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.inChunkSectionPosition
|
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.minus
|
import de.bixilon.minosoft.gui.rendering.util.VecUtil.minus
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus
|
import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.sectionHeight
|
|
||||||
import de.bixilon.minosoft.modding.event.EventInitiators
|
import de.bixilon.minosoft.modding.event.EventInitiators
|
||||||
import de.bixilon.minosoft.modding.event.events.BlockSetEvent
|
import de.bixilon.minosoft.modding.event.events.BlockSetEvent
|
||||||
import de.bixilon.minosoft.modding.event.events.ChunkUnloadEvent
|
import de.bixilon.minosoft.modding.event.events.ChunkUnloadEvent
|
||||||
@ -98,25 +95,18 @@ class World(
|
|||||||
operator fun set(blockPosition: Vec3i, blockState: BlockState?) {
|
operator fun set(blockPosition: Vec3i, blockState: BlockState?) {
|
||||||
val chunkPosition = blockPosition.chunkPosition
|
val chunkPosition = blockPosition.chunkPosition
|
||||||
chunks[chunkPosition]?.let {
|
chunks[chunkPosition]?.let {
|
||||||
val sections = it.sections ?: return
|
|
||||||
|
|
||||||
val transformedBlockState = if (connection.version.isFlattened()) {
|
|
||||||
blockState
|
|
||||||
} else {
|
|
||||||
VersionTweaker.transformBlock(blockState, sections, blockPosition.inChunkSectionPosition, blockPosition.sectionHeight)
|
|
||||||
}
|
|
||||||
val inChunkPosition = blockPosition.inChunkPosition
|
val inChunkPosition = blockPosition.inChunkPosition
|
||||||
val previousBlock = it[inChunkPosition]
|
val previousBlock = it[inChunkPosition]
|
||||||
if (previousBlock == transformedBlockState) {
|
if (previousBlock == blockState) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
previousBlock?.block?.onBreak(connection, blockPosition, previousBlock, it.getBlockEntity(inChunkPosition))
|
previousBlock?.block?.onBreak(connection, blockPosition, previousBlock, it.getBlockEntity(inChunkPosition))
|
||||||
blockState?.block?.onPlace(connection, blockPosition, blockState)
|
blockState?.block?.onPlace(connection, blockPosition, blockState)
|
||||||
it[inChunkPosition] = transformedBlockState
|
it[inChunkPosition] = blockState
|
||||||
connection.fireEvent(BlockSetEvent(
|
connection.fireEvent(BlockSetEvent(
|
||||||
connection = connection,
|
connection = connection,
|
||||||
blockPosition = blockPosition,
|
blockPosition = blockPosition,
|
||||||
blockState = transformedBlockState,
|
blockState = blockState,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,14 +20,16 @@ import de.bixilon.minosoft.data.world.World
|
|||||||
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
||||||
import de.bixilon.minosoft.gui.rendering.Renderer
|
import de.bixilon.minosoft.gui.rendering.Renderer
|
||||||
import de.bixilon.minosoft.gui.rendering.RendererBuilder
|
import de.bixilon.minosoft.gui.rendering.RendererBuilder
|
||||||
|
import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus
|
import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus
|
||||||
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
||||||
import glm_.vec2.Vec2i
|
import glm_.vec2.Vec2i
|
||||||
|
|
||||||
class WorldRenderer(
|
class WorldRenderer(
|
||||||
private val connection: PlayConnection,
|
private val connection: PlayConnection,
|
||||||
val renderWindow: RenderWindow,
|
override val renderWindow: RenderWindow,
|
||||||
) : Renderer {
|
) : Renderer {
|
||||||
|
override val renderSystem: RenderSystem = renderWindow.renderSystem
|
||||||
private val world: World = connection.world
|
private val world: World = connection.world
|
||||||
|
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ class DebugHUDElement(hudRenderer: HUDRenderer) : LayoutedHUDElement<GridLayout>
|
|||||||
layout += TextElement(hudRenderer, TextComponent(RunConfiguration.VERSION_STRING, ChatColors.RED))
|
layout += TextElement(hudRenderer, TextComponent(RunConfiguration.VERSION_STRING, ChatColors.RED))
|
||||||
layout += AutoTextElement(hudRenderer, 1) { "FPS ${renderWindow.renderStats.smoothAvgFPS.round10}" }
|
layout += AutoTextElement(hudRenderer, 1) { "FPS ${renderWindow.renderStats.smoothAvgFPS.round10}" }
|
||||||
renderWindow[WorldRenderer]?.apply {
|
renderWindow[WorldRenderer]?.apply {
|
||||||
layout += AutoTextElement(hudRenderer, 1) { "C v=${visibleChunks.size}, p=${allChunkSections.size}, q=${queuedChunks.size}, t=${connection.world.chunks.size}" }
|
// ToDo: layout += AutoTextElement(hudRenderer, 1) { "C v=${visibleChunks.size}, p=${allChunkSections.size}, q=${queuedChunks.size}, t=${connection.world.chunks.size}" }
|
||||||
}
|
}
|
||||||
layout += AutoTextElement(hudRenderer, 1) { "E t=${connection.world.entities.size}" }
|
layout += AutoTextElement(hudRenderer, 1) { "E t=${connection.world.entities.size}" }
|
||||||
|
|
||||||
|
@ -19,10 +19,6 @@ import de.bixilon.minosoft.data.registries.particle.data.BlockParticleData
|
|||||||
import de.bixilon.minosoft.data.registries.particle.data.ParticleData
|
import de.bixilon.minosoft.data.registries.particle.data.ParticleData
|
||||||
import de.bixilon.minosoft.data.text.RGBColor
|
import de.bixilon.minosoft.data.text.RGBColor
|
||||||
import de.bixilon.minosoft.data.text.RGBColor.Companion.asGray
|
import de.bixilon.minosoft.data.text.RGBColor.Companion.asGray
|
||||||
import de.bixilon.minosoft.gui.rendering.block.renderable.WorldEntryRenderer
|
|
||||||
import de.bixilon.minosoft.gui.rendering.block.renderable.block.BlockRenderer
|
|
||||||
import de.bixilon.minosoft.gui.rendering.block.renderable.block.MultipartRenderer
|
|
||||||
import de.bixilon.minosoft.gui.rendering.block.renderable.fluid.FluidRenderer
|
|
||||||
import de.bixilon.minosoft.gui.rendering.particle.ParticleFactory
|
import de.bixilon.minosoft.gui.rendering.particle.ParticleFactory
|
||||||
import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.advanced.AdvancedTextureParticle
|
import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.advanced.AdvancedTextureParticle
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.blockPosition
|
import de.bixilon.minosoft.gui.rendering.util.VecUtil.blockPosition
|
||||||
@ -35,17 +31,8 @@ class BlockDustParticle(connection: PlayConnection, position: Vec3d, velocity: V
|
|||||||
|
|
||||||
init {
|
init {
|
||||||
val blockPosition = position.blockPosition
|
val blockPosition = position.blockPosition
|
||||||
var renderer: WorldEntryRenderer? = data.blockState!!.getBlockRenderer(blockPosition)
|
check(data.blockState != null)
|
||||||
|
// ToDo: Texture
|
||||||
if (renderer is MultipartRenderer) {
|
|
||||||
renderer = renderer.models.getOrNull(0)
|
|
||||||
}
|
|
||||||
|
|
||||||
texture = when (renderer) {
|
|
||||||
is BlockRenderer -> renderer.textureMapping.iterator().next().value // ToDo: If this is empty the rendering crashes
|
|
||||||
is FluidRenderer -> renderer.stillTexture // ToDo
|
|
||||||
else -> TODO()
|
|
||||||
}
|
|
||||||
|
|
||||||
gravityStrength = 1.0f
|
gravityStrength = 1.0f
|
||||||
color = 0.6f.asGray()
|
color = 0.6f.asGray()
|
||||||
|
@ -15,7 +15,6 @@ package de.bixilon.minosoft.protocol.packets.s2c.play
|
|||||||
import de.bixilon.minosoft.Minosoft
|
import de.bixilon.minosoft.Minosoft
|
||||||
import de.bixilon.minosoft.data.entities.block.BlockEntity
|
import de.bixilon.minosoft.data.entities.block.BlockEntity
|
||||||
import de.bixilon.minosoft.data.registries.ResourceLocation
|
import de.bixilon.minosoft.data.registries.ResourceLocation
|
||||||
import de.bixilon.minosoft.data.registries.tweaker.VersionTweaker
|
|
||||||
import de.bixilon.minosoft.data.world.ChunkData
|
import de.bixilon.minosoft.data.world.ChunkData
|
||||||
import de.bixilon.minosoft.data.world.biome.source.SpatialBiomeArray
|
import de.bixilon.minosoft.data.world.biome.source.SpatialBiomeArray
|
||||||
import de.bixilon.minosoft.datafixer.BlockEntityFixer.fix
|
import de.bixilon.minosoft.datafixer.BlockEntityFixer.fix
|
||||||
@ -124,9 +123,6 @@ class ChunkDataS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun handle(connection: PlayConnection) {
|
override fun handle(connection: PlayConnection) {
|
||||||
chunkData?.blocks?.let {
|
|
||||||
VersionTweaker.transformSections(it, connection.version.versionId)
|
|
||||||
}
|
|
||||||
chunkData?.let {
|
chunkData?.let {
|
||||||
val chunk = connection.world.getOrCreateChunk(chunkPosition)
|
val chunk = connection.world.getOrCreateChunk(chunkPosition)
|
||||||
chunk.setData(chunkData!!)
|
chunk.setData(chunkData!!)
|
||||||
|
@ -14,9 +14,6 @@ package de.bixilon.minosoft.protocol.packets.s2c.play
|
|||||||
|
|
||||||
|
|
||||||
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
||||||
import de.bixilon.minosoft.data.registries.tweaker.VersionTweaker
|
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.inChunkSectionPosition
|
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.sectionHeight
|
|
||||||
import de.bixilon.minosoft.modding.event.events.MassBlockSetEvent
|
import de.bixilon.minosoft.modding.event.events.MassBlockSetEvent
|
||||||
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
||||||
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
|
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
|
||||||
@ -88,12 +85,8 @@ class MassBlockSetS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
|
|||||||
|
|
||||||
// tweak
|
// tweak
|
||||||
if (!connection.version.isFlattened()) {
|
if (!connection.version.isFlattened()) {
|
||||||
for ((key, value) in blocks) {
|
for ((position, blockState) in blocks) {
|
||||||
val block = VersionTweaker.transformBlock(value, chunk.sections!!, key.inChunkSectionPosition, key.sectionHeight)
|
chunk[position] = blockState
|
||||||
if (block === value) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
chunk[key] = block
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
connection.fireEvent(MassBlockSetEvent(connection, this))
|
connection.fireEvent(MassBlockSetEvent(connection, this))
|
||||||
|
@ -13,10 +13,8 @@
|
|||||||
package de.bixilon.minosoft.protocol.packets.s2c.play
|
package de.bixilon.minosoft.protocol.packets.s2c.play
|
||||||
|
|
||||||
import de.bixilon.minosoft.Minosoft
|
import de.bixilon.minosoft.Minosoft
|
||||||
import de.bixilon.minosoft.data.registries.tweaker.VersionTweaker
|
|
||||||
import de.bixilon.minosoft.data.world.ChunkData
|
import de.bixilon.minosoft.data.world.ChunkData
|
||||||
import de.bixilon.minosoft.modding.event.EventInitiators
|
import de.bixilon.minosoft.modding.event.EventInitiators
|
||||||
|
|
||||||
import de.bixilon.minosoft.modding.event.events.ChunkDataChangeEvent
|
import de.bixilon.minosoft.modding.event.events.ChunkDataChangeEvent
|
||||||
import de.bixilon.minosoft.modding.event.events.ChunkUnloadEvent
|
import de.bixilon.minosoft.modding.event.events.ChunkUnloadEvent
|
||||||
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
||||||
@ -73,10 +71,6 @@ class MassChunkDataS2CP() : PlayS2CPacket() {
|
|||||||
override fun handle(connection: PlayConnection) {
|
override fun handle(connection: PlayConnection) {
|
||||||
// transform data
|
// transform data
|
||||||
for ((chunkPosition, data) in data) {
|
for ((chunkPosition, data) in data) {
|
||||||
data?.blocks?.let {
|
|
||||||
VersionTweaker.transformSections(it, connection.version.versionId)
|
|
||||||
}
|
|
||||||
|
|
||||||
data?.let {
|
data?.let {
|
||||||
val chunk = connection.world.getOrCreateChunk(chunkPosition)
|
val chunk = connection.world.getOrCreateChunk(chunkPosition)
|
||||||
chunk.setData(data)
|
chunk.setData(data)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user