Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
e89649c
changes
beanbag44 Jul 29, 2026
d1e8e9d
right click categories
beanbag44 Jul 29, 2026
d6f7437
better theming, grid snapping (todo, make it optional or activated by…
beanbag44 Jul 29, 2026
0673ea5
adds macos support
PoTheMagicDragon Jul 29, 2026
b438c1f
Adds fix for compose watching data
PoTheMagicDragon Jul 30, 2026
1139fc9
resources and menu bar with lambda image
beanbag44 Jul 30, 2026
f1906fd
Incorporates material theme
PoTheMagicDragon Jul 30, 2026
7cde5ab
Merge remote-tracking branch 'origin/keep-your-compose-ure-vibe' into…
PoTheMagicDragon Jul 30, 2026
ba8b99f
theme now matches system light vs dark
PoTheMagicDragon Jul 30, 2026
8c2f639
fix rounded corner clipping, add basic Style module; not used in any …
beanbag44 Jul 30, 2026
2b7a898
theme settings
beanbag44 Jul 31, 2026
d9771ee
basic settings panel
beanbag44 Aug 1, 2026
e2ecd72
basic setting implementations
beanbag44 Aug 2, 2026
83edae3
glow
beanbag44 Aug 2, 2026
10f8585
fixes width on enum settings
PoTheMagicDragon Aug 2, 2026
8ca390e
Adds in automation and module configs
PoTheMagicDragon Aug 2, 2026
42af68a
Adds padding between settings with backgrounds
PoTheMagicDragon Aug 2, 2026
e3bee14
Hides empty dropdowns
PoTheMagicDragon Aug 2, 2026
ffc2ee1
Outlines instead of highlights selected modules
PoTheMagicDragon Aug 2, 2026
ee77ba6
updates rounding
PoTheMagicDragon Aug 2, 2026
dab15e6
KColorSetting gui impl and fix for overlapping setting panels
beanbag44 Aug 3, 2026
293ae47
adds blur background
PoTheMagicDragon Aug 3, 2026
9b68c80
Merge remote-tracking branch 'origin/keep-your-compose-ure-vibe' into…
PoTheMagicDragon Aug 3, 2026
5c96c8f
Fixes constraints/ scrolling for long settings panels
PoTheMagicDragon Aug 3, 2026
f12538b
Fixes first window load junk render
PoTheMagicDragon Aug 3, 2026
ca032e7
Fixes multi layer blur
PoTheMagicDragon Aug 3, 2026
858ea2d
use observe function for settings rather than an inbuilt function. Le…
beanbag44 Aug 3, 2026
7e4fa66
lower opacity default colors
beanbag44 Aug 3, 2026
0e17971
Bumps fps with blur
PoTheMagicDragon Aug 3, 2026
48c7418
blur changes and new color setting
beanbag44 Aug 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 73 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,30 @@ val lwjglVersion: String by project
val sodiumVersion: String by project
val litematicaVersion: String by project
val maLiLibVersion: String by project
val composeVersion: String by project
val skikoVersion: String by project

// Skiko publishes its natives as one artifact per platform, and none of them are pulled in
// transitively by Compose. Dev runs only need the host's, so resolve that here.
// TODO: production jars need every target bundled, or downloaded at runtime.
val skikoTarget = run {
val osName = System.getProperty("os.name").lowercase()
val archName = System.getProperty("os.arch").lowercase()

val os = when {
osName.startsWith("windows") -> "windows"
osName.startsWith("mac") || osName.contains("darwin") -> "macos"
osName.contains("linux") -> "linux"
else -> throw GradleException("No skiko natives for host OS '$osName'")
}
val arch = when (archName) {
"x86_64", "amd64" -> "x64"
"aarch64", "arm64" -> "arm64"
else -> throw GradleException("No skiko natives for host architecture '$archName'")
}

"$os-$arch"
}

val libs = file("libs")
val targets = listOf("fabric.mod.json")
Expand All @@ -46,6 +70,8 @@ val replacements = file("gradle.properties").inputStream().use { stream ->

plugins {
kotlin("jvm") version "2.3.0"
kotlin("plugin.compose") version "2.3.0"
id("org.jetbrains.compose") version "1.7.0"
id("org.jetbrains.dokka") version "2.1.0"
id("fabric-loom") version "1.16-SNAPSHOT"
id("com.gradleup.shadow") version "9.3.0"
Expand All @@ -63,6 +89,11 @@ configurations.all {
if (requested.group == "org.lwjgl") {
useVersion(lwjglVersion)
}
// The native artifact and the classes Compose pulls in transitively must agree,
// or skiko fails to find its library at runtime
if (requested.group == "org.jetbrains.skiko") {
useVersion(skikoVersion)
}
}
}

Expand All @@ -72,6 +103,8 @@ repositories {
maven("https://maven.2b2t.vc/releases") // Baritone
maven("https://jitpack.io") // KDiscordIPC
maven("https://api.modrinth.com/maven")
maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") // Compose Multiplatform
google() // AndroidX dependencies (transitive from Compose)
mavenCentral()

// Allow the use of local libraries
Expand Down Expand Up @@ -111,6 +144,12 @@ loom {
property("org.lwjgl.util.DebugFunctions", "true")
property("mixin.debug.export", "true")

// Skia refuses to initialise on macOS without both of these
if (skikoTarget.startsWith("macos")) {
property("skiko.renderApi", "OPENGL")
property("skiko.macos.opengl.enabled", "true")
}

vmArgs("-XX:+HeapDumpOnOutOfMemoryError", "-XX:+CreateCoredumpOnCrash")
programArgs("--username", "Steve", "--uuid", "8667ba71b85a4004af54457a9734eed7", "--accessToken", "****")
}
Expand Down Expand Up @@ -187,6 +226,31 @@ dependencies {
modCompileOnly("maven.modrinth:malilib:$maLiLibVersion")
modCompileOnly("maven.modrinth:litematica:$litematicaVersion")

shadowLib("org.jetbrains.compose.runtime:runtime-desktop:$composeVersion") {
exclude(group = "org.jetbrains.kotlin")
exclude(group = "org.jetbrains.kotlinx")
exclude(group = "org.jetbrains.skiko")
}
shadowLib("org.jetbrains.compose.ui:ui-desktop:$composeVersion") {
exclude(group = "org.jetbrains.kotlin")
exclude(group = "org.jetbrains.kotlinx")
exclude(group = "org.jetbrains.skiko")
}
shadowLib("org.jetbrains.compose.foundation:foundation-desktop:$composeVersion") {
exclude(group = "org.jetbrains.kotlin")
exclude(group = "org.jetbrains.kotlinx")
exclude(group = "org.jetbrains.skiko")
}
shadowLib("org.jetbrains.compose.material3:material3-desktop:$composeVersion") {
exclude(group = "org.jetbrains.kotlin")
exclude(group = "org.jetbrains.kotlinx")
exclude(group = "org.jetbrains.skiko")
}

shadowLib("org.jetbrains.skiko:skiko-awt-runtime-$skikoTarget:$skikoVersion")

implementation(compose.components.resources)

// DevLogin
modRuntimeOnly("com.ptsmods:devlogin:3.5")

Expand All @@ -198,6 +262,14 @@ dependencies {
setupConfigurations()
}

compose.resources {
customDirectory(
"main",
provider { layout.projectDirectory.dir("src/main/resources/assets/lambda/compose/") }
)
packageOfResClass = "com.lambda.newui"
}

tasks {
test {
useJUnitPlatform()
Expand Down Expand Up @@ -260,7 +332,7 @@ publishing {

repositories {
maven(mavenUrl) {
name = "lambda-reposilite"
name = "lambda-maven"

credentials {
username = project.findProperty("mavenUsername").toString()
Expand Down
5 changes: 4 additions & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ modId=lambda
modName=Lambda
modVersion=0.1.0
modDescription=Minecraft utility mod for automation
modIcon=assets/lambda/textures/lambda.png
modIcon=assets/lambda/compose/drawable/lambda.png
mavenGroup=com.lambda
modAuthors=Constructor (Avanatiker), Blade, beanbag44, Emy

Expand All @@ -38,6 +38,9 @@ ktorVersion=3.3.3
jacksonVersion=3.1.1
mockkVersion=1.14.7
spairVersion=1.90.0
composeVersion=1.8.0
# Must match the skiko version Compose depends on transitively
skikoVersion=0.9.4

# Fabric https://fabricmc.net/develop/
fabricLoaderVersion=0.18.3
Expand Down
1 change: 1 addition & 0 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ pluginManagement {
repositories {
maven("https://maven.fabricmc.net/")
maven("https://jitpack.io")
maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
mavenCentral()
gradlePluginPortal()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@

@Mixin(value = ConnectScreen.class)
public class ConnectScreenMixin {

@Inject(method = "connect(Lnet/minecraft/client/MinecraftClient;Lnet/minecraft/client/network/ServerAddress;Lnet/minecraft/client/network/ServerInfo;Lnet/minecraft/client/network/CookieStorage;)V", at= @At("HEAD"))
private void connectHead(MinecraftClient client, ServerAddress address, ServerInfo info, CookieStorage cookieStorage, CallbackInfo ci) {
AutoDisconnect.INSTANCE.setLastReconnectTarget(new MultiplayerReconnectTarget(address, info, cookieStorage));
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/com/lambda/mixin/render/SplashOverlayMixin.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public class SplashOverlayMixin {

@Inject(method = "<init>", at = @At("RETURN"))
private void onInit(CallbackInfo ci) {
LOGO = Identifier.of("lambda", "textures/lambda_banner.png");
LOGO = Identifier.of("lambda", "compose/drawable/lambda_banner.png");
}

@WrapOperation(method = "render", at = @At(value = "INVOKE", target = "Ljava/util/function/IntSupplier;getAsInt()I"))
Expand All @@ -61,7 +61,7 @@ public LogoTextureMixin(Identifier location) {

@WrapOperation(method = "loadContents", at = @At(value = "INVOKE", target = "Lnet/minecraft/resource/ResourceFactory;open(Lnet/minecraft/util/Identifier;)Ljava/io/InputStream;"))
InputStream wrapLoadTextureData(ResourceFactory instance, Identifier id, Operation<InputStream> original) {
return LambdaResourceKt.getStream("textures/lambda_banner.png");
return LambdaResourceKt.getStream("compose/drawable/lambda_banner.png");
}
}
}
14 changes: 12 additions & 2 deletions src/main/kotlin/com/lambda/config/Config.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

package com.lambda.config

import androidx.compose.ui.graphics.Color
import com.lambda.Lambda.typeFactory
import com.lambda.config.ConfigLoader.configs
import com.lambda.config.entries.ConfigEntryDsl
Expand All @@ -39,6 +40,7 @@ import com.lambda.config.settings.complex.Bind
import com.lambda.config.settings.complex.BlockPosSetting
import com.lambda.config.settings.complex.BlockSetting
import com.lambda.config.settings.complex.ColorSetting
import com.lambda.config.settings.complex.KColorSetting
import com.lambda.config.settings.complex.KeybindSetting
import com.lambda.config.settings.complex.Vec3dSetting
import com.lambda.config.settings.numeric.DoubleSetting
Expand All @@ -55,11 +57,11 @@ import net.minecraft.item.Item
import net.minecraft.registry.Registries
import net.minecraft.util.math.BlockPos
import net.minecraft.util.math.Vec3d
import java.awt.Color
import kotlin.reflect.KClass
import kotlin.reflect.KProperty
import kotlin.reflect.full.declaredMemberProperties
import kotlin.reflect.jvm.javaField
import java.awt.Color as JColor

/**
* Represents a set of [EntryCore]s that are associated with the [name] of the [Config].
Expand Down Expand Up @@ -347,11 +349,19 @@ abstract class Config(
@ConfigEntryDsl
fun setting(
name: String,
defaultValue: Color,
defaultValue: JColor,
description: String = "",
visibility: () -> Boolean = { true }
) = setting(name) { layer -> ColorSetting(name, description, this, layer, visibility, defaultValue) }

@ConfigEntryDsl
fun setting(
name: String,
defaultValue: Color,
description: String = "",
visibility: () -> Boolean = { true }
) = setting(name) { layer -> KColorSetting(name, description, this, layer, visibility, defaultValue) }

@ConfigEntryDsl
fun setting(
name: String,
Expand Down
7 changes: 5 additions & 2 deletions src/main/kotlin/com/lambda/config/entries/Setting.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@

package com.lambda.config.entries

import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Composable
import com.lambda.Lambda.mapper
import com.lambda.brigadier.CommandResult.Companion.failure
import com.lambda.brigadier.CommandResult.Companion.success
Expand All @@ -32,7 +34,6 @@ import com.lambda.config.EntryCore
import com.lambda.config.EntryLayer
import com.lambda.config.MultipleLayerType
import com.lambda.context.SafeContext
import com.lambda.gui.dsl.ImGuiBuilder
import com.lambda.threading.runSafe
import com.lambda.util.CommunicationUtils.info
import com.lambda.util.Describable
Expand Down Expand Up @@ -142,7 +143,9 @@ abstract class Setting<T>(
core = originalCore
}

abstract fun ImGuiBuilder.buildLayout()
@ExperimentalMaterial3Api
@Composable
abstract fun gui()

open fun CommandBuilder.buildCommand(registry: CommandRegistryAccess) {
required(string("value as JSON")) { value ->
Expand Down
7 changes: 5 additions & 2 deletions src/main/kotlin/com/lambda/config/settings/CharSetting.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@

package com.lambda.config.settings

import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Composable
import com.lambda.brigadier.CommandResult.Companion.failure
import com.lambda.brigadier.CommandResult.Companion.success
import com.lambda.brigadier.argument.value
Expand All @@ -26,7 +28,6 @@ import com.lambda.brigadier.required
import com.lambda.config.Config
import com.lambda.config.entries.Setting
import com.lambda.config.entries.SettingEntryLayer
import com.lambda.gui.dsl.ImGuiBuilder
import com.lambda.util.extension.CommandBuilder
import net.minecraft.command.CommandRegistryAccess

Expand All @@ -41,7 +42,9 @@ class CharSetting(
defaultValue: Char,
visibility: () -> Boolean
) : Setting<Char>(name, description, defaultValue, layer, config, visibility) {
override fun ImGuiBuilder.buildLayout() {}
@ExperimentalMaterial3Api
@Composable
override fun gui() {}

override fun CommandBuilder.buildCommand(registry: CommandRegistryAccess) {
required(word(name)) { parameter ->
Expand Down
44 changes: 39 additions & 5 deletions src/main/kotlin/com/lambda/config/settings/FunctionSetting.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,24 @@

package com.lambda.config.settings

import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Button
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.lambda.config.Config
import com.lambda.config.entries.Setting
import com.lambda.config.entries.SettingEntryLayer
import com.lambda.gui.dsl.ImGuiBuilder
import com.lambda.newui.theme.Radius

class FunctionSetting<T : () -> R, R>(
name: String,
Expand All @@ -30,8 +44,28 @@ class FunctionSetting<T : () -> R, R>(
layer: SettingEntryLayer<FunctionSetting<T, R>, T>,
visibility: () -> Boolean
) : Setting<T>(name, description, defaultValue, layer, config, visibility) {
override fun ImGuiBuilder.buildLayout() {
button(name) { value() }
lambdaTooltip(description)
}
@ExperimentalMaterial3Api
@Composable
override fun gui() {
Box(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 4.dp, vertical = 1.dp),
contentAlignment = Alignment.Center
) {
Button(
onClick = { value() },
modifier = Modifier
.fillMaxWidth()
.height(24.dp),
shape = RoundedCornerShape(Radius.Small),
contentPadding = PaddingValues(0.dp)
) {
Text(
text = name,
fontSize = 9.sp
)
}
}
}
}
Loading