Fix bug in WFixedPanel and use WScrollPanel + WBox for config
This commit is contained in:
@@ -32,7 +32,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||||||
|
|
||||||
@Mixin(WorldRenderer.class)
|
@Mixin(WorldRenderer.class)
|
||||||
public class MixinWorldRenderer {
|
public class MixinWorldRenderer {
|
||||||
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;renderChunkDebugInfo(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;Lnet/minecraft/client/render/Camera;)V", shift = At.Shift.AFTER))
|
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;applyModelViewMatrix()V", shift = At.Shift.AFTER))
|
||||||
public void onWorldRenderLast(MatrixStack matrices, float tickDelta, long limitTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightmapTextureManager lightmapTextureManager, Matrix4f positionMatrix, CallbackInfo ci) {
|
public void onWorldRenderLast(MatrixStack matrices, float tickDelta, long limitTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightmapTextureManager lightmapTextureManager, Matrix4f positionMatrix, CallbackInfo ci) {
|
||||||
var event = new WorldRenderLastEvent(
|
var event = new WorldRenderLastEvent(
|
||||||
matrices, tickDelta, renderBlockOutline,
|
matrices, tickDelta, renderBlockOutline,
|
||||||
|
|||||||
@@ -28,7 +28,8 @@ data class IsSlotProtectedEvent(
|
|||||||
) : FirmamentEvent() {
|
) : FirmamentEvent() {
|
||||||
companion object : FirmamentEventBus<IsSlotProtectedEvent>() {
|
companion object : FirmamentEventBus<IsSlotProtectedEvent>() {
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun shouldBlockInteraction(slot: Slot): Boolean {
|
fun shouldBlockInteraction(slot: Slot?): Boolean {
|
||||||
|
if (slot == null) return false
|
||||||
return publish(IsSlotProtectedEvent(slot)).isProtected.also {
|
return publish(IsSlotProtectedEvent(slot)).isProtected.also {
|
||||||
if (it) {
|
if (it) {
|
||||||
MC.player?.sendMessage(Text.translatable("firmament.protectitem").append(slot.stack.name))
|
MC.player?.sendMessage(Text.translatable("firmament.protectitem").append(slot.stack.name))
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ import kotlin.math.asin
|
|||||||
import kotlin.math.atan2
|
import kotlin.math.atan2
|
||||||
import kotlin.math.sqrt
|
import kotlin.math.sqrt
|
||||||
import kotlin.time.Duration.Companion.seconds
|
import kotlin.time.Duration.Companion.seconds
|
||||||
|
import net.minecraft.client.render.VertexConsumerProvider
|
||||||
|
import net.minecraft.client.render.VertexConsumers
|
||||||
import net.minecraft.entity.projectile.FishingBobberEntity
|
import net.minecraft.entity.projectile.FishingBobberEntity
|
||||||
import net.minecraft.particle.ParticleTypes
|
import net.minecraft.particle.ParticleTypes
|
||||||
import net.minecraft.util.math.Vec3d
|
import net.minecraft.util.math.Vec3d
|
||||||
@@ -32,9 +34,9 @@ import moe.nea.firmament.events.ParticleSpawnEvent
|
|||||||
import moe.nea.firmament.events.WorldReadyEvent
|
import moe.nea.firmament.events.WorldReadyEvent
|
||||||
import moe.nea.firmament.events.WorldRenderLastEvent
|
import moe.nea.firmament.events.WorldRenderLastEvent
|
||||||
import moe.nea.firmament.features.FirmamentFeature
|
import moe.nea.firmament.features.FirmamentFeature
|
||||||
|
import moe.nea.firmament.gui.config.ManagedConfig
|
||||||
import moe.nea.firmament.util.MC
|
import moe.nea.firmament.util.MC
|
||||||
import moe.nea.firmament.util.TimeMark
|
import moe.nea.firmament.util.TimeMark
|
||||||
import moe.nea.firmament.gui.config.ManagedConfig
|
|
||||||
import moe.nea.firmament.util.render.RenderBlockContext.Companion.renderBlocks
|
import moe.nea.firmament.util.render.RenderBlockContext.Companion.renderBlocks
|
||||||
|
|
||||||
object FishingWarning : FirmamentFeature {
|
object FishingWarning : FirmamentFeature {
|
||||||
@@ -89,6 +91,7 @@ object FishingWarning : FirmamentFeature {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun toDegrees(d: Double) = d * 180 / Math.PI
|
private fun toDegrees(d: Double) = d * 180 / Math.PI
|
||||||
|
private fun toRadians(d: Double) = d / 180 * Math.PI
|
||||||
|
|
||||||
fun isHookPossible(hook: FishingBobberEntity, particlePos: Vec3d, angle1: Double, angle2: Double): Boolean {
|
fun isHookPossible(hook: FishingBobberEntity, particlePos: Vec3d, angle1: Double, angle2: Double): Boolean {
|
||||||
val dx = particlePos.x - hook.pos.x
|
val dx = particlePos.x - hook.pos.x
|
||||||
@@ -104,6 +107,16 @@ object FishingWarning : FirmamentFeature {
|
|||||||
|
|
||||||
val recentParticles = mutableListOf<Pair<Vec3d, TimeMark>>()
|
val recentParticles = mutableListOf<Pair<Vec3d, TimeMark>>()
|
||||||
|
|
||||||
|
data class Candidate(
|
||||||
|
val angle1: Double,
|
||||||
|
val angle2: Double,
|
||||||
|
val hookOrigin: Vec3d,
|
||||||
|
val position: Vec3d,
|
||||||
|
val timeMark: TimeMark = TimeMark.now()
|
||||||
|
)
|
||||||
|
|
||||||
|
val recentCandidates = mutableListOf<Candidate>()
|
||||||
|
|
||||||
private fun onParticleSpawn(event: ParticleSpawnEvent) {
|
private fun onParticleSpawn(event: ParticleSpawnEvent) {
|
||||||
if (event.particleEffect.type != ParticleTypes.FISHING) return
|
if (event.particleEffect.type != ParticleTypes.FISHING) return
|
||||||
if (!(abs(event.offset.y - 0.01f) < 0.001f)) return
|
if (!(abs(event.offset.y - 0.01f) < 0.001f)) return
|
||||||
@@ -111,6 +124,7 @@ object FishingWarning : FirmamentFeature {
|
|||||||
val actualOffset = event.offset
|
val actualOffset = event.offset
|
||||||
val candidate1 = calculateAngleFromOffsets(actualOffset.x, -actualOffset.z)
|
val candidate1 = calculateAngleFromOffsets(actualOffset.x, -actualOffset.z)
|
||||||
val candidate2 = calculateAngleFromOffsets(-actualOffset.x, actualOffset.z)
|
val candidate2 = calculateAngleFromOffsets(-actualOffset.x, actualOffset.z)
|
||||||
|
recentCandidates.add(Candidate(candidate1, candidate2, hook.pos, event.position))
|
||||||
|
|
||||||
if (isHookPossible(hook, event.position, candidate1, candidate2)) {
|
if (isHookPossible(hook, event.position, candidate1, candidate2)) {
|
||||||
recentParticles.add(Pair(event.position, TimeMark.now()))
|
recentParticles.add(Pair(event.position, TimeMark.now()))
|
||||||
@@ -124,11 +138,22 @@ object FishingWarning : FirmamentFeature {
|
|||||||
}
|
}
|
||||||
WorldRenderLastEvent.subscribe {
|
WorldRenderLastEvent.subscribe {
|
||||||
recentParticles.removeIf { it.second.passedTime() > 5.seconds }
|
recentParticles.removeIf { it.second.passedTime() > 5.seconds }
|
||||||
|
recentCandidates.removeIf { it.timeMark.passedTime() > 5.seconds }
|
||||||
renderBlocks(it.matrices, it.camera) {
|
renderBlocks(it.matrices, it.camera) {
|
||||||
color(0f, 0f, 1f, 1f)
|
color(0f, 0f, 1f, 1f)
|
||||||
recentParticles.forEach {
|
recentParticles.forEach {
|
||||||
tinyBlock(it.first, 0.1F)
|
tinyBlock(it.first, 0.1F)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
recentCandidates.forEach {
|
||||||
|
println(it)
|
||||||
|
color(1f, 1f, 0f, 1f)
|
||||||
|
line(it.hookOrigin, it.position)
|
||||||
|
color(1f, 0f, 0f, 1f)
|
||||||
|
line(it.position, Vec3d.fromPolar(0F, it.angle1.toFloat()).add(it.position))
|
||||||
|
color(0f, 1f, 0f, 1f)
|
||||||
|
line(it.position, Vec3d.fromPolar(0F, it.angle2.toFloat()).add(it.position))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ class WFixedPanel() : WPanel() {
|
|||||||
set(value) {
|
set(value) {
|
||||||
children.clear()
|
children.clear()
|
||||||
setSize(0, 0)
|
setSize(0, 0)
|
||||||
|
value.parent = this
|
||||||
children.add(value)
|
children.add(value)
|
||||||
}
|
}
|
||||||
get() = children.single()
|
get() = children.single()
|
||||||
|
|||||||
@@ -21,10 +21,12 @@ package moe.nea.firmament.gui.config
|
|||||||
import io.github.cottonmc.cotton.gui.client.BackgroundPainter
|
import io.github.cottonmc.cotton.gui.client.BackgroundPainter
|
||||||
import io.github.cottonmc.cotton.gui.client.CottonClientScreen
|
import io.github.cottonmc.cotton.gui.client.CottonClientScreen
|
||||||
import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription
|
import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription
|
||||||
|
import io.github.cottonmc.cotton.gui.widget.WBox
|
||||||
import io.github.cottonmc.cotton.gui.widget.WButton
|
import io.github.cottonmc.cotton.gui.widget.WButton
|
||||||
import io.github.cottonmc.cotton.gui.widget.WGridPanel
|
import io.github.cottonmc.cotton.gui.widget.WGridPanel
|
||||||
import io.github.cottonmc.cotton.gui.widget.WLabel
|
import io.github.cottonmc.cotton.gui.widget.WLabel
|
||||||
import io.github.cottonmc.cotton.gui.widget.WListPanel
|
import io.github.cottonmc.cotton.gui.widget.WScrollPanel
|
||||||
|
import io.github.cottonmc.cotton.gui.widget.data.Axis
|
||||||
import io.github.cottonmc.cotton.gui.widget.data.Insets
|
import io.github.cottonmc.cotton.gui.widget.data.Insets
|
||||||
import io.ktor.http.*
|
import io.ktor.http.*
|
||||||
import net.minecraft.client.gui.screen.Screen
|
import net.minecraft.client.gui.screen.Screen
|
||||||
@@ -40,11 +42,11 @@ object AllConfigsGui {
|
|||||||
fun makeScreen(parent: Screen? = null): CottonClientScreen {
|
fun makeScreen(parent: Screen? = null): CottonClientScreen {
|
||||||
val lwgd = LightweightGuiDescription()
|
val lwgd = LightweightGuiDescription()
|
||||||
var screen: CottonClientScreen? = null
|
var screen: CottonClientScreen? = null
|
||||||
lwgd.setRootPanel(WListPanel(
|
val configs = listOf(
|
||||||
listOf(
|
RepoManager.Config
|
||||||
RepoManager.Config
|
) + FeatureManager.allFeatures.mapNotNull { it.config }
|
||||||
) + FeatureManager.allFeatures.mapNotNull { it.config }, ::WFixedPanel
|
val box = WBox(Axis.VERTICAL)
|
||||||
) { config, fixedPanel ->
|
configs.forEach { config ->
|
||||||
val panel = WGridPanel()
|
val panel = WGridPanel()
|
||||||
panel.insets = Insets.ROOT_PANEL
|
panel.insets = Insets.ROOT_PANEL
|
||||||
panel.backgroundPainter = BackgroundPainter.VANILLA
|
panel.backgroundPainter = BackgroundPainter.VANILLA
|
||||||
@@ -54,9 +56,12 @@ object AllConfigsGui {
|
|||||||
config.showConfigEditor(screen)
|
config.showConfigEditor(screen)
|
||||||
}
|
}
|
||||||
}, 0, 1, 10, 1)
|
}, 0, 1, 10, 1)
|
||||||
fixedPanel.child = panel
|
box.add(WFixedPanel(panel))
|
||||||
}.also {
|
}
|
||||||
it.setSize(10 * 18 + 14 + 16, 300)
|
box.insets = Insets.ROOT_PANEL
|
||||||
|
lwgd.setRootPanel(WScrollPanel((box)).also {
|
||||||
|
box.layout()
|
||||||
|
it.setSize(box.width + 8, MC.window.scaledHeight / 2)
|
||||||
})
|
})
|
||||||
screen = object : CottonClientScreen(lwgd) {
|
screen = object : CottonClientScreen(lwgd) {
|
||||||
override fun close() {
|
override fun close() {
|
||||||
|
|||||||
@@ -31,7 +31,9 @@ object MC {
|
|||||||
get() = MinecraftClient.getInstance().currentScreen
|
get() = MinecraftClient.getInstance().currentScreen
|
||||||
set(value) = MinecraftClient.getInstance().setScreen(value)
|
set(value) = MinecraftClient.getInstance().setScreen(value)
|
||||||
inline val handledScreen: HandledScreen<*>? get() = MinecraftClient.getInstance().currentScreen as? HandledScreen<*>
|
inline val handledScreen: HandledScreen<*>? get() = MinecraftClient.getInstance().currentScreen as? HandledScreen<*>
|
||||||
|
inline val window get() = MinecraftClient.getInstance().window
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
val Coordinate.blockPos: BlockPos
|
val Coordinate.blockPos: BlockPos
|
||||||
get() = BlockPos(x, y, z)
|
get() = BlockPos(x, y, z)
|
||||||
|
|||||||
@@ -23,11 +23,18 @@ import kotlin.time.ExperimentalTime
|
|||||||
import kotlin.time.TimeSource
|
import kotlin.time.TimeSource
|
||||||
|
|
||||||
@OptIn(ExperimentalTime::class)
|
@OptIn(ExperimentalTime::class)
|
||||||
class TimeMark private constructor(private val timeMark: TimeSource.Monotonic.ValueTimeMark?) {
|
class TimeMark private constructor(private val timeMark: TimeSource.Monotonic.ValueTimeMark?) : Comparable<TimeMark> {
|
||||||
fun passedTime() = timeMark?.elapsedNow() ?: Duration.INFINITE
|
fun passedTime() = timeMark?.elapsedNow() ?: Duration.INFINITE
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun now() = TimeMark(TimeSource.Monotonic.markNow())
|
fun now() = TimeMark(TimeSource.Monotonic.markNow())
|
||||||
fun farPast() = TimeMark(null)
|
fun farPast() = TimeMark(null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun compareTo(other: TimeMark): Int {
|
||||||
|
if (this.timeMark == other.timeMark) return 0
|
||||||
|
if (this.timeMark == null) return -1
|
||||||
|
if (other.timeMark == null) return -1
|
||||||
|
return this.timeMark.compareTo(other.timeMark)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,9 @@ import net.minecraft.client.gl.VertexBuffer
|
|||||||
import net.minecraft.client.render.BufferBuilder
|
import net.minecraft.client.render.BufferBuilder
|
||||||
import net.minecraft.client.render.Camera
|
import net.minecraft.client.render.Camera
|
||||||
import net.minecraft.client.render.GameRenderer
|
import net.minecraft.client.render.GameRenderer
|
||||||
|
import net.minecraft.client.render.RenderLayer
|
||||||
import net.minecraft.client.render.Tessellator
|
import net.minecraft.client.render.Tessellator
|
||||||
|
import net.minecraft.client.render.VertexConsumerProvider
|
||||||
import net.minecraft.client.render.VertexFormat
|
import net.minecraft.client.render.VertexFormat
|
||||||
import net.minecraft.client.render.VertexFormats
|
import net.minecraft.client.render.VertexFormats
|
||||||
import net.minecraft.client.util.math.MatrixStack
|
import net.minecraft.client.util.math.MatrixStack
|
||||||
@@ -33,6 +35,7 @@ import net.minecraft.util.math.Vec3d
|
|||||||
|
|
||||||
class RenderBlockContext private constructor(private val tesselator: Tessellator, private val matrixStack: MatrixStack) {
|
class RenderBlockContext private constructor(private val tesselator: Tessellator, private val matrixStack: MatrixStack) {
|
||||||
private val buffer = tesselator.buffer
|
private val buffer = tesselator.buffer
|
||||||
|
|
||||||
fun color(red: Float, green: Float, blue: Float, alpha: Float) {
|
fun color(red: Float, green: Float, blue: Float, alpha: Float) {
|
||||||
RenderSystem.setShaderColor(red, green, blue, alpha)
|
RenderSystem.setShaderColor(red, green, blue, alpha)
|
||||||
}
|
}
|
||||||
@@ -55,6 +58,10 @@ class RenderBlockContext private constructor(private val tesselator: Tessellator
|
|||||||
matrixStack.pop()
|
matrixStack.pop()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun line(vararg points: Vec3d, size: Double = 2.0) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private fun buildCube(matrix: Matrix4f, buf: BufferBuilder) {
|
private fun buildCube(matrix: Matrix4f, buf: BufferBuilder) {
|
||||||
buf.begin(VertexFormat.DrawMode.TRIANGLES, VertexFormats.POSITION_COLOR)
|
buf.begin(VertexFormat.DrawMode.TRIANGLES, VertexFormats.POSITION_COLOR)
|
||||||
|
|||||||
Reference in New Issue
Block a user