Skip to content

Commit 1730613

Browse files
committed
ability selection hud
1 parent 8ba8856 commit 1730613

File tree

6 files changed

+99
-7
lines changed

6 files changed

+99
-7
lines changed

Diff for: src/main/kotlin/dev/sterner/client/screen/ItemAbilityScreen.kt

+77-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package dev.sterner.client.screen
22

3+
import com.mojang.blaze3d.systems.RenderSystem
4+
import dev.sterner.VoidBound
35
import dev.sterner.api.VoidBoundApi
46
import dev.sterner.api.item.ItemAbility
57
import net.minecraft.client.Minecraft
8+
import net.minecraft.client.gui.GuiGraphics
69
import net.minecraft.client.gui.screens.Screen
710
import net.minecraft.network.chat.Component
811
import net.minecraft.world.item.ItemStack
@@ -27,8 +30,8 @@ class ItemAbilityScreen(stack: ItemStack) : Screen(Component.literal("Ability Se
2730
selection = 0
2831
initialized = false
2932

30-
w = max((abilities!!.size * 50 + 30).toDouble(), 220.0).toInt()
31-
h = 30
33+
w = 180
34+
h = 37
3235
}
3336

3437
fun cycle(direction: Int) {
@@ -38,9 +41,80 @@ class ItemAbilityScreen(stack: ItemStack) : Screen(Component.literal("Ability Se
3841

3942
fun update() {
4043
if (focus) {
41-
yOffset += (40 - yOffset) * .1f
44+
yOffset += (85 - yOffset) * .1f
4245
} else {
4346
yOffset *= .9f
4447
}
4548
}
49+
50+
fun render(guiGraphics: GuiGraphics, partialTick: Float) {
51+
52+
if (abilities == null) {
53+
return
54+
}
55+
56+
val matrixStack = guiGraphics.pose()
57+
val mainWindow = minecraft!!.window
58+
val x = (mainWindow.guiScaledWidth - w) / 2 + 15
59+
val y = mainWindow.guiScaledHeight - h + 20
60+
61+
matrixStack.pushPose()
62+
matrixStack.translate(0f, 20 - yOffset, (if (focus) 100 else 0).toFloat())
63+
64+
val gray = VoidBound.id("textures/gui/ability_selection.png")
65+
RenderSystem.enableBlend()
66+
RenderSystem.setShaderColor(1f, 1f, 1f, if (focus) 7 / 8f else 0f)
67+
68+
guiGraphics.blit(
69+
gray,
70+
x - 15,
71+
y,
72+
0f,
73+
0f,
74+
w,
75+
h,
76+
256,
77+
256
78+
)
79+
80+
val abilityWidth = 50 // Width of one ability + some space
81+
val totalWidth = abilities!!.size * abilityWidth
82+
83+
val startX = (mainWindow.guiScaledWidth - totalWidth) / 2
84+
85+
for (i in abilities!!.indices) {
86+
RenderSystem.enableBlend()
87+
matrixStack.pushPose()
88+
89+
val alpha = if (focus) 1f else 0.2f
90+
91+
if (i == selection) {
92+
matrixStack.translate(0f, -10f, 0f)
93+
} else {
94+
matrixStack.translate(0f, -5f, 0f)
95+
}
96+
97+
RenderSystem.setShaderColor(1f, 1f, 1f, alpha)
98+
99+
val abilityX = startX + i * abilityWidth
100+
101+
if (i == selection) {
102+
guiGraphics.drawCenteredString(
103+
minecraft!!.font,
104+
abilities!![i].name.lowercase().replaceFirstChar { it.uppercase() },
105+
abilityX + 24,
106+
y + 32,
107+
0xDDCCFF
108+
)
109+
}
110+
111+
val texture = VoidBound.id("textures/gui/" + abilities!![i].name.lowercase() + ".png")
112+
guiGraphics.blit(texture, abilityX + 16, y + 16, 0, 0f, 0f, 16, 16, 16, 16)
113+
114+
matrixStack.popPose()
115+
}
116+
117+
RenderSystem.disableBlend()
118+
matrixStack.popPose()
119+
}
46120
}

Diff for: src/main/kotlin/dev/sterner/common/ItemAbilityHandler.kt

+16
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package dev.sterner.common
33
import dev.sterner.api.item.ItemAbility
44
import dev.sterner.client.screen.ItemAbilityScreen
55
import net.minecraft.client.Minecraft
6+
import net.minecraft.client.gui.GuiGraphics
7+
import net.minecraft.client.player.LocalPlayer
68
import net.minecraft.world.item.ItemStack
79
import net.minecraft.world.level.GameType
810
import org.lwjgl.glfw.GLFW
@@ -28,17 +30,31 @@ class ItemAbilityHandler {
2830
active = false
2931
return
3032
}
33+
init(player)
3134
if (!active) {
3235
return
3336
}
3437

3538
selectionScreen.update()
3639
}
3740

41+
fun render(graphics: GuiGraphics, partialTicks: Float, width: Int, height: Int) {
42+
if (Minecraft.getInstance().options.hideGui || !active) {
43+
return
44+
}
45+
46+
selectionScreen.render(graphics, partialTicks)
47+
}
48+
49+
private fun init(player: LocalPlayer?) {
50+
active = true
51+
}
52+
3853
fun onKeyInput(key: Int, pressed: Boolean) {
3954
if (!active) {
4055
return
4156
}
57+
4258
if (key != GLFW.GLFW_KEY_LEFT_ALT) {
4359
return
4460
}

Diff for: src/main/kotlin/dev/sterner/registry/VoidBoundEvents.kt

+6-4
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import dev.sterner.common.components.VoidBoundWorldComponent
1212
import dev.sterner.common.item.tool.TidecutterItem
1313
import dev.sterner.common.item.tool.UpgradableTool
1414
import io.github.fabricators_of_create.porting_lib.event.common.BlockEvents
15-
import io.github.fabricators_of_create.porting_lib.event.common.BlockEvents.BlockBreak
1615
import net.fabricmc.api.EnvType
1716
import net.fabricmc.api.Environment
1817
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents
@@ -21,7 +20,8 @@ import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents
2120
import net.fabricmc.fabric.api.event.player.UseBlockCallback
2221
import net.fabricmc.fabric.api.event.player.UseEntityCallback
2322
import net.fabricmc.fabric.api.item.v1.ModifyItemAttributeModifiersCallback
24-
import net.fabricmc.fabric.api.loot.v2.LootTableEvents
23+
import net.minecraft.client.Minecraft
24+
import net.minecraft.client.gui.GuiGraphics
2525
import net.minecraft.server.level.ServerLevel
2626
import net.minecraft.world.entity.EquipmentSlot
2727
import net.minecraft.world.entity.ai.attributes.Attribute
@@ -31,9 +31,7 @@ import net.minecraft.world.item.ItemStack
3131
import net.minecraft.world.item.crafting.RecipeType
3232
import net.minecraft.world.item.crafting.SmeltingRecipe
3333
import net.minecraft.world.level.block.Block
34-
import net.minecraft.world.level.block.entity.FurnaceBlockEntity
3534
import java.util.*
36-
import io.github.fabricators_of_create.porting_lib.loot.LootModifier;
3735

3836

3937
object VoidBoundEvents {
@@ -125,5 +123,9 @@ object VoidBoundEvents {
125123
ClientTickEvents.END_CLIENT_TICK.register{
126124
VoidBoundClient.ITEM_ABILITY_HANDLER.tick()
127125
}
126+
HudRenderCallback.EVENT.register(HudRenderCallback { graphics: GuiGraphics, partialTicks: Float ->
127+
val window = Minecraft.getInstance().window
128+
VoidBoundClient.ITEM_ABILITY_HANDLER.render(graphics, partialTicks, window.width, window.height)
129+
})
128130
}
129131
}
Loading
267 Bytes
Loading
366 Bytes
Loading

0 commit comments

Comments
 (0)