wip block tilling, flatting, stripping

This commit is contained in:
Bixilon 2021-05-21 23:21:49 +02:00
parent 1fc64ca7ac
commit cc909f8116
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
7 changed files with 68 additions and 17 deletions

View File

@ -229,6 +229,10 @@ data class BlockState(
fun withProperties(vararg properties: Pair<BlockProperties, Any>): BlockState {
return withProperties(properties.toMap())
}
fun withProperties(properties: Map<BlockProperties, Any>): BlockState {
val newProperties = this.properties.toMutableMap()
for ((key, value) in properties) {
newProperties[key] = value

View File

@ -91,6 +91,10 @@ open class Block(
return this.defaultState.withProperties(*properties)
}
fun withProperties(properties: Map<BlockProperties, Any>): BlockState {
return this.defaultState.withProperties(properties)
}
companion object : ResourceLocationDeserializer<Block> {
override fun deserialize(mappings: Registries?, resourceLocation: ResourceLocation, data: JsonObject): Block {
check(mappings != null) { "Registries is null!" }

View File

@ -14,21 +14,37 @@
package de.bixilon.minosoft.data.mappings.items.tools
import com.google.gson.JsonObject
import de.bixilon.minosoft.data.inventory.ItemStack
import de.bixilon.minosoft.data.mappings.ResourceLocation
import de.bixilon.minosoft.data.mappings.blocks.BlockState
import de.bixilon.minosoft.data.mappings.blocks.BlockUsages
import de.bixilon.minosoft.data.mappings.blocks.types.Block
import de.bixilon.minosoft.data.mappings.versions.Registries
import de.bixilon.minosoft.data.player.Hands
import de.bixilon.minosoft.gui.rendering.input.camera.RaycastHit
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import glm_.vec3.Vec3i
open class AxeItem(
resourceLocation: ResourceLocation,
registries: Registries,
data: JsonObject,
) : MiningToolItem(resourceLocation, registries, data) {
val strippableBlocks: List<Block>? = data["strippables_blocks"]?.asJsonArray?.let {
val strippableBlocks: MutableList<Block> = mutableListOf()
for (id in it) {
strippableBlocks += registries.blockRegistry[id.asInt]
val strippableBlocks: Map<Block, Block>? = data["strippables_blocks"]?.asJsonObject?.let {
val items: MutableMap<Block, Block> = mutableMapOf()
for ((origin, target) in it.entrySet()) {
items[registries.blockRegistry[origin.toInt()]] = registries.blockRegistry[target.asInt]
}
strippableBlocks.toList()
items.toMap()
}
override fun use(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, raycastHit: RaycastHit, hands: Hands, itemStack: ItemStack): BlockUsages {
// ToDo: Check tags (21w19a+)
val target = strippableBlocks?.get(blockState.block) ?: return BlockUsages.PASS
connection.world[blockPosition] = target.withProperties(blockState.properties)
return BlockUsages.SUCCESS
}
}

View File

@ -14,21 +14,34 @@
package de.bixilon.minosoft.data.mappings.items.tools
import com.google.gson.JsonObject
import de.bixilon.minosoft.data.inventory.ItemStack
import de.bixilon.minosoft.data.mappings.ResourceLocation
import de.bixilon.minosoft.data.mappings.blocks.BlockState
import de.bixilon.minosoft.data.mappings.blocks.BlockUsages
import de.bixilon.minosoft.data.mappings.blocks.types.Block
import de.bixilon.minosoft.data.mappings.versions.Registries
import de.bixilon.minosoft.data.player.Hands
import de.bixilon.minosoft.gui.rendering.input.camera.RaycastHit
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import glm_.vec3.Vec3i
open class HoeItem(
resourceLocation: ResourceLocation,
registries: Registries,
data: JsonObject,
) : MiningToolItem(resourceLocation, registries, data) {
val tillableBlocKStates: List<BlockState>? = data["tillables_block_states"]?.asJsonArray?.let {
val diggableBlocks: MutableList<BlockState> = mutableListOf()
for (id in it) {
diggableBlocks += registries.getBlockState(id.asInt)!!
val tillableBlockStates: Map<Block, BlockState>? = data["tillables_block_states"]?.asJsonObject?.let {
val items: MutableMap<Block, BlockState> = mutableMapOf()
for ((origin, target) in it.entrySet()) {
items[registries.blockRegistry[origin.toInt()]] = registries.getBlockState(target.asInt)!!
}
diggableBlocks.toList()
items.toMap()
}
override fun use(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, raycastHit: RaycastHit, hands: Hands, itemStack: ItemStack): BlockUsages {
// ToDo: Check tags (21w19a+)
connection.world[blockPosition] = tillableBlockStates?.get(blockState.block) ?: return BlockUsages.PASS
return BlockUsages.SUCCESS
}
}

View File

@ -14,21 +14,35 @@
package de.bixilon.minosoft.data.mappings.items.tools
import com.google.gson.JsonObject
import de.bixilon.minosoft.data.inventory.ItemStack
import de.bixilon.minosoft.data.mappings.ResourceLocation
import de.bixilon.minosoft.data.mappings.blocks.BlockState
import de.bixilon.minosoft.data.mappings.blocks.BlockUsages
import de.bixilon.minosoft.data.mappings.blocks.types.Block
import de.bixilon.minosoft.data.mappings.versions.Registries
import de.bixilon.minosoft.data.player.Hands
import de.bixilon.minosoft.gui.rendering.input.camera.RaycastHit
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import glm_.vec3.Vec3i
open class ShovelItem(
resourceLocation: ResourceLocation,
registries: Registries,
data: JsonObject,
) : MiningToolItem(resourceLocation, registries, data) {
val flattenableBlockStates: List<BlockState>? = data["flattenables_block_states"]?.asJsonArray?.let {
val flattenableBlockStates: MutableList<BlockState> = mutableListOf()
for (id in it) {
flattenableBlockStates += registries.getBlockState(id.asInt)!!
val flattenableBlockStates: Map<Block, BlockState>? = data["flattenables_block_states"]?.asJsonObject?.let {
val items: MutableMap<Block, BlockState> = mutableMapOf()
for ((origin, target) in it.entrySet()) {
items[registries.blockRegistry[origin.toInt()]] = registries.getBlockState(target.asInt)!!
}
flattenableBlockStates.toList()
items.toMap()
}
override fun use(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, raycastHit: RaycastHit, hands: Hands, itemStack: ItemStack): BlockUsages {
// ToDo: Check tags (21w19a+)
connection.world[blockPosition] = flattenableBlockStates?.get(blockState.block) ?: return BlockUsages.PASS
return BlockUsages.SUCCESS
}
}

View File

@ -144,9 +144,9 @@ class InteractionHandler(
}
when (itemInHand.item.use(connection, raycastHit.blockState, raycastHit.blockPosition, raycastHit, Hands.MAIN_HAND, itemInHand)) {
BlockUsages.SUCCESS -> {
// ToDo: Interact with block?
connection.sendPacket(ArmSwingC2SP(Hands.MAIN_HAND))
}
BlockUsages.PASS -> {

File diff suppressed because one or more lines are too long