1
0
mirror of https://github.com/chylex/Better-Controls.git synced 2025-09-13 11:32:12 +02:00

4 Commits

16 changed files with 166 additions and 72 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -6,7 +6,7 @@
"version": "${version}", "version": "${version}",
"license": "${license}", "license": "${license}",
"icon": "assets/bettercontrols/icon.png", "icon": "assets/${id}/logo.png",
"authors": [ "authors": [
"${author}" "${author}"

View File

@@ -18,7 +18,7 @@ runs {
jvmArguments(runJvmArgs) jvmArguments(runJvmArgs)
} }
create("client") removeIf { it.name != "client" }
} }
tasks.processResources { tasks.processResources {

View File

@@ -11,7 +11,7 @@ displayURL = "${sourcesURL}"
description = "${description}" description = "${description}"
authors = "${author}" authors = "${author}"
version = "${version}" version = "${version}"
logoFile = "icon.png" logoFile = "assets/${id}/logo.png"
[[mixins]] [[mixins]]
config = "${id}.mixins.json" config = "${id}.mixins.json"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -1,6 +1,6 @@
@file:Suppress("ConvertLambdaToReference") @file:Suppress("ConvertLambdaToReference")
import org.gradle.api.file.DuplicatesStrategy.EXCLUDE import org.gradle.jvm.tasks.Jar
val modId: String by project val modId: String by project
val modName: String by project val modName: String by project
@@ -24,7 +24,7 @@ val jarVersion = "$minecraftVersion+v$modVersion"
plugins { plugins {
idea idea
`java-library` `java-library`
id("net.neoforged.gradle.vanilla") id("fabric-loom")
} }
idea { idea {
@@ -46,18 +46,26 @@ repositories {
mavenCentral() mavenCentral()
} }
dependencies {
implementation("net.minecraft:client:$minecraftVersion")
compileOnly("net.fabricmc:sponge-mixin:$mixinVersion")
api("com.google.code.findbugs:jsr305:3.0.2")
}
base { base {
archivesName.set("$modNameStripped-Common") archivesName.set("$modNameStripped-Common")
} }
runs { loom {
clear() runs {
named("client") {
ideConfigGenerated(false)
}
findByName("server")?.let(::remove)
}
}
dependencies {
minecraft("com.mojang:minecraft:$minecraftVersion")
mappings(loom.officialMojangMappings())
compileOnly("net.fabricmc:sponge-mixin:$mixinVersion")
api("com.google.code.findbugs:jsr305:3.0.2")
} }
allprojects { allprojects {
@@ -66,10 +74,6 @@ allprojects {
apply(plugin = "java-library") apply(plugin = "java-library")
dependencies {
implementation("org.jetbrains:annotations:24.1.0")
}
extensions.getByType<JavaPluginExtension>().apply { extensions.getByType<JavaPluginExtension>().apply {
toolchain.languageVersion.set(JavaLanguageVersion.of(21)) toolchain.languageVersion.set(JavaLanguageVersion.of(21))
} }
@@ -86,11 +90,33 @@ allprojects {
if (project.javaToolchains.launcherFor(java.toolchain).map { it.metadata.vendor }.orNull == "JetBrains") { if (project.javaToolchains.launcherFor(java.toolchain).map { it.metadata.vendor }.orNull == "JetBrains") {
runJvmArgs.add("-XX:+AllowEnhancedClassRedefinition") runJvmArgs.add("-XX:+AllowEnhancedClassRedefinition")
} }
dependencies {
implementation("org.jetbrains:annotations:24.1.0")
}
tasks.withType<ProcessResources> {
inputs.property("id", modId)
inputs.property("name", modName)
inputs.property("description", modDescription)
inputs.property("version", modVersion)
inputs.property("author", modAuthor)
inputs.property("license", modLicense)
inputs.property("sourcesURL", modSourcesURL)
inputs.property("issuesURL", modIssuesURL)
inputs.property("minimumMinecraftVersion", minimumMinecraftVersion)
inputs.property("minimumNeoForgeVersion", minimumNeoForgeVersion)
inputs.property("minimumFabricVersion", minimumFabricVersion)
from(rootProject.file("logo.png")) {
into("assets/$modId")
}
}
} }
subprojects { subprojects {
dependencies { dependencies {
implementation(rootProject) implementation(project(rootProject.path, configuration = "namedElements"))
} }
base { base {
@@ -104,18 +130,6 @@ subprojects {
} }
tasks.processResources { tasks.processResources {
inputs.property("id", modId)
inputs.property("name", modName)
inputs.property("description", modDescription)
inputs.property("version", modVersion)
inputs.property("author", modAuthor)
inputs.property("license", modLicense)
inputs.property("sourcesURL", modSourcesURL)
inputs.property("issuesURL", modIssuesURL)
inputs.property("minimumMinecraftVersion", minimumMinecraftVersion)
inputs.property("minimumNeoForgeVersion", minimumNeoForgeVersion)
inputs.property("minimumFabricVersion", minimumFabricVersion)
from(rootProject.sourceSets.main.get().resources) { from(rootProject.sourceSets.main.get().resources) {
expand(inputs.properties) expand(inputs.properties)
} }
@@ -123,18 +137,12 @@ subprojects {
tasks.jar { tasks.jar {
archiveVersion.set(jarVersion) archiveVersion.set(jarVersion)
entryCompression = ZipEntryCompression.STORED
from(rootProject.file("LICENSE")) from(rootProject.file("LICENSE"))
manifest { manifest {
attributes( packageInformation(modId, "$modNameStripped-${project.name}")
"Specification-Title" to modId,
"Specification-Vendor" to modAuthor,
"Specification-Version" to "1",
"Implementation-Title" to "$modNameStripped-${project.name}",
"Implementation-Vendor" to modAuthor,
"Implementation-Version" to modVersion,
)
} }
} }
@@ -143,18 +151,54 @@ subprojects {
} }
} }
val copyJars = tasks.register<Copy>("copyJars") { fun Manifest.packageInformation(specificationTitle: String, implementationTitle: String) {
group = "build" attributes(
duplicatesStrategy = EXCLUDE "Specification-Title" to specificationTitle,
"Specification-Vendor" to modAuthor,
"Specification-Version" to "1",
"Implementation-Title" to implementationTitle,
"Implementation-Vendor" to modAuthor,
"Implementation-Version" to modVersion,
)
}
for (subproject in subprojects) { val multiloaderSources = sourceSets.register("multiloader")
dependsOn(subproject.tasks.assemble)
from(subproject.base.libsDirectory.file("${subproject.base.archivesName.get()}-$jarVersion.jar")) val multiloaderJar = tasks.register<Jar>("multiloaderJar") {
group = "build"
archiveBaseName.set(modNameStripped)
archiveVersion.set(jarVersion)
destinationDirectory = layout.buildDirectory.dir("dist")
fun includeJar(project: Project, jarTask: (TaskContainer) -> TaskProvider<out Jar>) {
from(jarTask(project.tasks).map { it.outputs }) {
into("jars")
rename { "$modNameStripped-${project.name}.jar" }
}
} }
into(project.layout.buildDirectory.dir("dist")) findProject(":NeoForge")?.let { includeJar(it, TaskContainer::jar) }
findProject(":Fabric")?.let { includeJar(it, TaskContainer::remapJar) }
from(multiloaderSources.map { it.output })
manifest {
packageInformation("$modId-multiloader", modNameStripped)
attributes("FMLModType" to "GAMELIBRARY")
}
}
tasks.named<ProcessResources>("processMultiloaderResources").configure {
inputs.property("group", project.group)
inputs.property("jarPrefix", modNameStripped)
filesMatching(listOf("fabric.mod.json", "META-INF/jarjar/metadata.json")) {
expand(inputs.properties)
}
} }
tasks.assemble { tasks.assemble {
finalizedBy(copyJars) finalizedBy(multiloaderJar)
} }

View File

@@ -9,16 +9,20 @@ modSourcesURL=https://github.com/chylex/Better-Controls
modIssuesURL=https://github.com/chylex/Better-Controls/issues modIssuesURL=https://github.com/chylex/Better-Controls/issues
# Dependencies # Dependencies
minecraftVersion=1.20.5 minecraftVersion=1.21
neoForgeVersion=20.5.0-beta neoForgeVersion=21.0.0-beta
neoGradleVersion=7.0.120 neoGradleVersion=7.0.152
fabricVersion=0.15.11 fabricVersion=0.15.11
loomVersion=1.3 loomVersion=1.7
mixinVersion=0.12.5+mixin.0.8.5 mixinVersion=0.12.5+mixin.0.8.5
# https://projects.neoforged.net/neoforged/neogradle/
# https://fabricmc.net/develop/
# https://github.com/FabricMC/fabric-loom/releases
# Constraints # Constraints
minimumMinecraftVersion=1.20.5 minimumMinecraftVersion=1.21
minimumNeoForgeVersion=20.5.0-beta minimumNeoForgeVersion=21.0.0-beta
minimumFabricVersion=0.12.3 minimumFabricVersion=0.12.3
# Gradle # Gradle

View File

@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=true validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME

2
gradlew vendored
View File

@@ -55,7 +55,7 @@
# Darwin, MinGW, and NonStop. # Darwin, MinGW, and NonStop.
# #
# (3) This script is generated from the Groovy template # (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project. # within the Gradle project.
# #
# You can find Gradle at https://github.com/gradle/gradle/. # You can find Gradle at https://github.com/gradle/gradle/.

View File

@@ -10,7 +10,6 @@ pluginManagement {
plugins { plugins {
val neoGradleVersion = settings.extra.get("neoGradleVersion") as? String val neoGradleVersion = settings.extra.get("neoGradleVersion") as? String
if (neoGradleVersion != null) { if (neoGradleVersion != null) {
id("net.neoforged.gradle.vanilla") version neoGradleVersion
id("net.neoforged.gradle.userdev") version neoGradleVersion id("net.neoforged.gradle.userdev") version neoGradleVersion
id("net.neoforged.gradle.mixin") version neoGradleVersion id("net.neoforged.gradle.mixin") version neoGradleVersion
} }

View File

@@ -16,8 +16,8 @@ import net.minecraft.client.KeyMapping;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.CycleButton; import net.minecraft.client.gui.components.CycleButton;
import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.gui.screens.OptionsSubScreen;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.gui.screens.options.OptionsSubScreen;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
@@ -211,9 +211,7 @@ public class BetterControlsScreen extends OptionsSubScreen {
} }
@Override @Override
public void init() { protected void addContents() {
super.init();
allKeyBindings.clear(); allKeyBindings.clear();
final List<GuiEventListener> elements = new ArrayList<>(); final List<GuiEventListener> elements = new ArrayList<>();
@@ -234,6 +232,9 @@ public class BetterControlsScreen extends OptionsSubScreen {
optionsWidget = addRenderableWidget(new OptionListWidget(width, layout.getContentHeight(), layout.getHeaderHeight(), y - TITLE_MARGIN_TOP + BOTTOM_PADDING, elements)); optionsWidget = addRenderableWidget(new OptionListWidget(width, layout.getContentHeight(), layout.getHeaderHeight(), y - TITLE_MARGIN_TOP + BOTTOM_PADDING, elements));
} }
@Override
protected void addOptions() {}
@Override @Override
protected void repositionElements() { protected void repositionElements() {
super.repositionElements(); super.repositionElements();

View File

@@ -5,8 +5,8 @@ import net.minecraft.client.KeyMapping;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.Options; import net.minecraft.client.Options;
import net.minecraft.client.gui.components.ContainerObjectSelectionList; import net.minecraft.client.gui.components.ContainerObjectSelectionList;
import net.minecraft.client.gui.screens.controls.KeyBindsList; import net.minecraft.client.gui.screens.options.controls.KeyBindsList;
import net.minecraft.client.gui.screens.controls.KeyBindsList.Entry; import net.minecraft.client.gui.screens.options.controls.KeyBindsList.Entry;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;

View File

@@ -4,14 +4,13 @@ import chylex.bettercontrols.gui.BetterControlsScreen;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.Options; import net.minecraft.client.Options;
import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.components.OptionsList;
import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.gui.screens.OptionsSubScreen;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.gui.screens.controls.ControlsScreen; import net.minecraft.client.gui.screens.options.OptionsSubScreen;
import net.minecraft.client.gui.screens.options.controls.ControlsScreen;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.MutableComponent;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@@ -24,20 +23,18 @@ public abstract class HookControlsScreen extends OptionsSubScreen {
super(parentScreen, options, title); super(parentScreen, options, title);
} }
@Inject(method = "init", at = @At("RETURN")) @Inject(method = "addOptions", at = @At("RETURN"))
public void afterInit(final CallbackInfo ci) { public void afterAddOptions(final CallbackInfo ci) {
@SuppressWarnings("ConstantConditions") @SuppressWarnings("ConstantConditions")
final ControlsScreen screen = (ControlsScreen)(Object)this; final ControlsScreen screen = (ControlsScreen)(Object)this;
for (final GuiEventListener child : children()) { if (list != null) {
if (child instanceof final OptionsList optionsList) {
final MutableComponent buttonTitle = BetterControlsScreen.TITLE.plainCopy().append("..."); final MutableComponent buttonTitle = BetterControlsScreen.TITLE.plainCopy().append("...");
optionsList.addSmall(List.of(Button.builder(buttonTitle, btn -> showOptionsScreen(screen)).build())); list.addSmall(List.of(Button.builder(buttonTitle, btn -> showOptionsScreen(screen)).build()));
break;
}
} }
} }
@Unique
private static void showOptionsScreen(final ControlsScreen screen) { private static void showOptionsScreen(final ControlsScreen screen) {
final Minecraft mc = Minecraft.getInstance(); final Minecraft mc = Minecraft.getInstance();
mc.setScreen(new BetterControlsScreen(mc, screen)); mc.setScreen(new BetterControlsScreen(mc, screen));

View File

@@ -10,12 +10,14 @@ import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(Options.class) @Mixin(Options.class)
public abstract class HookLoadGameOptions { public abstract class HookLoadGameOptions {
@Unique
private boolean hasLoaded = false; private boolean hasLoaded = false;
@Mutable @Mutable

View File

@@ -0,0 +1,13 @@
{
"jars": [{
"identifier": {
"group": "${group}",
"artifact": "${id}"
},
"version": {
"artifactVersion": "${version}",
"range": "[${version}]"
},
"path": "jars/${jarPrefix}-NeoForge.jar"
}]
}

View File

@@ -0,0 +1,34 @@
{
"schemaVersion": 1,
"id": "${id}_multiloader",
"name": "${name} (Multiloader)",
"description": "${description}",
"version": "${version}",
"license": "${license}",
"icon": "assets/${id}/logo.png",
"authors": [
"${author}"
],
"contact": {
"homepage": "https://chylex.com",
"issues": "${issuesURL}",
"sources": "${sourcesURL}"
},
"environment": "client",
"jars": [{
"file": "jars/${jarPrefix}-Fabric.jar"
}],
"custom": {
"modmenu": {
"parent": "${id}",
"badges": [ "library" ],
"update_checker": false
}
}
}