Skip to content

Commit

Permalink
More component fix
Browse files Browse the repository at this point in the history
  • Loading branch information
boybook committed Feb 27, 2024
1 parent 6047802 commit 6d5a038
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 26 deletions.
Original file line number Diff line number Diff line change
@@ -1,24 +1,51 @@
package net.easecation.bedrockloader.bedrock.block.component

data class ComponentCollisionBox(
val origin : FloatArray,
val size : FloatArray
) : IBlockComponent {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
import com.google.gson.JsonDeserializationContext
import com.google.gson.JsonDeserializer
import com.google.gson.JsonElement
import java.lang.reflect.Type

other as ComponentCollisionBox
sealed class ComponentCollisionBox : IBlockComponent {

if (!origin.contentEquals(other.origin)) return false
if (!size.contentEquals(other.size)) return false
data class ComponentCollisionBoxBoolean(
val value: Boolean
) : ComponentCollisionBox()

data class ComponentCollisionBoxCustom(
val origin : FloatArray,
val size : FloatArray
) : ComponentCollisionBox() {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false

other as ComponentCollisionBoxCustom

if (!origin.contentEquals(other.origin)) return false
if (!size.contentEquals(other.size)) return false

return true
}

override fun hashCode(): Int {
var result = origin.contentHashCode()
result = 31 * result + size.contentHashCode()
return result
}

return true
}

override fun hashCode(): Int {
var result = origin.contentHashCode()
result = 31 * result + size.contentHashCode()
return result
class Deserializer : JsonDeserializer<ComponentCollisionBox> {
override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): ComponentCollisionBox {
return if (json.isJsonPrimitive && json.asJsonPrimitive.isBoolean) {
ComponentCollisionBoxBoolean(json.asBoolean)
} else {
val obj = json.asJsonObject
val origin = obj["origin"]?.asJsonArray?.map { it.asFloat }?.toFloatArray() ?: floatArrayOf(0f, 0f, 0f)
val size = obj["size"]?.asJsonArray?.map { it.asFloat }?.toFloatArray() ?: floatArrayOf(0f, 0f, 0f)
ComponentCollisionBoxCustom(origin, size)
}
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import com.google.gson.JsonDeserializationContext
import com.google.gson.JsonDeserializer
import com.google.gson.JsonElement
import java.lang.reflect.Type
import java.util.*

data class ComponentPlacementFilter(
val conditions: List<Condition>
Expand Down Expand Up @@ -34,7 +35,7 @@ data class ComponentPlacementFilter(
val obj = json.asJsonObject
val conditions = obj.getAsJsonArray("conditions").map { it ->
val condition = it.asJsonObject
val allowedFaces = condition.getAsJsonArray("allowed_faces")?.map { AllowedFaces.valueOf(it.asString) }
val allowedFaces = condition.getAsJsonArray("allowed_faces")?.map { AllowedFaces.valueOf(it.asString.uppercase(Locale.getDefault())) }
val blockFilter = condition.getAsJsonArray("block_filter")?.map {
if (it.isJsonObject) {
val block = it.asJsonObject
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package net.easecation.bedrockloader.block

import net.easecation.bedrockloader.bedrock.block.component.BlockComponents
import net.easecation.bedrockloader.bedrock.block.component.ComponentCollisionBox
import net.fabricmc.fabric.api.`object`.builder.v1.block.FabricBlockSettings
import net.minecraft.block.Block
import net.minecraft.block.BlockState
Expand All @@ -24,9 +25,19 @@ class BlockDataDriven private constructor(val identifier: Identifier, val compon
private fun calculateSettings(components: BlockComponents): Settings {
val settings = FabricBlockSettings.of(Material.METAL).hardness(4.0f) // TODO hardness
components.minecraftCollisionBox?.let {
if (it.size.all { e -> e == 0f }) {
settings.collidable(false)
when (it) {
is ComponentCollisionBox.ComponentCollisionBoxBoolean -> {
if (!it.value) {
settings.collidable(false)
}
}
is ComponentCollisionBox.ComponentCollisionBoxCustom -> {
if (it.size.all { e -> e == 0f }) {
settings.collidable(false)
}
}
}

}
// TODO SelectionBox
components.minecraftLightEmission?.let {
Expand All @@ -39,7 +50,18 @@ class BlockDataDriven private constructor(val identifier: Identifier, val compon
override fun getOutlineShape(state: BlockState?, view: BlockView?, pos: BlockPos?, context: ShapeContext?): VoxelShape {
if (components.minecraftCollisionBox != null) {
val it = components.minecraftCollisionBox
return VoxelShapes.cuboid(it.origin[0].toDouble(), it.origin[1].toDouble(), it.origin[2].toDouble(), it.origin[0].toDouble() + it.size[0].toDouble(), it.origin[1].toDouble() + it.size[1].toDouble(), it.origin[2].toDouble() + it.size[2].toDouble())
when (it) {
is ComponentCollisionBox.ComponentCollisionBoxBoolean -> {
if (!it.value) {
return VoxelShapes.empty()
} else {
return super.getOutlineShape(state, view, pos, context)
}
}
is ComponentCollisionBox.ComponentCollisionBoxCustom -> {
return VoxelShapes.cuboid(it.origin[0].toDouble(), it.origin[1].toDouble(), it.origin[2].toDouble(), it.origin[0].toDouble() + it.size[0].toDouble(), it.origin[1].toDouble() + it.size[1].toDouble(), it.origin[2].toDouble() + it.size[2].toDouble())
}
}
} else {
return super.getOutlineShape(state, view, pos, context)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,19 +75,19 @@ class MeshBuilderVertexConsumer : VertexIndexedVertexConsumer {
}

override fun vertex(x: Double, y: Double, z: Double): VertexConsumer {
// BedrockLoader.logger.info("MeshBuilderVertexConsumer.vertex($x, $y, $z)")
BedrockLoader.logger.info("MeshBuilderVertexConsumer.vertex($x, $y, $z)")
emitter.pos(vertexIndex, x.toFloat(), y.toFloat(), z.toFloat())
return this
}

override fun color(red: Int, green: Int, blue: Int, alpha: Int): VertexConsumer {
// BedrockLoader.logger.info("MeshBuilderVertexConsumer.color($red, $green, $blue, $alpha)")
BedrockLoader.logger.info("MeshBuilderVertexConsumer.color($red, $green, $blue, $alpha)")
emitter.spriteColor(0, red, green, blue, alpha)
return this
}

override fun texture(u: Float, v: Float): VertexConsumer {
// BedrockLoader.logger.info("MeshBuilderVertexConsumer.texture($u, $v)")
BedrockLoader.logger.info("MeshBuilderVertexConsumer.texture($u, $v)")
emitter.sprite(vertexIndex, 0, u, v)
return this
}
Expand All @@ -103,25 +103,25 @@ class MeshBuilderVertexConsumer : VertexIndexedVertexConsumer {
}

override fun light(u: Int, v: Int): VertexConsumer {
// BedrockLoader.logger.info("MeshBuilderVertexConsumer.light($u, $v)")
BedrockLoader.logger.info("MeshBuilderVertexConsumer.light($u, $v)")
emitter.lightmap(vertexIndex, v)
return this
}

override fun light(light: Int): VertexConsumer {
// BedrockLoader.logger.info("MeshBuilderVertexConsumer.light($light)")
BedrockLoader.logger.info("MeshBuilderVertexConsumer.light($light)")
emitter.lightmap(vertexIndex, light)
return this
}

override fun normal(x: Float, y: Float, z: Float): VertexConsumer {
// BedrockLoader.logger.info("MeshBuilderVertexConsumer.normal($x, $y, $z)")
BedrockLoader.logger.info("MeshBuilderVertexConsumer.normal($x, $y, $z)")
emitter.normal(vertexIndex, x, y, z)
return this
}

override fun next() {
// BedrockLoader.logger.info("MeshBuilderVertexConsumer.next()")
BedrockLoader.logger.info("MeshBuilderVertexConsumer.next()")
emitter.emit()
}

Expand Down
2 changes: 2 additions & 0 deletions src/main/kotlin/net/easecation/bedrockloader/util/GsonUtil.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package net.easecation.bedrockloader.util

import com.google.gson.*
import net.easecation.bedrockloader.bedrock.block.component.ComponentCollisionBox
import net.easecation.bedrockloader.bedrock.block.component.ComponentGeometry
import net.easecation.bedrockloader.bedrock.block.component.ComponentPlacementFilter
import net.easecation.bedrockloader.bedrock.block.component.ComponentSelectionBox
Expand All @@ -25,6 +26,7 @@ object GsonUtil {
// block component
.registerTypeAdapter(ComponentGeometry::class.java, ComponentGeometry.Deserializer())
.registerTypeAdapter(ComponentSelectionBox::class.java, ComponentSelectionBox.Deserializer())
.registerTypeAdapter(ComponentCollisionBox::class.java, ComponentCollisionBox.Deserializer())
.registerTypeAdapter(ComponentPlacementFilter::class.java, ComponentPlacementFilter.Deserializer())
// geometry
.registerTypeAdapter(GeometryDefinition.Uv::class.java, GeometryDefinition.Uv.Deserializer())
Expand Down

0 comments on commit 6d5a038

Please sign in to comment.