mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-16 19:05:02 -04:00
Merge branch 'gui/wawla'
This commit is contained in:
commit
ceee18b5d4
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minosoft
|
* Minosoft
|
||||||
* Copyright (C) 2020-2022 Moritz Zwerger
|
* Copyright (C) 2020-2023 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 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,8 +16,10 @@ package de.bixilon.minosoft.config.profile.profiles.gui.hud
|
|||||||
import de.bixilon.minosoft.config.profile.profiles.gui.GUIProfile
|
import de.bixilon.minosoft.config.profile.profiles.gui.GUIProfile
|
||||||
import de.bixilon.minosoft.config.profile.profiles.gui.hud.crosshair.CrosshairC
|
import de.bixilon.minosoft.config.profile.profiles.gui.hud.crosshair.CrosshairC
|
||||||
import de.bixilon.minosoft.config.profile.profiles.gui.hud.hotbar.HotbarC
|
import de.bixilon.minosoft.config.profile.profiles.gui.hud.hotbar.HotbarC
|
||||||
|
import de.bixilon.minosoft.config.profile.profiles.gui.hud.wawla.WawlaC
|
||||||
|
|
||||||
class HudC(profile: GUIProfile) {
|
class HudC(profile: GUIProfile) {
|
||||||
val crosshair = CrosshairC(profile)
|
val crosshair = CrosshairC(profile)
|
||||||
val hotbar = HotbarC(profile)
|
val hotbar = HotbarC(profile)
|
||||||
|
val wawla = WawlaC(profile)
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2023 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.config.profile.profiles.gui.hud.wawla
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.config.profile.delegate.primitive.BooleanDelegate
|
||||||
|
import de.bixilon.minosoft.config.profile.profiles.gui.GUIProfile
|
||||||
|
import de.bixilon.minosoft.config.profile.profiles.gui.hud.wawla.block.BlockC
|
||||||
|
import de.bixilon.minosoft.config.profile.profiles.gui.hud.wawla.entity.EntityC
|
||||||
|
|
||||||
|
class WawlaC(profile: GUIProfile) {
|
||||||
|
var enabled by BooleanDelegate(profile, true)
|
||||||
|
var limitReach by BooleanDelegate(profile, true)
|
||||||
|
|
||||||
|
var identifier by BooleanDelegate(profile, false)
|
||||||
|
|
||||||
|
val block = BlockC(profile)
|
||||||
|
val entity = EntityC(profile)
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2023 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.config.profile.profiles.gui.hud.wawla.block
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.config.profile.delegate.primitive.BooleanDelegate
|
||||||
|
import de.bixilon.minosoft.config.profile.profiles.gui.GUIProfile
|
||||||
|
|
||||||
|
class BlockC(profile: GUIProfile) {
|
||||||
|
var enabled by BooleanDelegate(profile, true)
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2023 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.config.profile.profiles.gui.hud.wawla.entity
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.config.profile.delegate.primitive.BooleanDelegate
|
||||||
|
import de.bixilon.minosoft.config.profile.profiles.gui.GUIProfile
|
||||||
|
|
||||||
|
class EntityC(profile: GUIProfile) {
|
||||||
|
var enabled by BooleanDelegate(profile, true)
|
||||||
|
var health by BooleanDelegate(profile, true)
|
||||||
|
|
||||||
|
var hand by BooleanDelegate(profile, false)
|
||||||
|
}
|
@ -19,14 +19,17 @@ import de.bixilon.minosoft.data.entities.EntityRotation
|
|||||||
import de.bixilon.minosoft.data.entities.data.EntityData
|
import de.bixilon.minosoft.data.entities.data.EntityData
|
||||||
import de.bixilon.minosoft.data.entities.data.EntityDataField
|
import de.bixilon.minosoft.data.entities.data.EntityDataField
|
||||||
import de.bixilon.minosoft.data.entities.entities.SynchronizedEntityData
|
import de.bixilon.minosoft.data.entities.entities.SynchronizedEntityData
|
||||||
|
import de.bixilon.minosoft.data.entities.wawla.EntityWawlaProvider
|
||||||
import de.bixilon.minosoft.data.registries.entities.EntityFactory
|
import de.bixilon.minosoft.data.registries.entities.EntityFactory
|
||||||
import de.bixilon.minosoft.data.registries.entities.EntityType
|
import de.bixilon.minosoft.data.registries.entities.EntityType
|
||||||
import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft
|
import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft
|
||||||
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
||||||
|
import de.bixilon.minosoft.data.text.ChatComponent
|
||||||
|
import de.bixilon.minosoft.data.text.TextComponent
|
||||||
|
import de.bixilon.minosoft.gui.rendering.camera.target.targets.EntityTarget
|
||||||
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
||||||
import de.bixilon.minosoft.util.KUtil
|
|
||||||
|
|
||||||
open class ItemFrame(connection: PlayConnection, entityType: EntityType, data: EntityData, position: Vec3d, rotation: EntityRotation) : HangingEntity(connection, entityType, data, position, rotation) {
|
open class ItemFrame(connection: PlayConnection, entityType: EntityType, data: EntityData, position: Vec3d, rotation: EntityRotation) : HangingEntity(connection, entityType, data, position, rotation), EntityWawlaProvider {
|
||||||
|
|
||||||
@get:SynchronizedEntityData
|
@get:SynchronizedEntityData
|
||||||
val item: ItemStack?
|
val item: ItemStack?
|
||||||
@ -39,10 +42,15 @@ open class ItemFrame(connection: PlayConnection, entityType: EntityType, data: E
|
|||||||
@get:SynchronizedEntityData
|
@get:SynchronizedEntityData
|
||||||
var facing: Directions = Directions.NORTH
|
var facing: Directions = Directions.NORTH
|
||||||
|
|
||||||
|
|
||||||
override fun setObjectData(data: Int) {
|
override fun setObjectData(data: Int) {
|
||||||
facing = Directions[data]
|
facing = Directions[data]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getWawlaInformation(connection: PlayConnection, target: EntityTarget): ChatComponent {
|
||||||
|
return TextComponent("Item: $item")
|
||||||
|
}
|
||||||
|
|
||||||
companion object : EntityFactory<ItemFrame> {
|
companion object : EntityFactory<ItemFrame> {
|
||||||
override val identifier: ResourceLocation = minecraft("item_frame")
|
override val identifier: ResourceLocation = minecraft("item_frame")
|
||||||
private val ITEM_DATA = EntityDataField("ITEM_FRAME_ITEM")
|
private val ITEM_DATA = EntityDataField("ITEM_FRAME_ITEM")
|
||||||
|
@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2023 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.data.entities.wawla
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.text.ChatComponent
|
||||||
|
import de.bixilon.minosoft.gui.rendering.camera.target.targets.EntityTarget
|
||||||
|
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
||||||
|
|
||||||
|
interface EntityWawlaProvider {
|
||||||
|
|
||||||
|
fun getWawlaInformation(connection: PlayConnection, target: EntityTarget): ChatComponent
|
||||||
|
}
|
@ -16,16 +16,39 @@ package de.bixilon.minosoft.data.registries.blocks.types.plant
|
|||||||
import de.bixilon.minosoft.data.registries.blocks.BlockFactory
|
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.blocks.MinecraftBlocks
|
import de.bixilon.minosoft.data.registries.blocks.MinecraftBlocks
|
||||||
|
import de.bixilon.minosoft.data.registries.blocks.wawla.BlockWawlaProvider
|
||||||
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
||||||
import de.bixilon.minosoft.data.registries.registries.Registries
|
import de.bixilon.minosoft.data.registries.registries.Registries
|
||||||
|
import de.bixilon.minosoft.data.text.BaseComponent
|
||||||
|
import de.bixilon.minosoft.data.text.ChatComponent
|
||||||
|
import de.bixilon.minosoft.data.world.chunk.light.SectionLight.Companion.BLOCK_LIGHT_MASK
|
||||||
|
import de.bixilon.minosoft.data.world.chunk.light.SectionLight.Companion.SKY_LIGHT_MASK
|
||||||
|
import de.bixilon.minosoft.gui.rendering.camera.target.targets.BlockTarget
|
||||||
|
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
||||||
|
|
||||||
open class CropBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map<String, Any>) : PlantBlock(resourceLocation, registries, data) {
|
open class CropBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map<String, Any>) : PlantBlock(resourceLocation, registries, data), BlockWawlaProvider {
|
||||||
|
|
||||||
override fun canPlaceOn(blockState: BlockState): Boolean {
|
override fun canPlaceOn(blockState: BlockState): Boolean {
|
||||||
return blockState.block.identifier == MinecraftBlocks.FARMLAND
|
return blockState.block.identifier == MinecraftBlocks.FARMLAND
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getWawlaInformation(connection: PlayConnection, target: BlockTarget): ChatComponent {
|
||||||
|
val light = connection.world.getLight(target.blockPosition)
|
||||||
|
|
||||||
|
val blockLight = light and BLOCK_LIGHT_MASK
|
||||||
|
val skyLight = (light and SKY_LIGHT_MASK) shr 4
|
||||||
|
|
||||||
|
val component = BaseComponent("Light: ")
|
||||||
|
|
||||||
|
component += if (blockLight < MIN_LIGHT_LEVEL) "§4$blockLight§r" else "§a$blockLight§r"
|
||||||
|
|
||||||
|
component += " ($skyLight)"
|
||||||
|
|
||||||
|
return component
|
||||||
|
}
|
||||||
|
|
||||||
companion object : BlockFactory<CropBlock> {
|
companion object : BlockFactory<CropBlock> {
|
||||||
|
const val MIN_LIGHT_LEVEL = 7
|
||||||
|
|
||||||
override fun build(resourceLocation: ResourceLocation, registries: Registries, data: Map<String, Any>): CropBlock {
|
override fun build(resourceLocation: ResourceLocation, registries: Registries, data: Map<String, Any>): CropBlock {
|
||||||
return CropBlock(resourceLocation, registries, data)
|
return CropBlock(resourceLocation, registries, data)
|
||||||
|
@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2023 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.data.registries.blocks.wawla
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.text.ChatComponent
|
||||||
|
import de.bixilon.minosoft.gui.rendering.camera.target.targets.BlockTarget
|
||||||
|
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
||||||
|
|
||||||
|
interface BlockWawlaProvider {
|
||||||
|
|
||||||
|
fun getWawlaInformation(connection: PlayConnection, target: BlockTarget): ChatComponent
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2023 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.data.registries.wawla
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.text.ChatComponent
|
||||||
|
|
||||||
|
interface WawlaInformation {
|
||||||
|
val text: ChatComponent
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2023 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.data.text
|
||||||
|
|
||||||
|
object ChatComponentUtil {
|
||||||
|
|
||||||
|
fun BaseComponent.removeTrailingNewlines() {
|
||||||
|
val iterator = this.parts.iterator()
|
||||||
|
|
||||||
|
for (part in iterator) {
|
||||||
|
val message = part.message
|
||||||
|
if (message.isEmptyOrNewline()) {
|
||||||
|
iterator.remove()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
for (index in parts.size - 1 downTo 0) {
|
||||||
|
val message = parts[index].message
|
||||||
|
if (message.isEmptyOrNewline()) {
|
||||||
|
parts.removeAt(index)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun String.isEmptyOrNewline(): Boolean {
|
||||||
|
return isEmpty() || this == "\n" || this == "\r" || this == "\n\r" || this == "\r\n"
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minosoft
|
* Minosoft
|
||||||
* Copyright (C) 2020-2022 Moritz Zwerger
|
* Copyright (C) 2020-2023 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 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.
|
||||||
*
|
*
|
||||||
@ -50,7 +50,6 @@ class TargetHandler(
|
|||||||
private set
|
private set
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fun raycast() {
|
fun raycast() {
|
||||||
val eyePosition = camera.matrixHandler.entity.eyePosition.toVec3d
|
val eyePosition = camera.matrixHandler.entity.eyePosition.toVec3d
|
||||||
val cameraFront = camera.matrixHandler.entity.rotation.front.toVec3d
|
val cameraFront = camera.matrixHandler.entity.rotation.front.toVec3d
|
||||||
@ -134,14 +133,19 @@ class TargetHandler(
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!blocks) {
|
if (!blocks) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val entity = currentChunk?.getBlockEntity(blockPosition.inChunkPosition)
|
||||||
|
|
||||||
target = BlockTarget(
|
target = BlockTarget(
|
||||||
currentPosition,
|
currentPosition,
|
||||||
distance,
|
distance,
|
||||||
voxelShapeRaycastResult.direction,
|
voxelShapeRaycastResult.direction,
|
||||||
blockState,
|
blockState,
|
||||||
|
entity,
|
||||||
blockPosition,
|
blockPosition,
|
||||||
)
|
)
|
||||||
break
|
break
|
||||||
|
@ -16,6 +16,7 @@ package de.bixilon.minosoft.gui.rendering.camera.target.targets
|
|||||||
import de.bixilon.kotlinglm.vec3.Vec3d
|
import de.bixilon.kotlinglm.vec3.Vec3d
|
||||||
import de.bixilon.kotlinglm.vec3.Vec3i
|
import de.bixilon.kotlinglm.vec3.Vec3i
|
||||||
import de.bixilon.minosoft.data.direction.Directions
|
import de.bixilon.minosoft.data.direction.Directions
|
||||||
|
import de.bixilon.minosoft.data.entities.block.BlockEntity
|
||||||
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
||||||
import de.bixilon.minosoft.data.text.BaseComponent
|
import de.bixilon.minosoft.data.text.BaseComponent
|
||||||
import de.bixilon.minosoft.data.text.ChatComponent
|
import de.bixilon.minosoft.data.text.ChatComponent
|
||||||
@ -27,6 +28,7 @@ open class BlockTarget(
|
|||||||
distance: Double,
|
distance: Double,
|
||||||
direction: Directions,
|
direction: Directions,
|
||||||
val blockState: BlockState,
|
val blockState: BlockState,
|
||||||
|
val entity: BlockEntity?,
|
||||||
val blockPosition: Vec3i,
|
val blockPosition: Vec3i,
|
||||||
) : GenericTarget(position, distance, direction), TextFormattable {
|
) : GenericTarget(position, distance, direction), TextFormattable {
|
||||||
val hitPosition = position - blockPosition
|
val hitPosition = position - blockPosition
|
||||||
|
@ -37,6 +37,7 @@ import de.bixilon.minosoft.gui.rendering.gui.hud.elements.other.PerformanceHUDEl
|
|||||||
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.scoreboard.ScoreboardSideElement
|
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.scoreboard.ScoreboardSideElement
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.tab.TabListElement
|
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.tab.TabListElement
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.title.TitleElement
|
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.title.TitleElement
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.wawla.WawlaHUDElement
|
||||||
import de.bixilon.minosoft.gui.rendering.renderer.drawable.AsyncDrawable
|
import de.bixilon.minosoft.gui.rendering.renderer.drawable.AsyncDrawable
|
||||||
import de.bixilon.minosoft.gui.rendering.renderer.drawable.Drawable
|
import de.bixilon.minosoft.gui.rendering.renderer.drawable.Drawable
|
||||||
import de.bixilon.minosoft.util.KUtil.toResourceLocation
|
import de.bixilon.minosoft.util.KUtil.toResourceLocation
|
||||||
@ -138,6 +139,7 @@ class HUDManager(
|
|||||||
PerformanceHUDElement,
|
PerformanceHUDElement,
|
||||||
TitleElement,
|
TitleElement,
|
||||||
ScoreboardSideElement,
|
ScoreboardSideElement,
|
||||||
|
WawlaHUDElement,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2023 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.gui.rendering.gui.hud.elements.wawla
|
||||||
|
|
||||||
|
import de.bixilon.kotlinglm.vec2.Vec2i
|
||||||
|
import de.bixilon.minosoft.data.registries.identified.Identified
|
||||||
|
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
||||||
|
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions
|
||||||
|
import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2iUtil.EMPTY
|
||||||
|
import de.bixilon.minosoft.util.KUtil.format
|
||||||
|
|
||||||
|
abstract class WawlaElement(protected val wawla: WawlaHUDElement) : Element(wawla.guiRenderer) {
|
||||||
|
abstract val elements: List<Element?>
|
||||||
|
|
||||||
|
|
||||||
|
override fun forceRender(offset: Vec2i, consumer: GUIVertexConsumer, options: GUIVertexOptions?) {
|
||||||
|
for (element in elements) {
|
||||||
|
if (element == null) continue
|
||||||
|
|
||||||
|
element.render(offset, consumer, options)
|
||||||
|
offset.y += element.size.y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun forceSilentApply() {
|
||||||
|
val size = Vec2i.EMPTY
|
||||||
|
|
||||||
|
for (element in elements) {
|
||||||
|
if (element == null) continue
|
||||||
|
|
||||||
|
val elementSize = element.size
|
||||||
|
size.x = maxOf(size.x, elementSize.x)
|
||||||
|
size.y += elementSize.y
|
||||||
|
}
|
||||||
|
|
||||||
|
this.size = size
|
||||||
|
}
|
||||||
|
|
||||||
|
protected fun createNameElement(translationKey: ResourceLocation?): TextElement {
|
||||||
|
val name = wawla.context.connection.language.translate(translationKey)
|
||||||
|
name.setFallbackColor(ChatColors.WHITE)
|
||||||
|
return TextElement(guiRenderer, name, background = false, scale = 1.2f)
|
||||||
|
}
|
||||||
|
|
||||||
|
protected fun createIdentifierElement(item: Identified): TextElement? {
|
||||||
|
if (!wawla.profile.identifier) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
return TextElement(guiRenderer, item.identifier.format(), background = false, scale = 0.8f)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2023 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.gui.rendering.gui.hud.elements.wawla
|
||||||
|
|
||||||
|
import de.bixilon.kotlinglm.vec2.Vec2i
|
||||||
|
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
||||||
|
import de.bixilon.minosoft.data.text.formatting.color.RGBColor.Companion.asRGBAColor
|
||||||
|
import de.bixilon.minosoft.data.text.formatting.color.RGBColor.Companion.asRGBColor
|
||||||
|
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
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.elements.LayoutedElement
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.elements.primitive.ColorElement
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.gui.LayoutedGUIElement
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.wawla.block.BlockWawlaElement
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.wawla.entity.EntityWawlaElement
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions
|
||||||
|
import de.bixilon.minosoft.gui.rendering.renderer.drawable.AsyncDrawable
|
||||||
|
import de.bixilon.minosoft.util.KUtil.toResourceLocation
|
||||||
|
|
||||||
|
class WawlaHUDElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedElement, AsyncDrawable {
|
||||||
|
private var element: WawlaElement? = null
|
||||||
|
|
||||||
|
val profile = guiRenderer.connection.profiles.gui.hud.wawla
|
||||||
|
|
||||||
|
override val layoutOffset: Vec2i
|
||||||
|
get() = Vec2i((guiRenderer.scaledSize.x - ((element?.size?.x ?: 0) + BACKGROUND_SIZE)) / 2, BACKGROUND_SIZE)
|
||||||
|
override val skipDraw: Boolean
|
||||||
|
get() = !profile.enabled
|
||||||
|
|
||||||
|
|
||||||
|
override fun drawAsync() {
|
||||||
|
val target = context.camera.targetHandler.target
|
||||||
|
|
||||||
|
if (target == null) {
|
||||||
|
this.element = null
|
||||||
|
forceSilentApply()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val distance = target.distance
|
||||||
|
|
||||||
|
|
||||||
|
val element: WawlaElement? = when {
|
||||||
|
target is BlockTarget && profile.block.enabled && (!profile.limitReach || distance <= context.connection.player.reachDistance) -> BlockWawlaElement(this, target)
|
||||||
|
target is EntityTarget && profile.entity.enabled && (!profile.limitReach || distance <= 3.0) -> EntityWawlaElement(this, target) // TODO: use constant for distance
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
this.element = element
|
||||||
|
forceSilentApply()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun forceRender(offset: Vec2i, consumer: GUIVertexConsumer, options: GUIVertexOptions?) {
|
||||||
|
val element = this.element ?: return
|
||||||
|
val size = element.size
|
||||||
|
ColorElement(guiRenderer, size + BACKGROUND_SIZE * 2, 0x3c05aa.asRGBColor()).render(offset, consumer, options)
|
||||||
|
ColorElement(guiRenderer, size + (BACKGROUND_SIZE - 2) * 2, 0x160611A0.asRGBAColor()).render(offset + (BACKGROUND_SIZE - (BACKGROUND_SIZE - 2)), consumer, options)
|
||||||
|
element.forceRender(offset + BACKGROUND_SIZE, consumer, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onChildChange(child: Element) {
|
||||||
|
forceSilentApply()
|
||||||
|
super.onChildChange(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun forceSilentApply() {
|
||||||
|
cacheUpToDate = false
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object : HUDBuilder<LayoutedGUIElement<WawlaHUDElement>> {
|
||||||
|
private const val BACKGROUND_SIZE = 5
|
||||||
|
override val identifier: ResourceLocation = "minosoft:wawla".toResourceLocation()
|
||||||
|
|
||||||
|
override fun build(guiRenderer: GUIRenderer): LayoutedGUIElement<WawlaHUDElement> {
|
||||||
|
return LayoutedGUIElement(WawlaHUDElement(guiRenderer))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2023 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.gui.rendering.gui.hud.elements.wawla.block
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.registries.blocks.wawla.BlockWawlaProvider
|
||||||
|
import de.bixilon.minosoft.data.registries.identified.Namespaces
|
||||||
|
import de.bixilon.minosoft.data.text.BaseComponent
|
||||||
|
import de.bixilon.minosoft.data.text.ChatComponentUtil.removeTrailingNewlines
|
||||||
|
import de.bixilon.minosoft.data.text.TextComponent
|
||||||
|
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
|
||||||
|
import de.bixilon.minosoft.gui.rendering.camera.target.targets.BlockTarget
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.wawla.WawlaElement
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.wawla.WawlaHUDElement
|
||||||
|
|
||||||
|
class BlockWawlaElement(wawla: WawlaHUDElement, val target: BlockTarget) : WawlaElement(wawla) {
|
||||||
|
override val elements: List<Element?> = listOf(
|
||||||
|
createName(),
|
||||||
|
createAdditionalInformation(),
|
||||||
|
createIdentifierElement(target.blockState.block),
|
||||||
|
createMod(),
|
||||||
|
WawlaBreakProgressElement(this),
|
||||||
|
)
|
||||||
|
|
||||||
|
init {
|
||||||
|
parent = wawla
|
||||||
|
forceSilentApply()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createName(): TextElement {
|
||||||
|
return createNameElement(target.blockState.block.item.translationKey) // TODO: use key of block and not item
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createMod(): TextElement? {
|
||||||
|
val namespace = target.blockState.block.identifier.namespace
|
||||||
|
if (namespace == Namespaces.DEFAULT) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
return TextElement(guiRenderer, TextComponent(namespace).color(ChatColors.BLUE), background = false)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createAdditionalInformation(): TextElement? {
|
||||||
|
val component = BaseComponent()
|
||||||
|
|
||||||
|
if (target.blockState.block is BlockWawlaProvider) {
|
||||||
|
component += target.blockState.block.getWawlaInformation(context.connection, target)
|
||||||
|
component += "\n"
|
||||||
|
}
|
||||||
|
if (target.entity is BlockWawlaProvider) {
|
||||||
|
component += target.entity.getWawlaInformation(context.connection, target)
|
||||||
|
component += "\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
component.removeTrailingNewlines()
|
||||||
|
|
||||||
|
if (component.parts.isEmpty()) return null
|
||||||
|
|
||||||
|
component.setFallbackColor(ChatColors.GRAY)
|
||||||
|
|
||||||
|
return TextElement(guiRenderer, component, background = false)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2023 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.gui.rendering.gui.hud.elements.wawla.block
|
||||||
|
|
||||||
|
import de.bixilon.kotlinglm.vec2.Vec2i
|
||||||
|
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.elements.primitive.ColorElement
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions
|
||||||
|
import de.bixilon.minosoft.gui.rendering.input.interaction.BlockBreakStatus
|
||||||
|
import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2iUtil.EMPTY
|
||||||
|
|
||||||
|
class WawlaBreakProgressElement(block: BlockWawlaElement) : Element(block.guiRenderer) {
|
||||||
|
private val `break` = context.inputHandler.interactionManager.`break`
|
||||||
|
private val status = `break`.status
|
||||||
|
private val progress = if (status != null) `break`.breakProgress else null
|
||||||
|
|
||||||
|
init {
|
||||||
|
parent = block
|
||||||
|
forceSilentApply()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun forceRender(offset: Vec2i, consumer: GUIVertexConsumer, options: GUIVertexOptions?) {
|
||||||
|
if (progress == null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val maxWidth = parent?.size?.x ?: 0
|
||||||
|
if (status == BlockBreakStatus.USELESS) {
|
||||||
|
ColorElement(guiRenderer, Vec2i(maxWidth, size.y), color = ChatColors.RED).forceRender(offset, consumer, options)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val width = (progress * (maxWidth - 1)).toInt() + 1 // bar is always 1 pixel wide
|
||||||
|
|
||||||
|
val color = when (status) {
|
||||||
|
BlockBreakStatus.INEFFECTIVE -> ChatColors.RED
|
||||||
|
BlockBreakStatus.SLOW -> ChatColors.YELLOW
|
||||||
|
else -> ChatColors.GREEN
|
||||||
|
}
|
||||||
|
|
||||||
|
ColorElement(guiRenderer, Vec2i(width, size.y), color).render(offset, consumer, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun forceSilentApply() {
|
||||||
|
this.size = if (progress == null) Vec2i.EMPTY else Vec2i(-1, 3)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2023 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.gui.rendering.gui.hud.elements.wawla.entity
|
||||||
|
|
||||||
|
import de.bixilon.kutil.math.simple.DoubleMath.rounded10
|
||||||
|
import de.bixilon.minosoft.data.container.EquipmentSlots
|
||||||
|
import de.bixilon.minosoft.data.entities.entities.LivingEntity
|
||||||
|
import de.bixilon.minosoft.data.entities.wawla.EntityWawlaProvider
|
||||||
|
import de.bixilon.minosoft.data.registries.effects.attributes.DefaultStatusEffectAttributeNames
|
||||||
|
import de.bixilon.minosoft.data.registries.identified.Namespaces
|
||||||
|
import de.bixilon.minosoft.data.text.BaseComponent
|
||||||
|
import de.bixilon.minosoft.data.text.ChatComponentUtil.removeTrailingNewlines
|
||||||
|
import de.bixilon.minosoft.data.text.TextComponent
|
||||||
|
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
|
||||||
|
import de.bixilon.minosoft.gui.rendering.camera.target.targets.EntityTarget
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.wawla.WawlaElement
|
||||||
|
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.wawla.WawlaHUDElement
|
||||||
|
|
||||||
|
class EntityWawlaElement(wawla: WawlaHUDElement, private val target: EntityTarget) : WawlaElement(wawla) {
|
||||||
|
override val elements: List<Element?> = listOf(
|
||||||
|
createName(),
|
||||||
|
createBaseInformation(),
|
||||||
|
createAdditionalInformation(),
|
||||||
|
createIdentifierElement(target.entity.type),
|
||||||
|
createMod(),
|
||||||
|
)
|
||||||
|
|
||||||
|
init {
|
||||||
|
forceSilentApply()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun createName(): TextElement {
|
||||||
|
return createNameElement(target.entity.type.translationKey)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createMod(): TextElement? {
|
||||||
|
val namespace = target.entity.type.identifier.namespace
|
||||||
|
if (namespace == Namespaces.DEFAULT) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
return TextElement(guiRenderer, TextComponent(namespace).color(ChatColors.BLUE), background = false)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createBaseInformation(): TextElement? {
|
||||||
|
val entity = target.entity
|
||||||
|
val component = BaseComponent()
|
||||||
|
if (entity is LivingEntity && wawla.profile.entity.health) {
|
||||||
|
component += TextComponent("Health: ${entity.health.rounded10}/${java.lang.Float.max(0.0f, entity.getAttributeValue(DefaultStatusEffectAttributeNames.GENERIC_MAX_HEALTH).toFloat() + entity.absorptionHearts)}")
|
||||||
|
component += "\n"
|
||||||
|
}
|
||||||
|
val hand = entity.equipment[EquipmentSlots.MAIN_HAND]
|
||||||
|
if (wawla.profile.entity.hand && hand != null) {
|
||||||
|
component += TextComponent("Hand: ${hand.item.count}x ${hand.item.item}")
|
||||||
|
component += "\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
component.removeTrailingNewlines()
|
||||||
|
if (component.length == 0) return null
|
||||||
|
|
||||||
|
component.setFallbackColor(ChatColors.GRAY)
|
||||||
|
|
||||||
|
return TextElement(guiRenderer, component, background = false)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createAdditionalInformation(): TextElement? {
|
||||||
|
if (target.entity !is EntityWawlaProvider) return null
|
||||||
|
|
||||||
|
val text = target.entity.getWawlaInformation(context.connection, target)
|
||||||
|
|
||||||
|
if (text is BaseComponent) text.removeTrailingNewlines()
|
||||||
|
if (text.length == 0) return null // isEmpty
|
||||||
|
|
||||||
|
text.setFallbackColor(ChatColors.GRAY)
|
||||||
|
|
||||||
|
return TextElement(guiRenderer, text, background = false)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2023 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.gui.rendering.input.interaction
|
||||||
|
|
||||||
|
enum class BlockBreakStatus {
|
||||||
|
/**
|
||||||
|
* Block can not be broken
|
||||||
|
*/
|
||||||
|
USELESS,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Block can only be broken with tool
|
||||||
|
*/
|
||||||
|
INEFFECTIVE,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Breaking can be faster with the correct tool
|
||||||
|
*/
|
||||||
|
SLOW,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Current tool is effective
|
||||||
|
*/
|
||||||
|
EFFECTIVE,
|
||||||
|
;
|
||||||
|
|
||||||
|
}
|
@ -48,8 +48,8 @@ class BreakInteractionHandler(
|
|||||||
private var breakBlockState: BlockState? = null
|
private var breakBlockState: BlockState? = null
|
||||||
var breakProgress = Double.NEGATIVE_INFINITY
|
var breakProgress = Double.NEGATIVE_INFINITY
|
||||||
private set
|
private set
|
||||||
val breakingBlock: Boolean
|
var status: BlockBreakStatus? = null
|
||||||
get() = breakPosition != null
|
private set
|
||||||
|
|
||||||
private var breakSelectedSlot: Int = -1
|
private var breakSelectedSlot: Int = -1
|
||||||
|
|
||||||
@ -63,6 +63,7 @@ class BreakInteractionHandler(
|
|||||||
breakPosition = null
|
breakPosition = null
|
||||||
breakBlockState = null
|
breakBlockState = null
|
||||||
breakProgress = Double.NEGATIVE_INFINITY
|
breakProgress = Double.NEGATIVE_INFINITY
|
||||||
|
status = null
|
||||||
|
|
||||||
breakSelectedSlot = -1
|
breakSelectedSlot = -1
|
||||||
}
|
}
|
||||||
@ -238,6 +239,15 @@ class BreakInteractionHandler(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: properly set slow status if block drops without tool
|
||||||
|
this.status = when {
|
||||||
|
damage <= 0.0f -> BlockBreakStatus.USELESS
|
||||||
|
speedMultiplier <= 1.0f -> BlockBreakStatus.SLOW
|
||||||
|
isBestTool -> BlockBreakStatus.EFFECTIVE
|
||||||
|
target.blockState.requiresTool -> BlockBreakStatus.INEFFECTIVE
|
||||||
|
else -> BlockBreakStatus.SLOW
|
||||||
|
}
|
||||||
|
|
||||||
if (breakProgress >= 1.0f) {
|
if (breakProgress >= 1.0f) {
|
||||||
finishDigging()
|
finishDigging()
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minosoft
|
* Minosoft
|
||||||
* Copyright (C) 2020-2022 Moritz Zwerger
|
* Copyright (C) 2020-2023 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 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.
|
||||||
*
|
*
|
||||||
@ -14,7 +14,6 @@
|
|||||||
package de.bixilon.minosoft.gui.rendering.input.interaction
|
package de.bixilon.minosoft.gui.rendering.input.interaction
|
||||||
|
|
||||||
import de.bixilon.kotlinglm.vec3.Vec3
|
import de.bixilon.kotlinglm.vec3.Vec3
|
||||||
import de.bixilon.kutil.time.TimeUtil
|
|
||||||
import de.bixilon.kutil.time.TimeUtil.millis
|
import de.bixilon.kutil.time.TimeUtil.millis
|
||||||
import de.bixilon.minosoft.config.key.KeyActions
|
import de.bixilon.minosoft.config.key.KeyActions
|
||||||
import de.bixilon.minosoft.config.key.KeyBinding
|
import de.bixilon.minosoft.config.key.KeyBinding
|
||||||
@ -167,7 +166,7 @@ class InteractInteractionHandler(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun useItem() {
|
fun useItem() {
|
||||||
if (interactionManager.`break`.breakingBlock) {
|
if (interactionManager.`break`.status != null) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user