From ae5e45f454e2783534d80c8465853be50a01d483 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Wed, 18 Jan 2023 14:39:21 +0100 Subject: [PATCH] wawla: config, more entity information --- .../config/profile/profiles/gui/hud/HudC.kt | 4 ++- .../profile/profiles/gui/hud/wawla/WawlaC.kt | 27 +++++++++++++++++ .../profiles/gui/hud/wawla/block/BlockC.kt} | 9 ++++-- .../profiles/gui/hud/wawla/entity/EntityC.kt} | 12 ++++++-- .../data/entities/entities/LivingEntity.kt | 3 +- .../entities/entities/decoration/ItemFrame.kt | 12 ++++++-- .../entities/wawla/EntityWawlaProvider.kt | 3 +- .../blocks/wawla/BlockWawlaProvider.kt | 3 +- .../gui/hud/elements/wawla/WawlaHUDElement.kt | 19 ++++++++++-- .../elements/wawla/block/BlockWawlaElement.kt | 4 +-- .../wawla/entity/EntityWawlaElement.kt | 30 ++++++++++++++++++- 11 files changed, 108 insertions(+), 18 deletions(-) create mode 100644 src/main/java/de/bixilon/minosoft/config/profile/profiles/gui/hud/wawla/WawlaC.kt rename src/main/java/de/bixilon/minosoft/{data/entities/wawla/EntityWawlaInformation.kt => config/profile/profiles/gui/hud/wawla/block/BlockC.kt} (72%) rename src/main/java/de/bixilon/minosoft/{data/registries/blocks/wawla/BlockWawlaInformation.kt => config/profile/profiles/gui/hud/wawla/entity/EntityC.kt} (66%) diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/gui/hud/HudC.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/gui/hud/HudC.kt index 41f191677..a06df32dd 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/gui/hud/HudC.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/gui/hud/HudC.kt @@ -1,6 +1,6 @@ /* * 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. * @@ -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.hud.crosshair.CrosshairC 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) { val crosshair = CrosshairC(profile) val hotbar = HotbarC(profile) + val wawla = WawlaC(profile) } diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/gui/hud/wawla/WawlaC.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/gui/hud/wawla/WawlaC.kt new file mode 100644 index 000000000..d7b6668d8 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/gui/hud/wawla/WawlaC.kt @@ -0,0 +1,27 @@ +/* + * 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 . + * + * 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) + + val block = BlockC(profile) + val entity = EntityC(profile) +} diff --git a/src/main/java/de/bixilon/minosoft/data/entities/wawla/EntityWawlaInformation.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/gui/hud/wawla/block/BlockC.kt similarity index 72% rename from src/main/java/de/bixilon/minosoft/data/entities/wawla/EntityWawlaInformation.kt rename to src/main/java/de/bixilon/minosoft/config/profile/profiles/gui/hud/wawla/block/BlockC.kt index 3c6dc6576..832158d5a 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/wawla/EntityWawlaInformation.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/gui/hud/wawla/block/BlockC.kt @@ -11,8 +11,11 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.data.entities.wawla +package de.bixilon.minosoft.config.profile.profiles.gui.hud.wawla.block -import de.bixilon.minosoft.data.registries.wawla.WawlaInformation +import de.bixilon.minosoft.config.profile.delegate.primitive.BooleanDelegate +import de.bixilon.minosoft.config.profile.profiles.gui.GUIProfile -interface EntityWawlaInformation : WawlaInformation +class BlockC(profile: GUIProfile) { + var enabled by BooleanDelegate(profile, true) +} diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/wawla/BlockWawlaInformation.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/gui/hud/wawla/entity/EntityC.kt similarity index 66% rename from src/main/java/de/bixilon/minosoft/data/registries/blocks/wawla/BlockWawlaInformation.kt rename to src/main/java/de/bixilon/minosoft/config/profile/profiles/gui/hud/wawla/entity/EntityC.kt index 36371ba3d..2e48475b5 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/wawla/BlockWawlaInformation.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/gui/hud/wawla/entity/EntityC.kt @@ -11,8 +11,14 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.data.registries.blocks.wawla +package de.bixilon.minosoft.config.profile.profiles.gui.hud.wawla.entity -import de.bixilon.minosoft.data.registries.wawla.WawlaInformation +import de.bixilon.minosoft.config.profile.delegate.primitive.BooleanDelegate +import de.bixilon.minosoft.config.profile.profiles.gui.GUIProfile -interface BlockWawlaInformation : WawlaInformation +class EntityC(profile: GUIProfile) { + var enabled by BooleanDelegate(profile, true) + var health by BooleanDelegate(profile, true) + + var hand by BooleanDelegate(profile, true) +} diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/LivingEntity.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/LivingEntity.kt index 776f47900..7208ce77d 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/LivingEntity.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/LivingEntity.kt @@ -20,6 +20,7 @@ import de.bixilon.minosoft.data.entities.Poses import de.bixilon.minosoft.data.entities.data.EntityData import de.bixilon.minosoft.data.entities.data.EntityDataField import de.bixilon.minosoft.data.entities.entities.player.Hands +import de.bixilon.minosoft.data.entities.wawla.EntityWawlaProvider import de.bixilon.minosoft.data.registries.effects.attributes.DefaultStatusEffectAttributeNames import de.bixilon.minosoft.data.registries.entities.EntityType import de.bixilon.minosoft.data.text.formatting.color.ChatColors @@ -30,7 +31,7 @@ import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.sp import de.bixilon.minosoft.gui.rendering.util.VecUtil.horizontal import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection -abstract class LivingEntity(connection: PlayConnection, entityType: EntityType, data: EntityData, position: Vec3d, rotation: EntityRotation) : Entity(connection, entityType, data, position, rotation) { +abstract class LivingEntity(connection: PlayConnection, entityType: EntityType, data: EntityData, position: Vec3d, rotation: EntityRotation) : Entity(connection, entityType, data, position, rotation), EntityWawlaProvider { private val entityEffectParticle = connection.registries.particleType[EntityEffectParticle] private val ambientEntityEffectParticle = connection.registries.particleType[AmbientEntityEffectParticle] diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/decoration/ItemFrame.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/decoration/ItemFrame.kt index 37c62ba75..3f57ddf00 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/decoration/ItemFrame.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/decoration/ItemFrame.kt @@ -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.EntityDataField 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.EntityType import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft 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.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 val item: ItemStack? @@ -39,10 +42,15 @@ open class ItemFrame(connection: PlayConnection, entityType: EntityType, data: E @get:SynchronizedEntityData var facing: Directions = Directions.NORTH + override fun setObjectData(data: Int) { facing = Directions[data] } + override fun getWawlaInformation(connection: PlayConnection, target: EntityTarget): ChatComponent { + return TextComponent("Item: $item") + } + companion object : EntityFactory { override val identifier: ResourceLocation = minecraft("item_frame") private val ITEM_DATA = EntityDataField("ITEM_FRAME_ITEM") diff --git a/src/main/java/de/bixilon/minosoft/data/entities/wawla/EntityWawlaProvider.kt b/src/main/java/de/bixilon/minosoft/data/entities/wawla/EntityWawlaProvider.kt index 89f66d1c8..7f098caaf 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/wawla/EntityWawlaProvider.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/wawla/EntityWawlaProvider.kt @@ -13,10 +13,11 @@ 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): EntityWawlaInformation + fun getWawlaInformation(connection: PlayConnection, target: EntityTarget): ChatComponent } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/wawla/BlockWawlaProvider.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/wawla/BlockWawlaProvider.kt index e3f102908..c6ad6c39d 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/wawla/BlockWawlaProvider.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/wawla/BlockWawlaProvider.kt @@ -13,10 +13,11 @@ 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): BlockWawlaInformation + fun getWawlaInformation(connection: PlayConnection, target: BlockTarget): ChatComponent } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/wawla/WawlaHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/wawla/WawlaHUDElement.kt index 796759a68..da6a36fb5 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/wawla/WawlaHUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/wawla/WawlaHUDElement.kt @@ -35,15 +35,28 @@ 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 - val element: WawlaElement? = when (target) { - is BlockTarget -> BlockWawlaElement(this, target) - is EntityTarget -> EntityWawlaElement(this, 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 diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/wawla/block/BlockWawlaElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/wawla/block/BlockWawlaElement.kt index 7e79cb3d1..d457f3e33 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/wawla/block/BlockWawlaElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/wawla/block/BlockWawlaElement.kt @@ -71,11 +71,11 @@ class BlockWawlaElement(wawla: WawlaHUDElement, private val target: BlockTarget) val component = BaseComponent() if (target.blockState.block is BlockWawlaProvider) { - component += target.blockState.block.getWawlaInformation(context.connection, target).text + component += target.blockState.block.getWawlaInformation(context.connection, target) component += "\n" } if (target.entity is BlockWawlaProvider) { - component += target.entity.getWawlaInformation(context.connection, target).text + component += target.entity.getWawlaInformation(context.connection, target) component += "\n" } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/wawla/entity/EntityWawlaElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/wawla/entity/EntityWawlaElement.kt index 7a93196c2..74679c640 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/wawla/entity/EntityWawlaElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/wawla/entity/EntityWawlaElement.kt @@ -14,8 +14,13 @@ package de.bixilon.minosoft.gui.rendering.gui.hud.elements.wawla.entity import de.bixilon.kotlinglm.vec2.Vec2i +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.TextComponent import de.bixilon.minosoft.data.text.formatting.color.ChatColors import de.bixilon.minosoft.gui.rendering.camera.target.targets.EntityTarget @@ -27,6 +32,7 @@ import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions class EntityWawlaElement(wawla: WawlaHUDElement, private val target: EntityTarget) : WawlaElement(wawla) { private val name = createName() + private val base = createBaseInformation() private val additional = createAdditionalInformation() private val mod = createMod() @@ -64,10 +70,32 @@ class EntityWawlaElement(wawla: WawlaHUDElement, private val target: EntityTarge 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" + } + + 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).text + val text = target.entity.getWawlaInformation(context.connection, target) + + if (text.length == 0) return null // isEmpty text.setFallbackColor(ChatColors.GRAY)