Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
30b8a5b
chore: kill 1.21.5 and 1.21.8
meowora Feb 3, 2026
fa0e734
Merge branch '4.0' into chore/kill-1.21.5-and-.8
meowora Feb 3, 2026
43f0ade
try 26.1
j10a1n15 Feb 4, 2026
e8be242
death
meowora Feb 4, 2026
10eff18
stuff
meowora Feb 4, 2026
6633042
26.1
meowora Feb 4, 2026
a810023
weird stuff
j10a1n15 Feb 5, 2026
03633d0
mroe
meowora Feb 21, 2026
0940bc3
bump foojay
j10a1n15 Feb 22, 2026
468a813
idek
j10a1n15 Feb 22, 2026
211f296
fix: not importing 26.1 correctly
meowora Feb 22, 2026
b2f3c43
port stuff
j10a1n15 Feb 23, 2026
37c3000
version deprecated code
j10a1n15 Feb 23, 2026
35c5065
fix stuff
j10a1n15 Feb 23, 2026
110a739
a bit more
j10a1n15 Feb 23, 2026
fc1e6ce
formatting
j10a1n15 Feb 23, 2026
0cee0cb
more stuff
j10a1n15 Feb 24, 2026
d1ad273
Merge branch '4.0' into chore/kill-1.21.5-and-.8
j10a1n15 Mar 1, 2026
4467d89
bump sc
j10a1n15 Mar 1, 2026
4b69a20
fixes
j10a1n15 Mar 1, 2026
4f11df2
even more fixes
j10a1n15 Mar 1, 2026
3abef5e
snap 11 in a way
j10a1n15 Mar 3, 2026
f90066c
Merge branch '4.0' into chore/kill-1.21.5-and-.8
j10a1n15 Mar 11, 2026
5a1883e
bump to pre1
j10a1n15 Mar 11, 2026
c014958
feat: finish porting
meowora Mar 11, 2026
0059191
feat: finish porting
meowora Mar 12, 2026
4935e7a
chore: enable explicit api warning
meowora Mar 12, 2026
8d5e894
fix: mixin not working in older versions
meowora Mar 12, 2026
46c4f14
chore: some changes
meowora Mar 12, 2026
1975bc4
chore: update baseline updater
meowora Mar 12, 2026
3a4608c
chore: update baselines (remove mixins)
meowora Mar 12, 2026
73355e8
chore: remove invariant values
meowora Mar 12, 2026
a21bc12
fix: requested changes
meowora Mar 12, 2026
2387821
fix: wrong return type
meowora Mar 12, 2026
c1aea7c
chore: kill McLevel#self and McLevel#level due to them returning unsa…
meowora Mar 18, 2026
73a2254
Merge branch '4.0' into chore/kill-1.21.5-and-.8
meowora Mar 19, 2026
21b14c5
not building
meowora Mar 19, 2026
b672377
dedupe a ton more of stuff
meowora Mar 19, 2026
5c3a29a
fix: im a silly billy
meowora Mar 19, 2026
4d6f0aa
rc1
meowora Mar 20, 2026
07d3f06
mroe stuffffffffff owo
meowora Mar 20, 2026
81cd4aa
woowie
meowora Mar 20, 2026
7310cc5
fix: publishing
meowora Mar 20, 2026
142753e
fix: stackoverflow
meowora Mar 22, 2026
6f566eb
feat: McClient.anyModInstalled
j10a1n15 Mar 24, 2026
888cee0
chore: 26.1
meowora Mar 24, 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
2 changes: 1 addition & 1 deletion .github/workflows/breaking-changes-baseline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ jobs:
run: ./gradlew build

- name: Build with Gradle
run: ./gradlew apiDump || true
run: ./gradlew updateLegacyAbi || true

- name: Compare changes
run: git diff | grep "^+[^+]" >> api.added || true
Expand Down
29 changes: 12 additions & 17 deletions .github/workflows/breaking-changes.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,28 +14,23 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v5

- name: Setup JDK 21
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'temurin'
- name: Setup JDK 21
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'temurin'

- name: Setup gradle
uses: gradle/actions/setup-gradle@v5
- name: Setup gradle
uses: gradle/actions/setup-gradle@v5
- run: chmod +x gradlew

- run: chmod +x gradlew
- name: Build
run: ./gradlew build

- name: Build with Gradle
run: ./gradlew apiDump || true

- name: Compare API
run: git diff | grep "^-[^-]" >> api.removed || true
- name: Build with Gradle
run: ./gradlew checkLegacyAbi 2>&1 >/dev/null >> api.removed

- name: Check for breaking changes
if: always()
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
Expand Down
204 changes: 5 additions & 199 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,227 +1,33 @@
@file:Suppress("UnstableApiUsage")

import com.google.devtools.ksp.gradle.KspAATask
import net.fabricmc.loom.task.RemapJarTask
import net.fabricmc.loom.task.ValidateAccessWidenerTask
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
idea
id("fabric-loom")
kotlin("jvm")
alias(libs.plugins.kotlin.symbol.processor)
alias(libs.plugins.meowdding.resources)
alias(libs.plugins.meowdding.auto.mixins)
//alias(libs.plugins.detekt)
`versioned-catalogues`
`item-data`
}

repositories {
fun scopedMaven(url: String, vararg paths: String) = maven(url) { content { paths.forEach(::includeGroupAndSubgroups) } }

scopedMaven("https://pkgs.dev.azure.com/djtheredstoner/DevAuth/_packaging/public/maven/v1", "me.djtheredstoner")
scopedMaven("https://repo.hypixel.net/repository/Hypixel", "net.hypixel")
scopedMaven("https://maven.parchmentmc.org/", "org.parchmentmc")
scopedMaven("https://api.modrinth.com/maven", "maven.modrinth")
scopedMaven(
"https://maven.teamresourceful.com/repository/maven-public/",
"earth.terrarium",
"com.teamresourceful",
"tech.thatgravyboat",
"me.owdding",
"com.terraformersmc"
)
scopedMaven("https://maven.nucleoid.xyz/", "eu.pb4")
mavenCentral()
}

dependencies {
minecraft(versionedCatalog["minecraft"])
mappings(loom.layered {
officialMojangMappings()
parchment(variantOf(versionedCatalog["parchment"]) {
artifactType("zip")
})
})

compileOnly(project(":annotations"))
compileOnly(libs.bundles.meowdding)
ksp(libs.bundles.meowdding)

modImplementation(libs.fabric.language.kotlin)

api(libs.meowdding.item.dfu) {
capabilities { requireCapability("me.owdding:item-data-fixer-${stonecutter.current.version}") }
}
include(libs.meowdding.item.dfu) {
capabilities { requireCapability("me.owdding:item-data-fixer-${stonecutter.current.version}-remapped") }
}

api(libs.hypixel.modapi)
modImplementation(libs.bundles.hypixel)
include(libs.hypixel.modapi.fabric)

modApi(libs.skyblockapi.repolib)
include(libs.skyblockapi.repolib)

if(stonecutter.eval(stonecutter.current.version, ">=1.21.11")) {
// TODO https://github.com/DJtheRedstoner/DevAuth/issues/24
runtimeOnly("org.apache.httpcomponents:httpclient:4.5.14")
runtimeOnly("org.apache.httpcomponents:httpcore:4.4.16")
}
modRuntimeOnly(libs.devauth)

modImplementation(versionedCatalog["fabric.api"])
modImplementation(libs.fabric.language.kotlin)
modImplementation(libs.fabric.loader)
id("net.fabricmc.fabric-loom")
`sbapi-setup`
}

val mcVersion = stonecutter.current.version.replace(".", "")
val accessWidenerFile = rootProject.file("src/sbapi.accesswidener")

loom {
runConfigs["client"].apply {
ideConfigGenerated(true)
runDir = "../../run"
vmArg("-Dfabric.modsFolder=" + '"' + "${mcVersion}Mods" + '"')
vmArg("-Dfabric.modsFolder=\"${mcVersion}Mods\"")
}

if (accessWidenerFile.exists()) {
accessWidenerPath.set(accessWidenerFile)
}
}

afterEvaluate {

tasks.withType(KspAATask::class.java).configureEach {
kspConfig.processorOptions.put(
"meowdding.project_name",
"SkyBlockAPI" + (kspConfig.cachesDir.get().asFile.name.takeUnless { it == "main" }?.let { "Versioned" } ?: "")
)
}
}

java {
toolchain.languageVersion = JavaLanguageVersion.of(21)
withSourcesJar()
}

val archiveName = "skyblock-api"

tasks.named("build") {
doLast {
val sourceFile = rootProject.projectDir.resolve("versions/${project.name}/build/libs/${archiveName}-$version-${stonecutter.current.version}.jar")
val targetFile = rootProject.projectDir.resolve("build/libs/${archiveName}-$version-${stonecutter.current.version}.jar")
targetFile.parentFile.mkdirs()
targetFile.writeBytes(sourceFile.readBytes())
}
}

compactingResources {
basePath = "repo"
pathDirectory = "../../src"

configureTask(tasks.named<AbstractCopyTask>("processResources").get())

removeComments("skyblockid/unobtainable_ids")
substituteFromDifferentFile("slayer", "slayers")
}

tasks.withType<JavaCompile>().configureEach {
options.encoding = "UTF-8"
options.release.set(21)
}

tasks.withType<KotlinCompile>().configureEach {
compilerOptions.jvmTarget.set(JvmTarget.JVM_21)
compilerOptions.optIn.add("kotlin.time.ExperimentalTime")
compilerOptions.freeCompilerArgs.addAll(
"-Xcontext-parameters",
"-Xcontext-sensitive-resolution",
"-Xnullability-annotations=@org.jspecify.annotations:ignore"
)
}

tasks.processResources {
val replacements = mapOf(
"version" to version,
"minecraft_start" to versionedCatalog.versions.getOrFallback("minecraft.start", "minecraft"),
"minecraft_end" to versionedCatalog.versions.getOrFallback("minecraft.end", "minecraft"),
"fabric_lang_kotlin" to libs.versions.fabric.language.kotlin.get(),
"hypixel_mod_api" to libs.versions.hypixel.modapi.fabric.get(),
"fabric_loader" to libs.versions.fabric.loader.get(),
)
inputs.properties(replacements)

filesMatching("fabric.mod.json") {
expand(replacements)
}
}

tasks.withType<ProcessResources>().configureEach {
with(copySpec {
from(accessWidenerFile)
})
}

idea {
module {
isDownloadJavadoc = true
isDownloadSources = true

excludeDirs.add(file("run"))
}
}

tasks.withType<ValidateAccessWidenerTask> { enabled = false }

tasks.withType<Jar> {
duplicatesStrategy = DuplicatesStrategy.INCLUDE
}

tasks.apiCheck {
enabled = false
}

tasks.processResources {
filteringCharset = "UTF-8"
}

tasks.withType<JavaCompile>().configureEach {
options.encoding = "UTF-8"
options.release.set(21)
}

tasks.withType<KotlinCompile>().configureEach {
compilerOptions.jvmTarget.set(JvmTarget.JVM_21)
}

ksp {
arg("meowdding.modules.project_name", "SkyblockAPI")
arg("meowdding.modules.package", "tech.thatgravyboat.skyblockapi.generated")
arg("meowdding.codecs.project_name", "SkyblockAPI")
arg("meowdding.codecs.package", "tech.thatgravyboat.skyblockapi.generated")
}

autoMixins {
mixinPackage = "tech.thatgravyboat.skyblockapi.mixins"
projectName = "skyblock-api"
mixinExtrasVersion = "0.5.0"
}

base {
archivesName = archiveName
}

tasks.named<Jar>("jar") {
archiveClassifier = "${stonecutter.current.version}-dev"
archiveClassifier = stonecutter.current.version
}

tasks.named<Jar>("sourcesJar") {
archiveClassifier = "${stonecutter.current.version}-sources"
}

tasks.named<RemapJarTask>("remapJar") {
archiveClassifier = stonecutter.current.version
}
48 changes: 48 additions & 0 deletions build.obf.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
@file:Suppress("UnstableApiUsage")

import net.fabricmc.loom.task.RemapJarTask
import net.fabricmc.loom.task.ValidateAccessWidenerTask

plugins {
id("net.fabricmc.fabric-loom-remap")
`sbapi-setup`
}

val mcVersion = stonecutter.current.version.replace(".", "")
val accessWidenerFile = rootProject.file("src/sbapi.accesswidener")

loom {
runConfigs["client"].apply {
ideConfigGenerated(true)
runDir = "../../run"
vmArg("-Dfabric.modsFolder=\"${mcVersion}Mods\"")
}

if (accessWidenerFile.exists()) {
accessWidenerPath.set(accessWidenerFile)
}
}

dependencies {
mappings(loom.layered {
officialMojangMappings()
parchment(variantOf(versionedCatalog["parchment"]) {
artifactType("zip")
})
})
}

tasks.withType<ValidateAccessWidenerTask> { enabled = false }


tasks.named<Jar>("jar") {
archiveClassifier = stonecutter.current.version
}

tasks.named<RemapJarTask>("remapJar") {
archiveClassifier = "${stonecutter.current.version}-remapped"
}

tasks.named<Jar>("sourcesJar") {
archiveClassifier = "${stonecutter.current.version}-sources"
}
12 changes: 9 additions & 3 deletions buildSrc/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
plugins {
alias(libs.plugins.kotlin.jvm) version (libs.versions.kotlin.asProvider())
`kotlin-dsl`
`java-gradle-plugin`
}

repositories {
Expand All @@ -10,11 +8,19 @@ repositories {
maven("https://maven.teamresourceful.com/repository/maven-public/")
}

fun plugin(provider: Provider<PluginDependency>): Provider<String> = provider.map {
"${it.pluginId}:${it.pluginId}.gradle.plugin:${it.version}"
}

dependencies {
implementation(libs.kotlin.stdlib)
implementation(libs.bundles.kotlin.gradle.plugin)
implementation(libs.google.gson)
implementation(libs.meowdding.resources)
implementation(plugin(libs.plugins.kotlin.symbol.processor))
implementation(plugin(libs.plugins.meowdding.resources))
implementation(plugin(libs.plugins.meowdding.auto.mixins))
implementation(plugin(libs.plugins.kotlin.binary.compatibility.validator))
implementation("dev.kikugie.stonecutter:dev.kikugie.stonecutter.gradle.plugin:0.8.3")
}

gradlePlugin {
Expand Down
9 changes: 6 additions & 3 deletions buildSrc/src/main/kotlin/root.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,17 @@ import org.gradle.api.artifacts.VersionCatalog
import org.gradle.api.artifacts.VersionConstraint
import org.gradle.api.provider.Provider
import org.gradle.plugin.use.PluginDependency
import java.util.Optional
import java.util.*

data class ForwardingVersionCatalog(
val catalogs: List<VersionCatalog>,
) {
constructor(vararg catalogs: VersionCatalog) : this(listOf(*catalogs))

private fun <T> first(name: String, lookup: VersionCatalog.(String) -> Optional<T>): T {
return catalogs.firstNotNullOf { it.lookup(name).orElse(null) }
private fun <T> first(name: String, lookup: VersionCatalog.(String) -> Optional<T>): T = try {
catalogs.firstNotNullOf { it.lookup(name).orElse(null) }
} catch (e: Exception) {
throw RuntimeException(catalogs.joinToString(", ") { it.name } + " - " + name, e)
}

val libraries: ForwardingProperty<Provider<MinimalExternalModuleDependency>> = ForwardingProperty(this, VersionCatalog::findLibrary)
Expand All @@ -32,6 +34,7 @@ data class ForwardingVersionCatalog(
val parent: ForwardingVersionCatalog,
val lookup: VersionCatalog.(String) -> Optional<T>,
) {
fun has(name: String): Boolean = runCatching { get(name) }.map { true }.getOrDefault(false)
operator fun get(name: String): T = parent.first(name, lookup)
fun getOrFallback(
name: String,
Expand Down
Loading
Loading