diff options
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/utils')
8 files changed, 183 insertions, 19 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/ColorUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/ColorUtils.kt index 52656f6ad..ed0a9740e 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/ColorUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/ColorUtils.kt @@ -1,11 +1,10 @@ package at.hannibal2.skyhanni.utils import java.awt.Color -import kotlin.math.max object ColorUtils { - /** Transfer string colors from the config to java.awt.Color */ + /** Transfer string colors from the config to [Color] */ fun String.toChromaColor() = Color(toChromaColorInt(), true) fun String.toChromaColorInt() = SpecialColour.specialToChromaRGB(this) @@ -25,14 +24,13 @@ object ColorUtils { (start.blue * (1 - percent) + end.blue * percent).toInt() ) - fun Color.darker(factor: Double): Color { - return Color( - max((red * factor).toInt(), 0), - max((green * factor).toInt(), 0), - max((blue * factor).toInt(), 0), - alpha - ) - } + /** Darkens a color by a [factor]. The lower the [factor], the darker the color. */ + fun Color.darker(factor: Double = 0.7) = Color( + (red * factor).toInt().coerceIn(0, 255), + (green * factor).toInt().coerceIn(0, 255), + (blue * factor).toInt().coerceIn(0, 255), + alpha + ) fun Color.withAlpha(alpha: Int): Int = (alpha.coerceIn(0, 255) shl 24) or (this.rgb and 0x00ffffff) diff --git a/src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt index 00eb2e046..430310709 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt @@ -14,13 +14,16 @@ import at.hannibal2.skyhanni.utils.StringUtils.removeColor import net.minecraft.block.state.IBlockState import net.minecraft.client.Minecraft import net.minecraft.client.entity.EntityOtherPlayerMP +import net.minecraft.client.resources.DefaultPlayerSkin import net.minecraft.entity.Entity import net.minecraft.entity.EntityLivingBase import net.minecraft.entity.item.EntityArmorStand import net.minecraft.entity.monster.EntityEnderman import net.minecraft.entity.player.EntityPlayer +import net.minecraft.entity.player.EnumPlayerModelParts import net.minecraft.item.ItemStack import net.minecraft.potion.Potion +import net.minecraft.scoreboard.ScorePlayerTeam import net.minecraft.util.AxisAlignedBB import net.minecraftforge.client.event.RenderLivingEvent import net.minecraftforge.fml.common.eventhandler.Event @@ -190,6 +193,27 @@ object EntityUtils { fun EntityLivingBase.isRunicAndCorrupt() = baseMaxHealth == health.toInt().derpy() * 3 * 4 fun Entity.cleanName() = this.name.removeColor() + + /** + * @return a fake player with the same skin as the real player + */ + fun getFakePlayer(): EntityOtherPlayerMP { + val mc = Minecraft.getMinecraft() + return object : EntityOtherPlayerMP( + mc.theWorld, + mc.thePlayer.gameProfile + ) { + override fun getLocationSkin() = + mc.thePlayer.locationSkin ?: DefaultPlayerSkin.getDefaultSkin(mc.thePlayer.uniqueID) + + override fun getTeam() = object : ScorePlayerTeam(null, null) { + override fun getNameTagVisibility() = EnumVisible.NEVER + } + + override fun isWearing(part: EnumPlayerModelParts?) = + mc.thePlayer.isWearing(part) && part != EnumPlayerModelParts.CAPE + } + } } private fun Event.cancel() { diff --git a/src/main/java/at/hannibal2/skyhanni/utils/InventoryUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/InventoryUtils.kt index e3f06b83b..53ee6cf7a 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/InventoryUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/InventoryUtils.kt @@ -34,8 +34,12 @@ object InventoryUtils { } else "" } + fun inInventory() = Minecraft.getMinecraft().currentScreen is GuiChest + fun ContainerChest.getInventoryName() = this.lowerChestInventory.displayName.unformattedText.trim() + fun getWindowId(): Int? = (Minecraft.getMinecraft().currentScreen as? GuiChest)?.inventorySlots?.windowId + fun getItemsInOwnInventory() = getItemsInOwnInventoryWithNull()?.filterNotNull() ?: emptyList() @@ -112,4 +116,10 @@ object InventoryUtils { } fun NEUInternalName.getAmountInInventory(): Int = countItemsInLowerInventory { it.getInternalNameOrNull() == this } + + fun clickSlot(slot: Int) { + val windowId = getWindowId() ?: return + val controller = Minecraft.getMinecraft().playerController + controller.windowClick(windowId, slot, 0, 0, Minecraft.getMinecraft().thePlayer) + } } diff --git a/src/main/java/at/hannibal2/skyhanni/utils/ItemUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/ItemUtils.kt index d093dcfaf..6af19e382 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/ItemUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/ItemUtils.kt @@ -123,6 +123,13 @@ object ItemUtils { // Checks for hypixel enchantments in the attributes fun ItemStack.hasEnchantments() = getEnchantments()?.isNotEmpty() ?: false + fun ItemStack.removeEnchants(): ItemStack = apply { + val tag = tagCompound ?: NBTTagCompound() + tag.removeTag("ench") + tag.removeTag("StoredEnchantments") + tagCompound = tag + } + fun ItemStack.getSkullTexture(): String? { if (item != Items.skull) return null if (tagCompound == null) return null diff --git a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt index 40e8ddab9..1506882cd 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt @@ -559,6 +559,7 @@ object RenderUtils { renderables: List<Renderable>, extraSpace: Int = 0, posLabel: String, + addToGuiManager: Boolean = true, ) { if (renderables.isEmpty()) return var longestY = 0 @@ -575,7 +576,21 @@ object RenderUtils { GlStateManager.popMatrix() } - GuiEditManager.add(this, posLabel, longestX, longestY) + if (addToGuiManager) GuiEditManager.add(this, posLabel, longestX, longestY) + } + + fun Position.renderRenderable( + renderable: Renderable, + posLabel: String, + addToGuiManager: Boolean = true, + ) { + GlStateManager.pushMatrix() + val (x, y) = transform() + Renderable.withMousePosition(x, y) { + renderable.render(0, 0) + } + GlStateManager.popMatrix() + if (addToGuiManager) GuiEditManager.add(this, posLabel, renderable.width, 0) } /** diff --git a/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt b/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt index 0d830e5c1..870a3a2f2 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt @@ -8,8 +8,10 @@ import at.hannibal2.skyhanni.data.ToolTipData import at.hannibal2.skyhanni.features.chroma.ChromaShaderManager import at.hannibal2.skyhanni.features.chroma.ChromaType import at.hannibal2.skyhanni.features.misc.DarkenShader +import at.hannibal2.skyhanni.mixins.hooks.RenderLivingEntityHelper import at.hannibal2.skyhanni.utils.CollectionUtils.contains import at.hannibal2.skyhanni.utils.ColorUtils +import at.hannibal2.skyhanni.utils.ColorUtils.addAlpha import at.hannibal2.skyhanni.utils.ColorUtils.darker import at.hannibal2.skyhanni.utils.KeyboardManager.isKeyClicked import at.hannibal2.skyhanni.utils.LorenzColor @@ -31,7 +33,9 @@ import net.minecraft.client.Minecraft import net.minecraft.client.gui.Gui import net.minecraft.client.gui.GuiIngameMenu import net.minecraft.client.gui.inventory.GuiEditSign +import net.minecraft.client.gui.inventory.GuiInventory.drawEntityOnScreen import net.minecraft.client.renderer.GlStateManager +import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack import net.minecraft.util.ResourceLocation import java.awt.Color @@ -292,10 +296,10 @@ interface Renderable { bypassChecks: Boolean = false, condition: () -> Boolean = { true }, highlightsOnHoverSlots: List<Int> = emptyList(), + onHover: () -> Unit = {}, ) = object : Renderable { - override val width: Int - get() = max(hovered.width, unhovered.width) - override val height = 10 + override val width = max(hovered.width, unhovered.width) + override val height = max(hovered.height, unhovered.height) override val horizontalAlign get() = if (isHovered) hovered.horizontalAlign else unhovered.horizontalAlign override val verticalAlign get() = if (isHovered) hovered.verticalAlign else unhovered.verticalAlign @@ -304,6 +308,7 @@ interface Renderable { override fun render(posX: Int, posY: Int) { val pair = Pair(posX, posY) isHovered = if (isHovered(posX, posY) && condition() && shouldAllowLink(true, bypassChecks)) { + onHover() hovered.render(posX, posY) HighlightOnHoverSlot.currentSlots[pair] = highlightsOnHoverSlots true @@ -315,6 +320,28 @@ interface Renderable { } } + /** Bottom Layer must be bigger then the top layer */ + fun doubleLayered( + bottomLayer: Renderable, + topLayer: Renderable, + blockBottomHover: Boolean = true, + ) = object : Renderable { + override val width = bottomLayer.width + override val height = bottomLayer.height + override val horizontalAlign = bottomLayer.horizontalAlign + override val verticalAlign = bottomLayer.verticalAlign + + override fun render(posX: Int, posY: Int) { + val (x, y) = topLayer.renderXYAligned(posX, posY, width, height) + val (posX, posY) = if (topLayer.isHovered(posX + x, posY + y) && blockBottomHover) { + bottomLayer.width + 1 to bottomLayer.height + 1 + } else { + posX to posY + } + bottomLayer.render(posX, posY) + } + } + fun itemStackWithTip( item: ItemStack, scale: Double = NEUItems.itemFontSize, @@ -562,7 +589,7 @@ interface Renderable { } // TODO use this to render current boosted crop in next jacob contest crops - fun Renderable.renderBounds(color: Color = LorenzColor.GREEN.toColor()) = object : Renderable { + fun Renderable.renderBounds(color: Color = LorenzColor.GREEN.toColor().addAlpha(100)) = object : Renderable { override val width = this@renderBounds.width override val height = this@renderBounds.height override val horizontalAlign = this@renderBounds.horizontalAlign @@ -846,5 +873,85 @@ interface Renderable { GlStateManager.translate(-padding.toFloat(), -padding.toFloat(), 0f) } } + + fun drawInsideRoundedRectWithOutline( + input: Renderable, + color: Color, + padding: Int = 2, + radius: Int = 10, + smoothness: Int = 2, + topOutlineColor: Int, + bottomOutlineColor: Int, + borderOutlineThickness: Int, + blur: Float = 0.7f, + horizontalAlign: HorizontalAlignment = HorizontalAlignment.LEFT, + verticalAlign: VerticalAlignment = VerticalAlignment.TOP, + ) = object : Renderable { + override val width = input.width + padding * 2 + override val height = input.height + padding * 2 + override val horizontalAlign = horizontalAlign + override val verticalAlign = verticalAlign + + override fun render(posX: Int, posY: Int) { + RenderUtils.drawRoundRect(0, 0, width, height, color.rgb, radius, smoothness) + RenderUtils.drawRoundRectOutline( + 0, + 0, + width, + height, + topOutlineColor, + bottomOutlineColor, + borderOutlineThickness, + radius, + blur + ) + + GlStateManager.translate(padding.toFloat(), padding.toFloat(), 0f) + input.render(posX + padding, posY + padding) + GlStateManager.translate(-padding.toFloat(), -padding.toFloat(), 0f) + } + } + + fun fakePlayer( + player: EntityPlayer, + followMouse: Boolean = false, + eyesX: Float = 0f, + eyesY: Float = 0f, + width: Int = 50, + height: Int = 100, + entityScale: Int = 30, + padding: Int = 5, + color: Int? = null, + colorCondition: () -> Boolean = { true }, + ) = object : Renderable { + override val width = width + 2 * padding + override val height = height + 2 * padding + override val horizontalAlign = HorizontalAlignment.LEFT + override val verticalAlign = VerticalAlignment.TOP + val playerWidth = entityScale + val playerHeight = entityScale * 2 + val playerX = width / 2 + padding + val playerY = height / 2 + playerHeight / 2 + padding + + override fun render(posX: Int, posY: Int) { + GlStateManager.color(1f, 1f, 1f, 1f) + if (color != null) RenderLivingEntityHelper.setEntityColor(player, color, colorCondition) + val mouse = currentRenderPassMousePosition ?: return + val mouseXRelativeToPlayer = + if (followMouse) (posX + playerX - mouse.first).toFloat() else eyesX + val mouseYRelativeToPlayer = + if (followMouse) (posY + playerY - mouse.second - 1.62 * entityScale).toFloat() else eyesY + GlStateManager.translate(0f, 0f, 100f) + drawEntityOnScreen( + playerX, + playerY, + entityScale, + mouseXRelativeToPlayer, + mouseYRelativeToPlayer, + player + ) + GlStateManager.translate(0f, 0f, -100f) + } + } } } diff --git a/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableTooltips.kt b/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableTooltips.kt index 7fdaba165..0d2c88785 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableTooltips.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableTooltips.kt @@ -75,7 +75,7 @@ object RenderableTooltips { RenderHelper.disableStandardItemLighting() GlStateManager.enableDepth() - val zLevel = 300f + val zLevel = 400f GlStateManager.translate(tooltipX.toFloat(), tooltipY.toFloat(), zLevel) RenderUtils.drawGradientRect( diff --git a/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableUtils.kt index cf81fc9ff..d1a8aae02 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableUtils.kt @@ -48,25 +48,28 @@ internal object RenderableUtils { else -> 0 } - fun Renderable.renderXYAligned(posX: Int, posY: Int, xSpace: Int, ySpace: Int) { + fun Renderable.renderXYAligned(posX: Int, posY: Int, xSpace: Int, ySpace: Int): Pair<Int, Int> { val xOffset = calculateAlignmentXOffset(this, xSpace) val yOffset = calculateAlignmentYOffset(this, ySpace) GlStateManager.translate(xOffset.toFloat(), yOffset.toFloat(), 0f) this.render(posX + xOffset, posY + yOffset) GlStateManager.translate(-xOffset.toFloat(), -yOffset.toFloat(), 0f) + return xOffset to yOffset } - fun Renderable.renderXAligned(posX: Int, posY: Int, xSpace: Int) { + fun Renderable.renderXAligned(posX: Int, posY: Int, xSpace: Int): Int { val xOffset = calculateAlignmentXOffset(this, xSpace) GlStateManager.translate(xOffset.toFloat(), 0f, 0f) this.render(posX + xOffset, posY) GlStateManager.translate(-xOffset.toFloat(), 0f, 0f) + return xOffset } - fun Renderable.renderYAligned(posX: Int, posY: Int, ySpace: Int) { + fun Renderable.renderYAligned(posX: Int, posY: Int, ySpace: Int): Int { val yOffset = calculateAlignmentYOffset(this, ySpace) GlStateManager.translate(0f, yOffset.toFloat(), 0f) this.render(posX, posY + yOffset) GlStateManager.translate(0f, -yOffset.toFloat(), 0f) + return yOffset } } |