mirror of
https://github.com/TeamMidnightDust/MidnightControls.git
synced 2025-12-13 23:25:10 +01:00
Architectury build system & huge code cleanup
This commit is contained in:
218
build.gradle
218
build.gradle
@@ -1,168 +1,82 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id 'fabric-loom' version '1.6-SNAPSHOT'
|
id "architectury-plugin" version "3.4-SNAPSHOT"
|
||||||
id 'java-library'
|
id "dev.architectury.loom" version "1.6-SNAPSHOT" apply false
|
||||||
id 'maven-publish'
|
id "me.shedaniel.unified-publishing" version "0.1.+" apply false
|
||||||
id 'com.github.johnrengelman.shadow' version '7.0.0'
|
id 'com.github.johnrengelman.shadow' version '8.1.1' apply false
|
||||||
id "me.shedaniel.unified-publishing" version "0.1.+"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
group = project.maven_group
|
architectury {
|
||||||
version = "${project.mod_version}+${project.minecraft_version}"
|
minecraft = rootProject.minecraft_version
|
||||||
|
|
||||||
// This field defines the Java version your mod target.
|
|
||||||
def targetJavaVersion = 21
|
|
||||||
|
|
||||||
boolean isMCVersionNonRelease() {
|
|
||||||
return project.minecraft_version.matches('^\\d\\dw\\d\\d[a-z]$')
|
|
||||||
|| project.minecraft_version.matches('\\d+\\.\\d+-(pre|rc)(\\d+)')
|
|
||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenLocal()
|
|
||||||
mavenCentral()
|
|
||||||
maven { url 'https://aperlambda.github.io/maven' }
|
|
||||||
maven {
|
maven {
|
||||||
name 'Gegy'
|
url = "https://api.modrinth.com/maven"
|
||||||
url 'https://maven.gegy.dev'
|
|
||||||
}
|
|
||||||
maven {
|
|
||||||
name = "CottonMC"
|
|
||||||
url = "https://server.bbkr.space/artifactory/libs-release"
|
|
||||||
}
|
|
||||||
maven { url "https://maven.terraformersmc.com/releases/" }
|
|
||||||
maven { url 'https://maven.kosmx.dev' }
|
|
||||||
maven { url 'https://maven.isxander.dev/releases' }
|
|
||||||
maven { url 'https://maven.shedaniel.me/' }
|
|
||||||
maven { url 'https://jitpack.io' }
|
|
||||||
maven { url "https://api.modrinth.com/maven" }
|
|
||||||
maven { url 'https://maven.quiltmc.org/repository/release'}
|
|
||||||
}
|
|
||||||
|
|
||||||
configurations {
|
|
||||||
shadow
|
|
||||||
api.extendsFrom shadow
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
//to change the versions see the gradle.properties file
|
|
||||||
minecraft "com.mojang:minecraft:${project.minecraft_version}"
|
|
||||||
mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
|
|
||||||
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
|
|
||||||
|
|
||||||
// Fabric API. This is technically optional, but you probably want it anyway.
|
|
||||||
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
|
|
||||||
|
|
||||||
include modImplementation ("maven.modrinth:obsidianui:${project.obsidianui_version}") {}
|
|
||||||
api('org.aperlambda:lambdajcommon:1.8.1') {
|
|
||||||
exclude group: 'com.google.code.gson'
|
|
||||||
exclude group: 'com.google.guava'
|
|
||||||
}
|
|
||||||
include 'org.aperlambda:lambdajcommon:1.8.1'
|
|
||||||
|
|
||||||
modCompileOnlyApi ("com.terraformersmc:modmenu:${project.modmenu_version}") {
|
|
||||||
exclude(group: "net.fabricmc.fabric-api")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compatibility mods
|
|
||||||
|
|
||||||
// Ok Zoomer and LibZoomer are temporarily disabled for the time being, as we are currently using Reflection at runtime instead in OkZoomerCompat due to there being two major, completely incompatible API versions.
|
|
||||||
// modImplementation("maven.modrinth:ok-zoomer:${project.ok_zoomer_version}")
|
|
||||||
// modImplementation "io.github.ennuil:LibZoomer:${project.libzoomer_version}"
|
|
||||||
|
|
||||||
modCompileOnlyApi "io.github.cottonmc:LibGui:${project.libgui_version}"
|
|
||||||
modCompileOnlyApi "org.quiltmc:quilt-json5:1.0.0"
|
|
||||||
modCompileOnly "maven.modrinth:sodium:${project.sodium_version}"
|
|
||||||
modCompileOnlyApi "maven.modrinth:emi:${project.emi_version}"
|
|
||||||
modCompileOnlyApi "maven.modrinth:emotecraft:${project.emotecraft_version}"
|
|
||||||
modCompileOnlyApi "io.github.kosmx:bendy-lib:${project.bendylib_version}"
|
|
||||||
modCompileOnlyApi "dev.isxander:yet-another-config-lib:${project.yacl_version}"
|
|
||||||
modCompileOnlyApi "maven.modrinth:inventory-tabs-updated:${project.inventorytabs_version}"
|
|
||||||
modCompileOnlyApi "maven.modrinth:bedrockify:${project.bedrockify_version}"
|
|
||||||
// Required for Inventory Tabs
|
|
||||||
modCompileOnlyApi("me.shedaniel.cloth:cloth-config-fabric:${project.clothconfig_version}") {
|
|
||||||
exclude(group: "net.fabricmc.fabric-api")
|
|
||||||
}
|
|
||||||
|
|
||||||
modImplementation "maven.modrinth:midnightlib:${project.midnightlib_version}"
|
|
||||||
include "maven.modrinth:midnightlib:${project.midnightlib_version}"
|
|
||||||
|
|
||||||
shadow 'com.electronwill.night-config:core:3.6.3'
|
|
||||||
shadow 'com.electronwill.night-config:toml:3.6.3'
|
|
||||||
apply plugin: 'java-library'
|
|
||||||
}
|
|
||||||
loom {
|
|
||||||
accessWidenerPath = file("src/main/resources/midnightcontrols.accesswidener")
|
|
||||||
}
|
|
||||||
|
|
||||||
java {
|
|
||||||
sourceCompatibility = JavaVersion.toVersion(targetJavaVersion)
|
|
||||||
targetCompatibility = JavaVersion.toVersion(targetJavaVersion)
|
|
||||||
|
|
||||||
withSourcesJar()
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.withType(JavaCompile).configureEach {
|
|
||||||
it.options.encoding = 'UTF-8'
|
|
||||||
|
|
||||||
it.options.release.set(targetJavaVersion)
|
|
||||||
}
|
|
||||||
|
|
||||||
processResources {
|
|
||||||
inputs.property 'version', project.version
|
|
||||||
|
|
||||||
filesMatching('fabric.mod.json') {
|
|
||||||
expand 'version': project.version
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ext {
|
subprojects {
|
||||||
releaseChangelog = {
|
apply plugin: "dev.architectury.loom"
|
||||||
def changes = new StringBuilder()
|
repositories {
|
||||||
changes << "## MidnightControls v$project.version for $project.minecraft_version\n[View the changelog](https://www.github.com/TeamMidnightDust/MidnightControls/commits/)"
|
maven {
|
||||||
def proc = "git log --max-count=1 --pretty=format:%s".execute()
|
url = "https://api.modrinth.com/maven"
|
||||||
proc.in.eachLine { line ->
|
|
||||||
def processedLine = line.toString()
|
|
||||||
if (!processedLine.contains("New translations") && !processedLine.contains("Merge") && !processedLine.contains("branch")) {
|
|
||||||
changes << "\n- ${processedLine.capitalize()}"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
proc.waitFor()
|
maven { url 'https://jitpack.io' }
|
||||||
return changes.toString()
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
unifiedPublishing {
|
dependencies {
|
||||||
project {
|
minecraft "com.mojang:minecraft:${rootProject.minecraft_version}"
|
||||||
displayName = "MidnightControls v$project.version - Fabric $project.minecraft_version"
|
// The following line declares the mojmap mappings, you may use other mappings as well
|
||||||
releaseType = "$project.release_type"
|
//mappings loom.officialMojangMappings()
|
||||||
changelog = releaseChangelog()
|
// The following line declares the yarn mappings you may select this one as well.
|
||||||
gameVersions = []
|
mappings loom.layered {
|
||||||
gameLoaders = ["fabric","quilt"]
|
it.mappings("net.fabricmc:yarn:$rootProject.yarn_mappings:v2")
|
||||||
mainPublication remapJar
|
it.mappings("dev.architectury:yarn-mappings-patch-neoforge:$rootProject.yarn_mappings_patch_neoforge_version")
|
||||||
relations {
|
|
||||||
includes {
|
|
||||||
curseforge = "midnightlib"
|
|
||||||
modrinth = "midnightlib"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var CURSEFORGE_TOKEN = project.findProperty("CURSEFORGE_TOKEN") ?: System.getenv("CURSEFORGE_TOKEN")
|
|
||||||
if (CURSEFORGE_TOKEN != null) {
|
|
||||||
curseforge {
|
|
||||||
token = CURSEFORGE_TOKEN
|
|
||||||
id = rootProject.curseforge_id
|
|
||||||
gameVersions.addAll "Java 21", project.minecraft_version
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var MODRINTH_TOKEN = project.findProperty("MODRINTH_TOKEN") ?: System.getenv("MODRINTH_TOKEN")
|
|
||||||
if (MODRINTH_TOKEN != null) {
|
|
||||||
modrinth {
|
|
||||||
token = MODRINTH_TOKEN
|
|
||||||
id = rootProject.modrinth_id
|
|
||||||
version = "$project.version"
|
|
||||||
gameVersions.addAll project.minecraft_version
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
allprojects {
|
||||||
|
apply plugin: "java"
|
||||||
|
apply plugin: "architectury-plugin"
|
||||||
|
apply plugin: "maven-publish"
|
||||||
|
|
||||||
|
archivesBaseName = rootProject.archives_base_name
|
||||||
|
version = rootProject.mod_version
|
||||||
|
group = rootProject.maven_group
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
maven { url 'https://aperlambda.github.io/maven' }
|
||||||
|
}
|
||||||
|
dependencies {
|
||||||
|
implementation('org.aperlambda:lambdajcommon:1.8.1') {
|
||||||
|
exclude group: 'com.google.code.gson'
|
||||||
|
exclude group: 'com.google.guava'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.withType(JavaCompile) {
|
||||||
|
options.encoding = "UTF-8"
|
||||||
|
options.release = 21
|
||||||
|
}
|
||||||
|
ext {
|
||||||
|
releaseChangelog = {
|
||||||
|
def changes = new StringBuilder()
|
||||||
|
changes << "## MidnightControls v$project.version for $project.minecraft_version\n[View the changelog](https://www.github.com/TeamMidnightDust/MidnightControls/commits/)"
|
||||||
|
def proc = "git log --max-count=1 --pretty=format:%s".execute()
|
||||||
|
proc.in.eachLine { line ->
|
||||||
|
def processedLine = line.toString()
|
||||||
|
if (!processedLine.contains("New translations") && !processedLine.contains("Merge") && !processedLine.contains("branch")) {
|
||||||
|
changes << "\n- ${processedLine.capitalize()}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
proc.waitFor()
|
||||||
|
return changes.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
java {
|
||||||
|
withSourcesJar()
|
||||||
|
}
|
||||||
|
}
|
||||||
168
build_old.gradle
Normal file
168
build_old.gradle
Normal file
@@ -0,0 +1,168 @@
|
|||||||
|
plugins {
|
||||||
|
id 'fabric-loom' version '1.6-SNAPSHOT'
|
||||||
|
id 'java-library'
|
||||||
|
id 'maven-publish'
|
||||||
|
id 'com.github.johnrengelman.shadow' version '7.0.0'
|
||||||
|
id "me.shedaniel.unified-publishing" version "0.1.+"
|
||||||
|
}
|
||||||
|
|
||||||
|
group = project.maven_group
|
||||||
|
version = "${project.mod_version}+${project.minecraft_version}"
|
||||||
|
|
||||||
|
// This field defines the Java version your mod target.
|
||||||
|
def targetJavaVersion = 21
|
||||||
|
|
||||||
|
boolean isMCVersionNonRelease() {
|
||||||
|
return project.minecraft_version.matches('^\\d\\dw\\d\\d[a-z]$')
|
||||||
|
|| project.minecraft_version.matches('\\d+\\.\\d+-(pre|rc)(\\d+)')
|
||||||
|
}
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
mavenCentral()
|
||||||
|
maven { url 'https://aperlambda.github.io/maven' }
|
||||||
|
maven {
|
||||||
|
name 'Gegy'
|
||||||
|
url 'https://maven.gegy.dev'
|
||||||
|
}
|
||||||
|
maven {
|
||||||
|
name = "CottonMC"
|
||||||
|
url = "https://server.bbkr.space/artifactory/libs-release"
|
||||||
|
}
|
||||||
|
maven { url "https://maven.terraformersmc.com/releases/" }
|
||||||
|
maven { url 'https://maven.kosmx.dev' }
|
||||||
|
maven { url 'https://maven.isxander.dev/releases' }
|
||||||
|
maven { url 'https://maven.shedaniel.me/' }
|
||||||
|
maven { url 'https://jitpack.io' }
|
||||||
|
maven { url "https://api.modrinth.com/maven" }
|
||||||
|
maven { url 'https://maven.quiltmc.org/repository/release'}
|
||||||
|
}
|
||||||
|
|
||||||
|
configurations {
|
||||||
|
shadow
|
||||||
|
api.extendsFrom shadow
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
//to change the versions see the gradle.properties file
|
||||||
|
minecraft "com.mojang:minecraft:${project.minecraft_version}"
|
||||||
|
mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
|
||||||
|
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
|
||||||
|
|
||||||
|
// Fabric API. This is technically optional, but you probably want it anyway.
|
||||||
|
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
|
||||||
|
|
||||||
|
include modImplementation ("maven.modrinth:obsidianui:${project.obsidianui_version}") {}
|
||||||
|
api('org.aperlambda:lambdajcommon:1.8.1') {
|
||||||
|
exclude group: 'com.google.code.gson'
|
||||||
|
exclude group: 'com.google.guava'
|
||||||
|
}
|
||||||
|
include 'org.aperlambda:lambdajcommon:1.8.1'
|
||||||
|
|
||||||
|
modCompileOnlyApi ("com.terraformersmc:modmenu:${project.modmenu_version}") {
|
||||||
|
exclude(group: "net.fabricmc.fabric-api")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compatibility mods
|
||||||
|
|
||||||
|
// Ok Zoomer and LibZoomer are temporarily disabled for the time being, as we are currently using Reflection at runtime instead in OkZoomerCompat due to there being two major, completely incompatible API versions.
|
||||||
|
// modImplementation("maven.modrinth:ok-zoomer:${project.ok_zoomer_version}")
|
||||||
|
// modImplementation "io.github.ennuil:LibZoomer:${project.libzoomer_version}"
|
||||||
|
|
||||||
|
modCompileOnlyApi "io.github.cottonmc:LibGui:${project.libgui_version}"
|
||||||
|
modCompileOnlyApi "org.quiltmc:quilt-json5:1.0.0"
|
||||||
|
modCompileOnly "maven.modrinth:sodium:${project.sodium_version}"
|
||||||
|
modCompileOnlyApi "maven.modrinth:emi:${project.emi_version}"
|
||||||
|
modCompileOnlyApi "maven.modrinth:emotecraft:${project.emotecraft_version}"
|
||||||
|
modCompileOnlyApi "io.github.kosmx:bendy-lib:${project.bendylib_version}"
|
||||||
|
modCompileOnlyApi "dev.isxander:yet-another-config-lib:${project.yacl_version}"
|
||||||
|
modCompileOnlyApi "maven.modrinth:inventory-tabs-updated:${project.inventorytabs_version}"
|
||||||
|
modCompileOnlyApi "maven.modrinth:bedrockify:${project.bedrockify_version}"
|
||||||
|
// Required for Inventory Tabs
|
||||||
|
modCompileOnlyApi("me.shedaniel.cloth:cloth-config-fabric:${project.clothconfig_version}") {
|
||||||
|
exclude(group: "net.fabricmc.fabric-api")
|
||||||
|
}
|
||||||
|
|
||||||
|
modImplementation "maven.modrinth:midnightlib:${project.midnightlib_version}"
|
||||||
|
include "maven.modrinth:midnightlib:${project.midnightlib_version}"
|
||||||
|
|
||||||
|
shadow 'com.electronwill.night-config:core:3.6.3'
|
||||||
|
shadow 'com.electronwill.night-config:toml:3.6.3'
|
||||||
|
apply plugin: 'java-library'
|
||||||
|
}
|
||||||
|
loom {
|
||||||
|
accessWidenerPath = file("src/main/resources/midnightcontrols.accesswidener")
|
||||||
|
}
|
||||||
|
|
||||||
|
java {
|
||||||
|
sourceCompatibility = JavaVersion.toVersion(targetJavaVersion)
|
||||||
|
targetCompatibility = JavaVersion.toVersion(targetJavaVersion)
|
||||||
|
|
||||||
|
withSourcesJar()
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.withType(JavaCompile).configureEach {
|
||||||
|
it.options.encoding = 'UTF-8'
|
||||||
|
|
||||||
|
it.options.release.set(targetJavaVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
processResources {
|
||||||
|
inputs.property 'version', project.version
|
||||||
|
|
||||||
|
filesMatching('fabric.mod.json') {
|
||||||
|
expand 'version': project.version
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ext {
|
||||||
|
releaseChangelog = {
|
||||||
|
def changes = new StringBuilder()
|
||||||
|
changes << "## MidnightControls v$project.version for $project.minecraft_version\n[View the changelog](https://www.github.com/TeamMidnightDust/MidnightControls/commits/)"
|
||||||
|
def proc = "git log --max-count=1 --pretty=format:%s".execute()
|
||||||
|
proc.in.eachLine { line ->
|
||||||
|
def processedLine = line.toString()
|
||||||
|
if (!processedLine.contains("New translations") && !processedLine.contains("Merge") && !processedLine.contains("branch")) {
|
||||||
|
changes << "\n- ${processedLine.capitalize()}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
proc.waitFor()
|
||||||
|
return changes.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unifiedPublishing {
|
||||||
|
project {
|
||||||
|
displayName = "MidnightControls v$project.version - Fabric $project.minecraft_version"
|
||||||
|
releaseType = "$project.release_type"
|
||||||
|
changelog = releaseChangelog()
|
||||||
|
gameVersions = []
|
||||||
|
gameLoaders = ["fabric","quilt"]
|
||||||
|
mainPublication remapJar
|
||||||
|
relations {
|
||||||
|
includes {
|
||||||
|
curseforge = "midnightlib"
|
||||||
|
modrinth = "midnightlib"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var CURSEFORGE_TOKEN = project.findProperty("CURSEFORGE_TOKEN") ?: System.getenv("CURSEFORGE_TOKEN")
|
||||||
|
if (CURSEFORGE_TOKEN != null) {
|
||||||
|
curseforge {
|
||||||
|
token = CURSEFORGE_TOKEN
|
||||||
|
id = rootProject.curseforge_id
|
||||||
|
gameVersions.addAll "Java 21", project.minecraft_version
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var MODRINTH_TOKEN = project.findProperty("MODRINTH_TOKEN") ?: System.getenv("MODRINTH_TOKEN")
|
||||||
|
if (MODRINTH_TOKEN != null) {
|
||||||
|
modrinth {
|
||||||
|
token = MODRINTH_TOKEN
|
||||||
|
id = rootProject.modrinth_id
|
||||||
|
version = "$project.version"
|
||||||
|
gameVersions.addAll project.minecraft_version
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
31
common/build.gradle
Normal file
31
common/build.gradle
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
architectury {
|
||||||
|
common(rootProject.enabled_platforms.split(","))
|
||||||
|
}
|
||||||
|
loom {
|
||||||
|
accessWidenerPath = file("src/main/resources/midnightcontrols.accesswidener")
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
// We depend on fabric loader here to use the fabric @Environment annotations and get the mixin dependencies
|
||||||
|
// Do NOT use other classes from fabric loader
|
||||||
|
modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}"
|
||||||
|
// Using the Fabric version of midnightlib here to create a common config and get useful utilities
|
||||||
|
// Just make sure NOT to use classes from the .fabric classpath
|
||||||
|
modCompileOnlyApi "maven.modrinth:midnightlib:${rootProject.midnightlib_version}-fabric"
|
||||||
|
modCompileOnlyApi "maven.modrinth:obsidianui:${project.obsidianui_version}-fabric"
|
||||||
|
include 'org.aperlambda:lambdajcommon:1.8.1'
|
||||||
|
}
|
||||||
|
|
||||||
|
publishing {
|
||||||
|
publications {
|
||||||
|
mavenCommon(MavenPublication) {
|
||||||
|
artifactId = rootProject.archives_base_name
|
||||||
|
from components.java
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
|
||||||
|
repositories {
|
||||||
|
// Add repositories to publish to here.
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* Copyright © 2021 LambdAurora <aurora42lambda@gmail.com>
|
||||||
|
*
|
||||||
|
* This file is part of midnightcontrols.
|
||||||
|
*
|
||||||
|
* Licensed under the MIT license. For more information,
|
||||||
|
* see the LICENSE file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package eu.midnightdust.midnightcontrols;
|
||||||
|
|
||||||
|
import eu.midnightdust.lib.util.PlatformFunctions;
|
||||||
|
import net.minecraft.network.packet.CustomPayload;
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents the MidnightControls mod.
|
||||||
|
*
|
||||||
|
* @author LambdAurora & Motschen
|
||||||
|
* @version 1.8.0
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
public class MidnightControls {
|
||||||
|
public static final CustomPayload.Id<CustomPayload> CONTROLS_MODE_CHANNEL = new CustomPayload.Id<>(MidnightControlsConstants.CONTROLS_MODE_CHANNEL);
|
||||||
|
public static final CustomPayload.Id<CustomPayload> FEATURE_CHANNEL = new CustomPayload.Id<>(MidnightControlsConstants.FEATURE_CHANNEL);
|
||||||
|
public static final CustomPayload.Id<CustomPayload> HELLO_CHANNEL = new CustomPayload.Id<>(MidnightControlsConstants.HELLO_CHANNEL);
|
||||||
|
public static boolean isExtrasLoaded;
|
||||||
|
|
||||||
|
public static final Logger logger = LogManager.getLogger("MidnightControls");
|
||||||
|
|
||||||
|
public static void init() {
|
||||||
|
isExtrasLoaded = PlatformFunctions.isModLoaded("midnightcontrols-extra");
|
||||||
|
log("Initializing MidnightControls...");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints a message to the terminal.
|
||||||
|
*
|
||||||
|
* @param info the message to print
|
||||||
|
*/
|
||||||
|
public static void log(String info) {
|
||||||
|
logger.info("[MidnightControls] {}", info);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints a warning to the terminal.
|
||||||
|
*
|
||||||
|
* @param warning the warning to print
|
||||||
|
*/
|
||||||
|
public static void warn(String warning) {
|
||||||
|
logger.warn("[MidnightControls] {}", warning);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -44,6 +44,7 @@ public class MidnightControlsFeature implements Nameable {
|
|||||||
this.setEnabled(this.defaultEnabled = enabled);
|
this.setEnabled(this.defaultEnabled = enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public MidnightControlsFeature(@NotNull String key) {
|
public MidnightControlsFeature(@NotNull String key) {
|
||||||
this(key, false, false);
|
this(key, false, false);
|
||||||
}
|
}
|
||||||
@@ -51,6 +52,7 @@ public class MidnightControlsFeature implements Nameable {
|
|||||||
/**
|
/**
|
||||||
* Allows the feature.
|
* Allows the feature.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public void allow() {
|
public void allow() {
|
||||||
this.setAllowed(true);
|
this.setAllowed(true);
|
||||||
}
|
}
|
||||||
@@ -21,28 +21,15 @@ import eu.midnightdust.midnightcontrols.client.controller.Controller;
|
|||||||
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsHud;
|
import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsHud;
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.RingScreen;
|
import eu.midnightdust.midnightcontrols.client.gui.RingScreen;
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.mixin.KeyBindingIDAccessor;
|
import eu.midnightdust.midnightcontrols.client.mixin.KeyBindingIDAccessor;
|
||||||
import eu.midnightdust.midnightcontrols.client.ring.ButtonBindingRingAction;
|
import eu.midnightdust.midnightcontrols.client.ring.ButtonBindingRingAction;
|
||||||
import eu.midnightdust.midnightcontrols.client.ring.MidnightRing;
|
import eu.midnightdust.midnightcontrols.client.ring.MidnightRing;
|
||||||
import org.thinkingstudio.obsidianui.fabric.event.OpenScreenCallback;
|
import eu.midnightdust.midnightcontrols.client.util.platform.NetworkUtil;
|
||||||
import org.thinkingstudio.obsidianui.hud.HudManager;
|
import org.thinkingstudio.obsidianui.hud.HudManager;
|
||||||
import eu.midnightdust.midnightcontrols.client.touch.TouchInput;
|
import eu.midnightdust.midnightcontrols.client.touch.TouchInput;
|
||||||
import eu.midnightdust.midnightcontrols.client.util.RainbowColor;
|
import eu.midnightdust.midnightcontrols.client.util.RainbowColor;
|
||||||
import eu.midnightdust.midnightcontrols.packet.ControlsModePacket;
|
import eu.midnightdust.midnightcontrols.packet.ControlsModePayload;
|
||||||
import eu.midnightdust.midnightcontrols.packet.FeaturePacket;
|
|
||||||
import eu.midnightdust.midnightcontrols.packet.HelloPacket;
|
|
||||||
import net.fabricmc.api.ClientModInitializer;
|
|
||||||
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
|
|
||||||
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
|
|
||||||
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
|
|
||||||
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
|
|
||||||
import net.fabricmc.fabric.api.resource.ResourceManagerHelper;
|
|
||||||
import net.fabricmc.fabric.api.resource.ResourcePackActivationType;
|
|
||||||
import net.fabricmc.loader.api.FabricLoader;
|
|
||||||
import net.fabricmc.loader.api.ModContainer;
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.network.ClientPlayNetworkHandler;
|
|
||||||
import net.minecraft.client.option.KeyBinding;
|
import net.minecraft.client.option.KeyBinding;
|
||||||
import net.minecraft.client.toast.SystemToast;
|
import net.minecraft.client.toast.SystemToast;
|
||||||
import net.minecraft.client.util.InputUtil;
|
import net.minecraft.client.util.InputUtil;
|
||||||
@@ -53,6 +40,7 @@ import org.lwjgl.glfw.GLFW;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents the midnightcontrols client mod.
|
* Represents the midnightcontrols client mod.
|
||||||
@@ -61,9 +49,8 @@ import java.util.*;
|
|||||||
* @version 1.7.0
|
* @version 1.7.0
|
||||||
* @since 1.1.0
|
* @since 1.1.0
|
||||||
*/
|
*/
|
||||||
public class MidnightControlsClient extends MidnightControls implements ClientModInitializer {
|
public class MidnightControlsClient extends MidnightControls {
|
||||||
public static boolean lateInitDone = false;
|
public static boolean lateInitDone = false;
|
||||||
private static MidnightControlsClient INSTANCE;
|
|
||||||
public static final KeyBinding BINDING_LOOK_UP = InputManager.makeKeyBinding(Identifier.of(MidnightControlsConstants.NAMESPACE, "look_up"),
|
public static final KeyBinding BINDING_LOOK_UP = InputManager.makeKeyBinding(Identifier.of(MidnightControlsConstants.NAMESPACE, "look_up"),
|
||||||
InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_8, "key.categories.movement");
|
InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_8, "key.categories.movement");
|
||||||
public static final KeyBinding BINDING_LOOK_RIGHT = InputManager.makeKeyBinding(Identifier.of(MidnightControlsConstants.NAMESPACE, "look_right"),
|
public static final KeyBinding BINDING_LOOK_RIGHT = InputManager.makeKeyBinding(Identifier.of(MidnightControlsConstants.NAMESPACE, "look_right"),
|
||||||
@@ -78,53 +65,17 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
|
|||||||
public static final Identifier CONTROLLER_EXPANDED = Identifier.of(MidnightControlsConstants.NAMESPACE, "textures/gui/controller_expanded.png");
|
public static final Identifier CONTROLLER_EXPANDED = Identifier.of(MidnightControlsConstants.NAMESPACE, "textures/gui/controller_expanded.png");
|
||||||
public static final Identifier CONTROLLER_AXIS = Identifier.of(MidnightControlsConstants.NAMESPACE, "textures/gui/controller_axis.png");
|
public static final Identifier CONTROLLER_AXIS = Identifier.of(MidnightControlsConstants.NAMESPACE, "textures/gui/controller_axis.png");
|
||||||
public static final Identifier CURSOR_TEXTURE = Identifier.of(MidnightControlsConstants.NAMESPACE, "textures/gui/cursor.png");
|
public static final Identifier CURSOR_TEXTURE = Identifier.of(MidnightControlsConstants.NAMESPACE, "textures/gui/cursor.png");
|
||||||
public final static File MAPPINGS_FILE = new File("config/gamecontrollercustommappings.txt");
|
public static final File MAPPINGS_FILE = new File("config/gamecontrollercustommappings.txt");
|
||||||
public final MidnightInput input = new MidnightInput();
|
public static final MinecraftClient client = MinecraftClient.getInstance();
|
||||||
public final MidnightRing ring = new MidnightRing(this);
|
public static final MidnightInput input = new MidnightInput();
|
||||||
public final MidnightReacharound reacharound = new MidnightReacharound();
|
public static final MidnightRing ring = new MidnightRing();
|
||||||
private MidnightControlsHud hud;
|
public static final MidnightReacharound reacharound = new MidnightReacharound();
|
||||||
private ControlsMode previousControlsMode;
|
private static MidnightControlsHud hud;
|
||||||
|
private static ControlsMode previousControlsMode;
|
||||||
|
|
||||||
@Override
|
public static void initClient() {
|
||||||
public void onInitializeClient() {
|
ring.registerAction("buttonbinding", ButtonBindingRingAction.FACTORY);
|
||||||
INSTANCE = this;
|
|
||||||
KeyBindingHelper.registerKeyBinding(BINDING_LOOK_UP);
|
|
||||||
KeyBindingHelper.registerKeyBinding(BINDING_LOOK_RIGHT);
|
|
||||||
KeyBindingHelper.registerKeyBinding(BINDING_LOOK_DOWN);
|
|
||||||
KeyBindingHelper.registerKeyBinding(BINDING_LOOK_LEFT);
|
|
||||||
KeyBindingHelper.registerKeyBinding(BINDING_RING);
|
|
||||||
|
|
||||||
this.ring.registerAction("buttonbinding", ButtonBindingRingAction.FACTORY);
|
|
||||||
|
|
||||||
ClientPlayNetworking.registerGlobalReceiver(CONTROLS_MODE_CHANNEL, (payload, context) ->
|
|
||||||
context.responseSender().sendPacket(new ControlsModePacket(MidnightControlsConfig.controlsMode.getName())));
|
|
||||||
ClientPlayNetworking.registerGlobalReceiver(FeaturePacket.PACKET_ID, ((payload, context) -> {}));
|
|
||||||
|
|
||||||
ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> {
|
|
||||||
var version = "";
|
|
||||||
Optional<ModContainer> container;
|
|
||||||
if ((container = FabricLoader.getInstance().getModContainer(MidnightControlsConstants.NAMESPACE)).isPresent()) {
|
|
||||||
version = container.get().getMetadata().getVersion().getFriendlyString();
|
|
||||||
}
|
|
||||||
var controlsMode = MidnightControlsConfig.controlsMode.getName();
|
|
||||||
sender.sendPacket(new HelloPacket(version, controlsMode));
|
|
||||||
sender.sendPacket(new ControlsModePacket(controlsMode));
|
|
||||||
});
|
|
||||||
ClientPlayConnectionEvents.DISCONNECT.register(this::onLeave);
|
|
||||||
|
|
||||||
ClientTickEvents.START_CLIENT_TICK.register(this.reacharound::tick);
|
|
||||||
ClientTickEvents.START_CLIENT_TICK.register(this::onTick);
|
|
||||||
|
|
||||||
OpenScreenCallback.POST.register((client, screen) -> {
|
|
||||||
if (screen == null && MidnightControlsConfig.controlsMode == ControlsMode.TOUCHSCREEN) {
|
|
||||||
screen = new TouchscreenOverlay(this);
|
|
||||||
screen.init(client, client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight());
|
|
||||||
client.skipGameRender = false;
|
|
||||||
client.currentScreen = screen;
|
|
||||||
} else if (screen != null) {
|
|
||||||
this.input.onScreenOpen(client, client.getWindow().getWidth(), client.getWindow().getHeight());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
final MinecraftClient client = MinecraftClient.getInstance();
|
final MinecraftClient client = MinecraftClient.getInstance();
|
||||||
int delay = 0; // delay for 0 sec.
|
int delay = 0; // delay for 0 sec.
|
||||||
int period = 1; // repeat every 0.001 sec. (100 times a second)
|
int period = 1; // repeat every 0.001 sec. (100 times a second)
|
||||||
@@ -135,17 +86,13 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
|
|||||||
}
|
}
|
||||||
}, delay, period);
|
}, delay, period);
|
||||||
|
|
||||||
HudManager.register(this.hud = new MidnightControlsHud(this));
|
HudManager.register(hud = new MidnightControlsHud());
|
||||||
FabricLoader.getInstance().getModContainer("midnightcontrols").ifPresent(modContainer -> {
|
|
||||||
ResourceManagerHelper.registerBuiltinResourcePack(Identifier.of("midnightcontrols","bedrock"), modContainer, ResourcePackActivationType.NORMAL);
|
|
||||||
ResourceManagerHelper.registerBuiltinResourcePack(Identifier.of("midnightcontrols","legacy"), modContainer, ResourcePackActivationType.NORMAL);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method is called when Minecraft is initializing.
|
* This method is called when Minecraft is initializing.
|
||||||
*/
|
*/
|
||||||
public void onMcInit(@NotNull MinecraftClient client) {
|
public static void onMcInit(@NotNull MinecraftClient client) {
|
||||||
ButtonBinding.init(client.options);
|
ButtonBinding.init(client.options);
|
||||||
MidnightControlsConfig.load();
|
MidnightControlsConfig.load();
|
||||||
if (MidnightControlsConfig.configVersion < 2) {
|
if (MidnightControlsConfig.configVersion < 2) {
|
||||||
@@ -156,7 +103,7 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
|
|||||||
MidnightControlsConfig.configVersion = 2;
|
MidnightControlsConfig.configVersion = 2;
|
||||||
MidnightControlsConfig.write("midnightcontrols");
|
MidnightControlsConfig.write("midnightcontrols");
|
||||||
}
|
}
|
||||||
this.hud.setVisible(MidnightControlsConfig.hudEnable);
|
hud.setVisible(MidnightControlsConfig.hudEnable);
|
||||||
Controller.updateMappings();
|
Controller.updateMappings();
|
||||||
try {
|
try {
|
||||||
GLFW.glfwSetJoystickCallback((jid, event) -> {
|
GLFW.glfwSetJoystickCallback((jid, event) -> {
|
||||||
@@ -169,17 +116,16 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
|
|||||||
null));
|
null));
|
||||||
}
|
}
|
||||||
|
|
||||||
this.switchControlsMode();
|
switchControlsMode();
|
||||||
});
|
});
|
||||||
} catch (Exception e) {e.fillInStackTrace();}
|
} catch (Exception e) {e.fillInStackTrace();}
|
||||||
|
|
||||||
MidnightControlsCompat.init(this);
|
MidnightControlsCompat.init();
|
||||||
}
|
}
|
||||||
ButtonCategory category;
|
|
||||||
/**
|
/**
|
||||||
* This method is called to initialize keybindings
|
* This method is called to initialize keybindings
|
||||||
*/
|
*/
|
||||||
public void initKeybindings() {
|
public static void initKeybindings() {
|
||||||
if (lateInitDone) return;
|
if (lateInitDone) return;
|
||||||
if (KeyBindingIDAccessor.getKEYS_BY_ID() == null || KeyBindingIDAccessor.getKEYS_BY_ID().isEmpty()) return;
|
if (KeyBindingIDAccessor.getKEYS_BY_ID() == null || KeyBindingIDAccessor.getKEYS_BY_ID().isEmpty()) return;
|
||||||
if (PlatformFunctions.isModLoaded("voxelmap") && !KeyBindingIDAccessor.getKEYS_BY_ID().containsKey("key.minimap.toggleingamewaypoints")) return;
|
if (PlatformFunctions.isModLoaded("voxelmap") && !KeyBindingIDAccessor.getKEYS_BY_ID().containsKey("key.minimap.toggleingamewaypoints")) return;
|
||||||
@@ -188,19 +134,19 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
|
|||||||
KeyBinding keyBinding = KeyBindingIDAccessor.getKEYS_BY_ID().entrySet().stream().toList().get(i).getValue();
|
KeyBinding keyBinding = KeyBindingIDAccessor.getKEYS_BY_ID().entrySet().stream().toList().get(i).getValue();
|
||||||
if (MidnightControlsConfig.excludedKeybindings.stream().noneMatch(excluded -> keyBinding.getTranslationKey().startsWith(excluded))) {
|
if (MidnightControlsConfig.excludedKeybindings.stream().noneMatch(excluded -> keyBinding.getTranslationKey().startsWith(excluded))) {
|
||||||
if (!keyBinding.getTranslationKey().contains("midnightcontrols") && !keyBinding.getTranslationKey().contains("ok_zoomer") && !keyBinding.getTranslationKey().contains("okzoomer")) {
|
if (!keyBinding.getTranslationKey().contains("midnightcontrols") && !keyBinding.getTranslationKey().contains("ok_zoomer") && !keyBinding.getTranslationKey().contains("okzoomer")) {
|
||||||
category = null;
|
AtomicReference<ButtonCategory> category = new AtomicReference<>();
|
||||||
InputManager.streamCategories().forEach(buttonCategory -> {
|
InputManager.streamCategories().forEach(buttonCategory -> {
|
||||||
if (buttonCategory.getIdentifier().equals(new org.aperlambda.lambdacommon.Identifier("minecraft", keyBinding.getCategory())))
|
if (buttonCategory.getIdentifier().equals(Identifier.of("minecraft", keyBinding.getCategory())))
|
||||||
category = buttonCategory;
|
category.set(buttonCategory);
|
||||||
});
|
});
|
||||||
if (category == null) {
|
if (category.get() == null) {
|
||||||
category = new ButtonCategory(new org.aperlambda.lambdacommon.Identifier("minecraft", keyBinding.getCategory()));
|
category.set(new ButtonCategory(Identifier.of("minecraft", keyBinding.getCategory())));
|
||||||
InputManager.registerCategory(category);
|
InputManager.registerCategory(category.get());
|
||||||
}
|
}
|
||||||
ButtonBinding buttonBinding = new ButtonBinding.Builder(keyBinding.getTranslationKey()).category(category).linkKeybind(keyBinding).register();
|
ButtonBinding buttonBinding = new ButtonBinding.Builder(keyBinding.getTranslationKey()).category(category.get()).linkKeybind(keyBinding).register();
|
||||||
if (MidnightControlsConfig.debug) {
|
if (MidnightControlsConfig.debug) {
|
||||||
logger.info(keyBinding.getTranslationKey());
|
MidnightControls.log(keyBinding.getTranslationKey());
|
||||||
logger.info(buttonBinding);
|
MidnightControls.log(String.valueOf(buttonBinding));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -214,11 +160,11 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
|
|||||||
*
|
*
|
||||||
* @param client the client instance
|
* @param client the client instance
|
||||||
*/
|
*/
|
||||||
public void onTick(@NotNull MinecraftClient client) {
|
public static void onTick(@NotNull MinecraftClient client) {
|
||||||
this.initKeybindings();
|
initKeybindings();
|
||||||
this.input.tick(client);
|
input.tick(client);
|
||||||
if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && (client.isWindowFocused() || MidnightControlsConfig.unfocusedInput))
|
if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && (client.isWindowFocused() || MidnightControlsConfig.unfocusedInput))
|
||||||
this.input.tickController(client);
|
input.tickController(client);
|
||||||
|
|
||||||
if (BINDING_RING.wasPressed()) {
|
if (BINDING_RING.wasPressed()) {
|
||||||
ring.loadFromUnbound();
|
ring.loadFromUnbound();
|
||||||
@@ -238,26 +184,26 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
|
|||||||
/**
|
/**
|
||||||
* Called when leaving a server.
|
* Called when leaving a server.
|
||||||
*/
|
*/
|
||||||
public void onLeave(ClientPlayNetworkHandler handler, MinecraftClient client) {
|
public static void onLeave() {
|
||||||
MidnightControlsFeature.resetAllAllowed();
|
MidnightControlsFeature.resetAllAllowed();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Switches the controls mode if the auto switch is enabled.
|
* Switches the controls mode if the auto switch is enabled.
|
||||||
*/
|
*/
|
||||||
public void switchControlsMode() {
|
public static void switchControlsMode() {
|
||||||
if (MidnightControlsConfig.autoSwitchMode) {
|
if (MidnightControlsConfig.autoSwitchMode) {
|
||||||
if (MidnightControlsConfig.getController().isGamepad()) {
|
if (MidnightControlsConfig.getController().isGamepad()) {
|
||||||
this.previousControlsMode = MidnightControlsConfig.controlsMode;
|
previousControlsMode = MidnightControlsConfig.controlsMode;
|
||||||
MidnightControlsConfig.controlsMode = ControlsMode.CONTROLLER;
|
MidnightControlsConfig.controlsMode = ControlsMode.CONTROLLER;
|
||||||
} else {
|
} else {
|
||||||
if (this.previousControlsMode == null) {
|
if (previousControlsMode == null) {
|
||||||
this.previousControlsMode = ControlsMode.DEFAULT;
|
previousControlsMode = ControlsMode.DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
MidnightControlsConfig.controlsMode = this.previousControlsMode;
|
MidnightControlsConfig.controlsMode = previousControlsMode;
|
||||||
}
|
}
|
||||||
ClientPlayNetworking.getSender().sendPacket(new ControlsModePacket(MidnightControlsConfig.controlsMode.getName()));
|
NetworkUtil.sendPayloadC2S(new ControlsModePayload(MidnightControlsConfig.controlsMode.getName()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -266,16 +212,18 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
|
|||||||
*
|
*
|
||||||
* @param enabled true if the HUD is enabled, else false
|
* @param enabled true if the HUD is enabled, else false
|
||||||
*/
|
*/
|
||||||
public void setHudEnabled(boolean enabled) {
|
public static void setHudEnabled(boolean enabled) {
|
||||||
MidnightControlsConfig.hudEnable = enabled;
|
MidnightControlsConfig.hudEnable = enabled;
|
||||||
this.hud.setVisible(enabled);
|
hud.setVisible(enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final MidnightControlsClient INSTANCE = new MidnightControlsClient();
|
||||||
/**
|
/**
|
||||||
* Gets the midnightcontrols client instance.
|
* Gets the midnightcontrols client instance.
|
||||||
*
|
*
|
||||||
* @return the midnightcontrols client instance
|
* @return the midnightcontrols client instance
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public static MidnightControlsClient get() {
|
public static MidnightControlsClient get() {
|
||||||
return INSTANCE;
|
return INSTANCE;
|
||||||
}
|
}
|
||||||
@@ -14,6 +14,7 @@ import com.google.common.collect.Maps;
|
|||||||
import com.mojang.blaze3d.platform.GlDebugInfo;
|
import com.mojang.blaze3d.platform.GlDebugInfo;
|
||||||
import eu.midnightdust.lib.config.MidnightConfig;
|
import eu.midnightdust.lib.config.MidnightConfig;
|
||||||
import eu.midnightdust.midnightcontrols.ControlsMode;
|
import eu.midnightdust.midnightcontrols.ControlsMode;
|
||||||
|
import eu.midnightdust.midnightcontrols.MidnightControls;
|
||||||
import eu.midnightdust.midnightcontrols.MidnightControlsFeature;
|
import eu.midnightdust.midnightcontrols.MidnightControlsFeature;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.Controller;
|
import eu.midnightdust.midnightcontrols.client.controller.Controller;
|
||||||
@@ -130,7 +131,7 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
*/
|
*/
|
||||||
public static void load() {
|
public static void load() {
|
||||||
MidnightControlsConfig.init("midnightcontrols", MidnightControlsConfig.class);
|
MidnightControlsConfig.init("midnightcontrols", MidnightControlsConfig.class);
|
||||||
MidnightControlsClient.get().log("Configuration loaded.");
|
MidnightControls.log("Configuration loaded.");
|
||||||
// Controller controls.
|
// Controller controls.
|
||||||
InputManager.loadButtonBindings();
|
InputManager.loadButtonBindings();
|
||||||
}
|
}
|
||||||
@@ -140,7 +141,7 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
*/
|
*/
|
||||||
public static void save() {
|
public static void save() {
|
||||||
MidnightControlsConfig.write("midnightcontrols");
|
MidnightControlsConfig.write("midnightcontrols");
|
||||||
MidnightControlsClient.get().log("Configuration saved.");
|
MidnightControls.log("Configuration saved.");
|
||||||
MidnightControlsFeature.refreshEnabled();
|
MidnightControlsFeature.refreshEnabled();
|
||||||
}
|
}
|
||||||
public static void updateBindingsForController(Controller controller) {
|
public static void updateBindingsForController(Controller controller) {
|
||||||
@@ -275,20 +276,20 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
buttons[count - 1] = Integer.parseInt(current);
|
buttons[count - 1] = Integer.parseInt(current);
|
||||||
}
|
}
|
||||||
if (count == 0) {
|
if (count == 0) {
|
||||||
MidnightControlsClient.get().warn("Malformed config value \"" + code + "\" for binding \"" + button.getName() + "\".");
|
MidnightControls.warn("Malformed config value \"" + code + "\" for binding \"" + button.getName() + "\".");
|
||||||
MidnightControlsConfig.setButtonBinding(button, new int[]{-1});
|
MidnightControlsConfig.setButtonBinding(button, new int[]{-1});
|
||||||
}
|
}
|
||||||
|
|
||||||
button.setButton(buttons);
|
button.setButton(buttons);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
MidnightControlsClient.get().warn("Malformed config value \"" + code + "\" for binding \"" + button.getName() + "\".");
|
MidnightControls.warn("Malformed config value \"" + code + "\" for binding \"" + button.getName() + "\".");
|
||||||
setButtonBinding(button, button.getButton());
|
setButtonBinding(button, button.getButton());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean checkValidity(@NotNull ButtonBinding binding, @NotNull String input, String group) {
|
private static boolean checkValidity(@NotNull ButtonBinding binding, @NotNull String input, String group) {
|
||||||
if (group == null) {
|
if (group == null) {
|
||||||
MidnightControlsClient.get().warn("Malformed config value \"" + input + "\" for binding \"" + binding.getName() + "\".");
|
MidnightControls.warn("Malformed config value \"" + input + "\" for binding \"" + binding.getName() + "\".");
|
||||||
setButtonBinding(binding, binding.getButton());
|
setButtonBinding(binding, binding.getButton());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -10,6 +10,7 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client;
|
package eu.midnightdust.midnightcontrols.client;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import net.minecraft.util.Pair;
|
||||||
import org.thinkingstudio.obsidianui.widget.AbstractSpruceWidget;
|
import org.thinkingstudio.obsidianui.widget.AbstractSpruceWidget;
|
||||||
import org.thinkingstudio.obsidianui.widget.container.SpruceEntryListWidget;
|
import org.thinkingstudio.obsidianui.widget.container.SpruceEntryListWidget;
|
||||||
import eu.midnightdust.midnightcontrols.MidnightControls;
|
import eu.midnightdust.midnightcontrols.MidnightControls;
|
||||||
@@ -50,7 +51,6 @@ import net.minecraft.client.gui.widget.*;
|
|||||||
import net.minecraft.screen.slot.Slot;
|
import net.minecraft.screen.slot.Slot;
|
||||||
import net.minecraft.text.TranslatableTextContent;
|
import net.minecraft.text.TranslatableTextContent;
|
||||||
import net.minecraft.util.math.MathHelper;
|
import net.minecraft.util.math.MathHelper;
|
||||||
import org.aperlambda.lambdacommon.utils.Pair;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
@@ -206,7 +206,7 @@ public class MidnightInput {
|
|||||||
client.player.getVehicle().onPassengerLookAround(client.player);
|
client.player.getVehicle().onPassengerLookAround(client.player);
|
||||||
}
|
}
|
||||||
client.getTutorialManager().onUpdateMouse(this.targetPitch, this.targetYaw);
|
client.getTutorialManager().onUpdateMouse(this.targetPitch, this.targetYaw);
|
||||||
MidnightControlsCompat.HANDLERS.forEach(handler -> handler.handleCamera(client, targetYaw, targetPitch));
|
MidnightControlsCompat.handleCamera(client, targetYaw, targetPitch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -386,7 +386,7 @@ public class MidnightInput {
|
|||||||
if (client.currentScreen instanceof HandledScreen<?> handledScreen && ((HandledScreenAccessor) handledScreen).midnightcontrols$getSlotAt(
|
if (client.currentScreen instanceof HandledScreen<?> handledScreen && ((HandledScreenAccessor) handledScreen).midnightcontrols$getSlotAt(
|
||||||
client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth(),
|
client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth(),
|
||||||
client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight()) != null) return;
|
client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight()) != null) return;
|
||||||
if (!this.ignoreNextARelease) {
|
if (!this.ignoreNextARelease && client.currentScreen != null) {
|
||||||
double mouseX = client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth();
|
double mouseX = client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth();
|
||||||
double mouseY = client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight();
|
double mouseY = client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight();
|
||||||
if (action == 0) {
|
if (action == 0) {
|
||||||
@@ -420,7 +420,7 @@ public class MidnightInput {
|
|||||||
if (client.currentScreen instanceof HandledScreen<?> handledScreen && ((HandledScreenAccessor) handledScreen).midnightcontrols$getSlotAt(
|
if (client.currentScreen instanceof HandledScreen<?> handledScreen && ((HandledScreenAccessor) handledScreen).midnightcontrols$getSlotAt(
|
||||||
client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth(),
|
client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth(),
|
||||||
client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight()) != null) return;
|
client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight()) != null) return;
|
||||||
if (!this.ignoreNextXRelease) {
|
if (!this.ignoreNextXRelease && client.currentScreen != null) {
|
||||||
double mouseX = client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth();
|
double mouseX = client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth();
|
||||||
double mouseY = client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight();
|
double mouseY = client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight();
|
||||||
if (action == 0) {
|
if (action == 0) {
|
||||||
@@ -530,8 +530,8 @@ public class MidnightInput {
|
|||||||
if (!MidnightControlsConfig.analogMovement) {
|
if (!MidnightControlsConfig.analogMovement) {
|
||||||
double deadZone = this.getDeadZoneValue(axis);
|
double deadZone = this.getDeadZoneValue(axis);
|
||||||
axisValue = (float) (absValue - deadZone);
|
axisValue = (float) (absValue - deadZone);
|
||||||
axisValue /= (1.0 - deadZone);
|
axisValue /= (float) (1.0 - deadZone);
|
||||||
axisValue *= deadZone;
|
axisValue *= (float) deadZone;
|
||||||
}
|
}
|
||||||
|
|
||||||
axisValue = (float) Math.min(axisValue / MidnightControlsConfig.getAxisMaxValue(axis), 1);
|
axisValue = (float) Math.min(axisValue / MidnightControlsConfig.getAxisMaxValue(axis), 1);
|
||||||
@@ -757,25 +757,31 @@ public class MidnightInput {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean handleRightLeftElement(@NotNull Element element, boolean right) {
|
private boolean handleRightLeftElement(@NotNull Element element, boolean right) {
|
||||||
if (element instanceof SpruceElement spruceElement) {
|
switch (element) {
|
||||||
if (spruceElement.requiresCursor())
|
case SpruceElement spruceElement -> {
|
||||||
return true;
|
if (spruceElement.requiresCursor())
|
||||||
return !spruceElement.onNavigation(right ? NavigationDirection.RIGHT : NavigationDirection.LEFT, false);
|
return true;
|
||||||
}
|
return !spruceElement.onNavigation(right ? NavigationDirection.RIGHT : NavigationDirection.LEFT, false);
|
||||||
if (element instanceof SliderWidget slider) {
|
}
|
||||||
if (slider.active) {
|
case SliderWidget slider -> {
|
||||||
slider.keyPressed(right ? 262 : 263, 0, 0);
|
if (slider.active) {
|
||||||
this.actionGuiCooldown = 2; // Prevent to press too quickly the focused element, so we have to skip 5 ticks.
|
slider.keyPressed(right ? 262 : 263, 0, 0);
|
||||||
return true;
|
this.actionGuiCooldown = 2; // Prevent to press too quickly the focused element, so we have to skip 5 ticks.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case AlwaysSelectedEntryListWidget<?> alwaysSelectedEntryListWidget -> {
|
||||||
|
//TODO ((EntryListWidgetAccessor) element).midnightcontrols$moveSelection(right ? EntryListWidget.MoveDirection.DOWN : EntryListWidget.MoveDirection.UP);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
case ParentElement entryList -> {
|
||||||
|
var focused = entryList.getFocused();
|
||||||
|
if (focused == null)
|
||||||
|
return true;
|
||||||
|
return this.handleRightLeftElement(focused, right);
|
||||||
|
}
|
||||||
|
default -> {
|
||||||
}
|
}
|
||||||
} else if (element instanceof AlwaysSelectedEntryListWidget) {
|
|
||||||
//TODO((EntryListWidgetAccessor) element).midnightcontrols$moveSelection(right ? EntryListWidget.MoveDirection.DOWN : EntryListWidget.MoveDirection.UP);
|
|
||||||
return false;
|
|
||||||
} else if (element instanceof ParentElement entryList) {
|
|
||||||
var focused = entryList.getFocused();
|
|
||||||
if (focused == null)
|
|
||||||
return true;
|
|
||||||
return this.handleRightLeftElement(focused, right);
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -821,7 +827,7 @@ public class MidnightInput {
|
|||||||
xState = state;
|
xState = state;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (axis == GLFW_GAMEPAD_AXIS_RIGHT_Y && client.player != null) {
|
if (axis == GLFW_GAMEPAD_AXIS_RIGHT_Y) {
|
||||||
double yStep = (MidnightControlsConfig.yAxisRotationSpeed / 100) * 0.6000000238418579 + 0.20000000298023224;
|
double yStep = (MidnightControlsConfig.yAxisRotationSpeed / 100) * 0.6000000238418579 + 0.20000000298023224;
|
||||||
double xStep = (MidnightControlsConfig.rotationSpeed / 100) * 0.6000000238418579 + 0.20000000298023224;
|
double xStep = (MidnightControlsConfig.rotationSpeed / 100) * 0.6000000238418579 + 0.20000000298023224;
|
||||||
|
|
||||||
@@ -858,7 +864,7 @@ public class MidnightInput {
|
|||||||
if (spruceScreen.onNavigation(direction, false)) {
|
if (spruceScreen.onNavigation(direction, false)) {
|
||||||
this.actionGuiCooldown = 5;
|
this.actionGuiCooldown = 5;
|
||||||
}
|
}
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
switch (direction) {
|
switch (direction) {
|
||||||
case UP -> pressKeyboardKey(screen, GLFW.GLFW_KEY_UP);
|
case UP -> pressKeyboardKey(screen, GLFW.GLFW_KEY_UP);
|
||||||
@@ -867,8 +873,8 @@ public class MidnightInput {
|
|||||||
case RIGHT -> pressKeyboardKey(screen, GLFW.GLFW_KEY_RIGHT);
|
case RIGHT -> pressKeyboardKey(screen, GLFW.GLFW_KEY_RIGHT);
|
||||||
}
|
}
|
||||||
this.actionGuiCooldown = 5;
|
this.actionGuiCooldown = 5;
|
||||||
return false;
|
return true;
|
||||||
} catch (Exception exception) {MidnightControls.get().warn("Unknown exception encountered while trying to change focus: "+exception);}
|
} catch (Exception exception) {MidnightControls.warn("Unknown exception encountered while trying to change focus: "+exception);}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -881,7 +887,7 @@ public class MidnightInput {
|
|||||||
// Inspired from https://github.com/MrCrayfish/Controllable/blob/1.14.X/src/main/java/com/mrcrayfish/controllable/client/ControllerInput.java#L686.
|
// Inspired from https://github.com/MrCrayfish/Controllable/blob/1.14.X/src/main/java/com/mrcrayfish/controllable/client/ControllerInput.java#L686.
|
||||||
private void moveMouseToClosestSlot(@NotNull MinecraftClient client, @Nullable Screen screen) {
|
private void moveMouseToClosestSlot(@NotNull MinecraftClient client, @Nullable Screen screen) {
|
||||||
// Makes the mouse attracted to slots. This helps with selecting items when using a controller.
|
// Makes the mouse attracted to slots. This helps with selecting items when using a controller.
|
||||||
if (screen instanceof HandledScreen inventoryScreen) {
|
if (screen instanceof HandledScreen<?> inventoryScreen) {
|
||||||
var accessor = (HandledScreenAccessor) inventoryScreen;
|
var accessor = (HandledScreenAccessor) inventoryScreen;
|
||||||
int guiLeft = accessor.getX();
|
int guiLeft = accessor.getX();
|
||||||
int guiTop = accessor.getY();
|
int guiTop = accessor.getY();
|
||||||
@@ -896,12 +902,12 @@ public class MidnightInput {
|
|||||||
|
|
||||||
// Distance between the slot and the cursor.
|
// Distance between the slot and the cursor.
|
||||||
double distance = Math.sqrt(Math.pow(x - mouseX, 2) + Math.pow(y - mouseY, 2));
|
double distance = Math.sqrt(Math.pow(x - mouseX, 2) + Math.pow(y - mouseY, 2));
|
||||||
return Pair.of(slot, distance);
|
return new Pair<Slot, Double>(slot, distance);
|
||||||
}).filter(entry -> entry.value <= 14.0)
|
}).filter(entry -> entry.getRight() <= 14.0)
|
||||||
.min(Comparator.comparingDouble(p -> p.value));
|
.min(Comparator.comparingDouble(Pair::getRight));
|
||||||
|
|
||||||
if (closestSlot.isPresent()) {
|
if (closestSlot.isPresent() && client.player != null) {
|
||||||
var slot = closestSlot.get().key;
|
var slot = closestSlot.get().getLeft();
|
||||||
if (slot.hasStack() || !client.player.getInventory().getMainHandStack().isEmpty()) {
|
if (slot.hasStack() || !client.player.getInventory().getMainHandStack().isEmpty()) {
|
||||||
int slotCenterXScaled = guiLeft + slot.x + 8;
|
int slotCenterXScaled = guiLeft + slot.x + 8;
|
||||||
int slotCenterYScaled = guiTop + slot.y + 8;
|
int slotCenterYScaled = guiTop + slot.y + 8;
|
||||||
@@ -911,8 +917,8 @@ public class MidnightInput {
|
|||||||
double deltaY = slotCenterY - targetMouseY;
|
double deltaY = slotCenterY - targetMouseY;
|
||||||
|
|
||||||
if (mouseX != slotCenterXScaled || mouseY != slotCenterYScaled) {
|
if (mouseX != slotCenterXScaled || mouseY != slotCenterYScaled) {
|
||||||
this.targetMouseX += deltaX * 0.75;
|
this.targetMouseX += (int) (deltaX * 0.75);
|
||||||
this.targetMouseY += deltaY * 0.75;
|
this.targetMouseY += (int) (deltaY * 0.75);
|
||||||
} else {
|
} else {
|
||||||
this.mouseSpeedX *= 0.3F;
|
this.mouseSpeedX *= 0.3F;
|
||||||
this.mouseSpeedY *= 0.3F;
|
this.mouseSpeedY *= 0.3F;
|
||||||
@@ -120,7 +120,7 @@ public class MidnightReacharound {
|
|||||||
if (!MidnightControlsFeature.HORIZONTAL_REACHAROUND.isAvailable())
|
if (!MidnightControlsFeature.HORIZONTAL_REACHAROUND.isAvailable())
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
if (client.player != null && client.crosshairTarget != null && client.crosshairTarget.getType() == HitResult.Type.MISS
|
if (client.world != null && client.player != null && client.crosshairTarget != null && client.crosshairTarget.getType() == HitResult.Type.MISS
|
||||||
&& client.player.isOnGround() && client.player.getPitch(0.f) >= 35.f) {
|
&& client.player.isOnGround() && client.player.getPitch(0.f) >= 35.f) {
|
||||||
if (client.player.isRiding())
|
if (client.player.isRiding())
|
||||||
return null;
|
return null;
|
||||||
@@ -9,14 +9,8 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.compat;
|
package eu.midnightdust.midnightcontrols.client.compat;
|
||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
|
||||||
import me.juancarloscp52.bedrockify.client.BedrockifyClient;
|
import me.juancarloscp52.bedrockify.client.BedrockifyClient;
|
||||||
import me.juancarloscp52.bedrockify.client.BedrockifyClientSettings;
|
import me.juancarloscp52.bedrockify.client.BedrockifyClientSettings;
|
||||||
import net.minecraft.client.gui.screen.Screen;
|
|
||||||
import org.aperlambda.lambdacommon.utils.LambdaReflection;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents HQM compatibility handler.
|
* Represents HQM compatibility handler.
|
||||||
@@ -28,7 +22,7 @@ import java.util.Optional;
|
|||||||
public class BedrockifyCompat implements CompatHandler {
|
public class BedrockifyCompat implements CompatHandler {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handle(@NotNull MidnightControlsClient mod) {
|
public void handle() {
|
||||||
BedrockifyClient.getInstance().settings.disableFlyingMomentum = false;
|
BedrockifyClient.getInstance().settings.disableFlyingMomentum = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -26,12 +26,20 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
* @since 1.1.0
|
* @since 1.1.0
|
||||||
*/
|
*/
|
||||||
public interface CompatHandler {
|
public interface CompatHandler {
|
||||||
|
/**
|
||||||
|
* Handles compatibility of a mod.
|
||||||
|
*/
|
||||||
|
default void handle() {
|
||||||
|
handle(MidnightControlsClient.get());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles compatibility of a mod.
|
* Handles compatibility of a mod.
|
||||||
*
|
*
|
||||||
* @param mod this mod instance
|
* @param mod this mod instance
|
||||||
*/
|
*/
|
||||||
void handle(@NotNull MidnightControlsClient mod);
|
@Deprecated
|
||||||
|
default void handle(@NotNull MidnightControlsClient mod) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles custom camera updates
|
* Handles custom camera updates
|
||||||
@@ -40,6 +48,15 @@ public interface CompatHandler {
|
|||||||
*/
|
*/
|
||||||
default void handleCamera(@NotNull MinecraftClient client, double targetYaw, double targetPitch) {};
|
default void handleCamera(@NotNull MinecraftClient client, double targetYaw, double targetPitch) {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles custom tab behavior
|
||||||
|
*
|
||||||
|
* @param forward whether the direction is forward or backward
|
||||||
|
*/
|
||||||
|
default boolean handleTabs(Screen screen, boolean forward) {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether the mouse is required on the specified screen.
|
* Returns whether the mouse is required on the specified screen.
|
||||||
*
|
*
|
||||||
@@ -7,34 +7,33 @@ import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
|||||||
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.ButtonCategory;
|
import eu.midnightdust.midnightcontrols.client.controller.ButtonCategory;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
||||||
import org.aperlambda.lambdacommon.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
|
||||||
public class EMICompat implements CompatHandler {
|
public class EMICompat implements CompatHandler {
|
||||||
public static boolean handleTabs(boolean direction) {
|
public static boolean handleEmiPages(boolean direction) {
|
||||||
if (isEMIEnabled() && MidnightControlsClient.get().input.actionGuiCooldown == 0 && EmiScreenManager.getSearchPanel() != null && EmiScreenManager.getSearchPanel().pageLeft != null && EmiScreenManager.getSearchPanel().pageRight != null) {
|
if (isEMIEnabled() && MidnightControlsClient.input.actionGuiCooldown == 0 && EmiScreenManager.getSearchPanel() != null && EmiScreenManager.getSearchPanel().pageLeft != null && EmiScreenManager.getSearchPanel().pageRight != null) {
|
||||||
if (direction) EmiScreenManager.getSearchPanel().pageRight.onPress();
|
if (direction) EmiScreenManager.getSearchPanel().pageRight.onPress();
|
||||||
else EmiScreenManager.getSearchPanel().pageLeft.onPress();
|
else EmiScreenManager.getSearchPanel().pageLeft.onPress();
|
||||||
MidnightControlsClient.get().input.actionGuiCooldown = 5;
|
MidnightControlsClient.input.actionGuiCooldown = 5;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public void handle(@NotNull MidnightControlsClient mod) {
|
public void handle() {
|
||||||
ButtonCategory category = new ButtonCategory(new Identifier("midnightcontrols","category.emi"));
|
ButtonCategory category = new ButtonCategory(Identifier.of("midnightcontrols","category.emi"));
|
||||||
InputManager.registerCategory(category);
|
InputManager.registerCategory(category);
|
||||||
new ButtonBinding.Builder("emi_page_left")
|
new ButtonBinding.Builder("emi_page_left")
|
||||||
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_LEFT_BUMPER, ButtonBinding.axisAsButton(GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, true))
|
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_LEFT_BUMPER, ButtonBinding.axisAsButton(GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, true))
|
||||||
.category(category)
|
.category(category)
|
||||||
.action((client,action,value,buttonState)->handleTabs(false)).cooldown()
|
.action((client,action,value,buttonState)->handleEmiPages(false)).cooldown()
|
||||||
.filter(((client, buttonBinding) -> EmiApi.getHandledScreen() != null))
|
.filter(((client, buttonBinding) -> EmiApi.getHandledScreen() != null))
|
||||||
.register();
|
.register();
|
||||||
new ButtonBinding.Builder("emi_page_right")
|
new ButtonBinding.Builder("emi_page_right")
|
||||||
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER, ButtonBinding.axisAsButton(GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER, true))
|
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER, ButtonBinding.axisAsButton(GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER, true))
|
||||||
.category(category)
|
.category(category)
|
||||||
.action((client,action,value,buttonState)->handleTabs(true)).cooldown()
|
.action((client,action,value,buttonState)->handleEmiPages(true)).cooldown()
|
||||||
.filter(((client, buttonBinding) -> EmiApi.getHandledScreen() != null))
|
.filter(((client, buttonBinding) -> EmiApi.getHandledScreen() != null))
|
||||||
.register();
|
.register();
|
||||||
}
|
}
|
||||||
@@ -14,8 +14,8 @@ public class EmotecraftCompat {
|
|||||||
public static boolean isEmotecraftScreen(Screen screen) {
|
public static boolean isEmotecraftScreen(Screen screen) {
|
||||||
return screen instanceof FastChosseScreen;
|
return screen instanceof FastChosseScreen;
|
||||||
}
|
}
|
||||||
public static void handleEmoteSelector(int index) {
|
|
||||||
|
|
||||||
|
public static void handleEmoteSelector(int index) {
|
||||||
if (client.currentScreen instanceof FastChosseScreen) {
|
if (client.currentScreen instanceof FastChosseScreen) {
|
||||||
int x = client.getWindow().getWidth() / 2;
|
int x = client.getWindow().getWidth() / 2;
|
||||||
int y = client.getWindow().getHeight() / 2;
|
int y = client.getWindow().getHeight() / 2;
|
||||||
@@ -9,10 +9,8 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.compat;
|
package eu.midnightdust.midnightcontrols.client.compat;
|
||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
|
||||||
import net.minecraft.client.gui.screen.Screen;
|
import net.minecraft.client.gui.screen.Screen;
|
||||||
import org.aperlambda.lambdacommon.utils.LambdaReflection;
|
import org.aperlambda.lambdacommon.utils.LambdaReflection;
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@@ -30,7 +28,7 @@ public class HQMCompat implements CompatHandler {
|
|||||||
private Optional<Class<?>> guiBaseClass;
|
private Optional<Class<?>> guiBaseClass;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handle(@NotNull MidnightControlsClient mod) {
|
public void handle() {
|
||||||
this.guiBaseClass = LambdaReflection.getClass(GUI_BASE_CLASS_PATH);
|
this.guiBaseClass = LambdaReflection.getClass(GUI_BASE_CLASS_PATH);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5,9 +5,15 @@ import net.minecraft.client.gui.screen.Screen;
|
|||||||
import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
|
import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
|
||||||
import net.minecraft.client.gui.screen.ingame.HandledScreen;
|
import net.minecraft.client.gui.screen.ingame.HandledScreen;
|
||||||
|
|
||||||
public class InventoryTabsCompat {
|
public class InventoryTabsCompat implements CompatHandler {
|
||||||
|
private static InventoryTabsCompat INSTANCE;
|
||||||
|
@Override
|
||||||
|
public void handle() {
|
||||||
|
INSTANCE = this;
|
||||||
|
}
|
||||||
|
|
||||||
public static void handleInventoryTabs(Screen screen, boolean next) {
|
@Override
|
||||||
|
public boolean handleTabs(Screen screen, boolean next) {
|
||||||
if (screen instanceof HandledScreen<?> && !(screen instanceof CreativeInventoryScreen)) {
|
if (screen instanceof HandledScreen<?> && !(screen instanceof CreativeInventoryScreen)) {
|
||||||
TabManager tabManager = TabManager.getInstance();
|
TabManager tabManager = TabManager.getInstance();
|
||||||
int tabIndex = tabManager.tabs.indexOf(tabManager.currentTab);
|
int tabIndex = tabManager.tabs.indexOf(tabManager.currentTab);
|
||||||
@@ -18,7 +24,12 @@ public class InventoryTabsCompat {
|
|||||||
if (tabIndex > 0) tabManager.onTabClick(tabManager.tabs.get(tabIndex - 1));
|
if (tabIndex > 0) tabManager.onTabClick(tabManager.tabs.get(tabIndex - 1));
|
||||||
else tabManager.onTabClick(tabManager.tabs.get(tabManager.tabs.size() - 1));
|
else tabManager.onTabClick(tabManager.tabs.get(tabManager.tabs.size() - 1));
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
public static boolean handleInventoryTabs(Screen screen, boolean next) {
|
||||||
|
return INSTANCE.handleTabs(screen, next);
|
||||||
}
|
}
|
||||||
public static void handleInventoryPage(Screen screen, boolean next) {
|
public static void handleInventoryPage(Screen screen, boolean next) {
|
||||||
if (screen instanceof HandledScreen<?> && !(screen instanceof CreativeInventoryScreen)) {
|
if (screen instanceof HandledScreen<?> && !(screen instanceof CreativeInventoryScreen)) {
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.compat;
|
package eu.midnightdust.midnightcontrols.client.compat;
|
||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
import eu.midnightdust.lib.util.PlatformFunctions;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
||||||
import net.fabricmc.loader.api.FabricLoader;
|
import net.fabricmc.loader.api.FabricLoader;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
@@ -23,41 +23,53 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import static eu.midnightdust.midnightcontrols.MidnightControls.log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a compatibility handler.
|
* Represents a compatibility handler.
|
||||||
*
|
*
|
||||||
* @author LambdAurora
|
* @author LambdAurora, Motschen
|
||||||
* @version 1.5.0
|
* @version 1.10.0
|
||||||
* @since 1.1.0
|
* @since 1.1.0
|
||||||
*/
|
*/
|
||||||
public class MidnightControlsCompat {
|
public class MidnightControlsCompat {
|
||||||
public static final List<CompatHandler> HANDLERS = new ArrayList<>();
|
private static final List<CompatHandler> HANDLERS = new ArrayList<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initializes compatibility with other mods if needed.
|
* Initializes compatibility with other mods if needed.
|
||||||
*
|
|
||||||
* @param mod the mod instance
|
|
||||||
*/
|
*/
|
||||||
public static void init(@NotNull MidnightControlsClient mod) {
|
public static void init() {
|
||||||
// "okzoomer" is the mod ID used by Fabric-compatible versions of Ok Zoomer. (5.0.0-beta.6 and below.)
|
// "okzoomer" is the mod ID used by Fabric-compatible versions of Ok Zoomer. (5.0.0-beta.6 and below.)
|
||||||
// "ok_zoomer" is the mod ID used by Quilt-exclusive versions of Ok Zoomer. (5.0.0-beta.7 and above.)
|
// "ok_zoomer" is the mod ID used by Quilt-exclusive versions of Ok Zoomer. (5.0.0-beta.7 and above.)
|
||||||
if (FabricLoader.getInstance().isModLoaded("okzoomer") || FabricLoader.getInstance().isModLoaded("ok_zoomer")) {
|
if (FabricLoader.getInstance().isModLoaded("okzoomer") || FabricLoader.getInstance().isModLoaded("ok_zoomer")) {
|
||||||
mod.log("Adding Ok Zoomer compatibility...");
|
log("Adding Ok Zoomer compatibility...");
|
||||||
HANDLERS.add(new OkZoomerCompat());
|
registerCompatHandler(new OkZoomerCompat());
|
||||||
}
|
}
|
||||||
if (isEMIPresent()) {
|
if (isEMIPresent()) {
|
||||||
mod.log("Adding EMI compatibility...");
|
log("Adding EMI compatibility...");
|
||||||
HANDLERS.add(new EMICompat());
|
registerCompatHandler(new EMICompat());
|
||||||
}
|
}
|
||||||
if (FabricLoader.getInstance().isModLoaded("hardcorequesting") && LambdaReflection.doesClassExist(HQMCompat.GUI_BASE_CLASS_PATH)) {
|
if (FabricLoader.getInstance().isModLoaded("hardcorequesting") && LambdaReflection.doesClassExist(HQMCompat.GUI_BASE_CLASS_PATH)) {
|
||||||
mod.log("Adding HQM compatibility...");
|
log("Adding HQM compatibility...");
|
||||||
HANDLERS.add(new HQMCompat());
|
registerCompatHandler(new HQMCompat());
|
||||||
}
|
}
|
||||||
if (FabricLoader.getInstance().isModLoaded("bedrockify")) {
|
if (FabricLoader.getInstance().isModLoaded("bedrockify")) {
|
||||||
mod.log("Adding Bedrockify compatibility...");
|
log("Adding Bedrockify compatibility...");
|
||||||
HANDLERS.add(new BedrockifyCompat());
|
registerCompatHandler(new BedrockifyCompat());
|
||||||
}
|
}
|
||||||
HANDLERS.forEach(handler -> handler.handle(mod));
|
if (PlatformFunctions.isModLoaded("yet-another-config-lib")) {
|
||||||
|
log("Adding YACL compatibility...");
|
||||||
|
registerCompatHandler(new YACLCompat());
|
||||||
|
}
|
||||||
|
if (PlatformFunctions.isModLoaded("sodium")) {
|
||||||
|
log("Adding Sodium compatibility...");
|
||||||
|
registerCompatHandler(new SodiumCompat());
|
||||||
|
}
|
||||||
|
if (PlatformFunctions.isModLoaded("inventorytabs")) {
|
||||||
|
log("Adding Inventory Tabs compatibility...");
|
||||||
|
registerCompatHandler(new InventoryTabsCompat());
|
||||||
|
}
|
||||||
|
HANDLERS.forEach(CompatHandler::handle);
|
||||||
InputManager.loadButtonBindings();
|
InputManager.loadButtonBindings();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,7 +98,16 @@ public class MidnightControlsCompat {
|
|||||||
* @return true if the mouse is requried on the specified screen, else false
|
* @return true if the mouse is requried on the specified screen, else false
|
||||||
*/
|
*/
|
||||||
public static boolean requireMouseOnScreen(Screen screen) {
|
public static boolean requireMouseOnScreen(Screen screen) {
|
||||||
return HANDLERS.stream().anyMatch(handler -> handler.requireMouseOnScreen(screen));
|
return streamCompatHandlers().anyMatch(handler -> handler.requireMouseOnScreen(screen));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Handles custom tabs for modded screens
|
||||||
|
*
|
||||||
|
* @param screen the screen
|
||||||
|
* @return true if the handle was fired and succeed, else false
|
||||||
|
*/
|
||||||
|
public static boolean handleTabs(Screen screen, boolean forward) {
|
||||||
|
return streamCompatHandlers().anyMatch(handler -> handler.handleTabs(screen, forward));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -154,22 +175,24 @@ public class MidnightControlsCompat {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether Roughly Enough Items is present.
|
* Handles the camera movement.
|
||||||
*
|
*
|
||||||
* @return true if Roughly Enough Items is present, else false
|
* @param client the client instance
|
||||||
|
* @param targetYaw the target yaw
|
||||||
|
* @param targetPitch the target pitch
|
||||||
*/
|
*/
|
||||||
public static boolean isReiPresent() {
|
public static void handleCamera(@NotNull MinecraftClient client, double targetYaw, double targetPitch) {
|
||||||
return FabricLoader.getInstance().isModLoaded("roughlyenoughitems");
|
MidnightControlsCompat.HANDLERS.forEach(handler -> handler.handleCamera(client, targetYaw, targetPitch));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether EMI is present.
|
* Returns whether EMI is present.
|
||||||
*
|
*
|
||||||
* @return true if EMI is present, else false
|
* @return true if EMI is present, else false
|
||||||
*/
|
*/
|
||||||
public static boolean isEMIPresent() {
|
public static boolean isEMIPresent() {
|
||||||
return FabricLoader.getInstance().isModLoaded("emi");
|
return PlatformFunctions.isModLoaded("emi");
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Returns whether InventoryTabs is present.
|
* Returns whether InventoryTabs is present.
|
||||||
@@ -177,7 +200,7 @@ public class MidnightControlsCompat {
|
|||||||
* @return true if InventoryTabs is present, else false
|
* @return true if InventoryTabs is present, else false
|
||||||
*/
|
*/
|
||||||
public static boolean isInventoryTabsPresent() {
|
public static boolean isInventoryTabsPresent() {
|
||||||
return FabricLoader.getInstance().isModLoaded("inventorytabs");
|
return PlatformFunctions.isModLoaded("inventorytabs");
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Returns whether Emotecraft is present.
|
* Returns whether Emotecraft is present.
|
||||||
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.compat;
|
package eu.midnightdust.midnightcontrols.client.compat;
|
||||||
|
|
||||||
|
import eu.midnightdust.midnightcontrols.MidnightControls;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
||||||
import net.minecraft.client.option.KeyBinding;
|
import net.minecraft.client.option.KeyBinding;
|
||||||
@@ -59,7 +60,7 @@ public class OkZoomerCompat implements CompatHandler {
|
|||||||
// First, we need to determine which version of the Ok Zoomer API we're dealing with here.
|
// First, we need to determine which version of the Ok Zoomer API we're dealing with here.
|
||||||
if (LambdaReflection.doesClassExist("io.github.ennuil.okzoomer.keybinds.ZoomKeybinds")) {
|
if (LambdaReflection.doesClassExist("io.github.ennuil.okzoomer.keybinds.ZoomKeybinds")) {
|
||||||
// https://github.com/EnnuiL/OkZoomer/blob/5.0.0-beta.3+1.17.1/src/main/java/io/github/ennuil/okzoomer/keybinds/ZoomKeybinds.java
|
// https://github.com/EnnuiL/OkZoomer/blob/5.0.0-beta.3+1.17.1/src/main/java/io/github/ennuil/okzoomer/keybinds/ZoomKeybinds.java
|
||||||
MidnightControlsClient.get().log("Ok Zoomer version 5.0.0-beta.3 or below detected!");
|
MidnightControls.log("Ok Zoomer version 5.0.0-beta.3 or below detected!");
|
||||||
|
|
||||||
okZoomerZoomKeybindsClassString = "io.github.ennuil.okzoomer.keybinds.ZoomKeybinds";
|
okZoomerZoomKeybindsClassString = "io.github.ennuil.okzoomer.keybinds.ZoomKeybinds";
|
||||||
|
|
||||||
@@ -71,7 +72,7 @@ public class OkZoomerCompat implements CompatHandler {
|
|||||||
okZoomerAreExtraKeyBindsEnabledMethodNameString = "areExtraKeybindsEnabled";
|
okZoomerAreExtraKeyBindsEnabledMethodNameString = "areExtraKeybindsEnabled";
|
||||||
} else if (LambdaReflection.doesClassExist("io.github.ennuil.okzoomer.key_binds.ZoomKeyBinds")) {
|
} else if (LambdaReflection.doesClassExist("io.github.ennuil.okzoomer.key_binds.ZoomKeyBinds")) {
|
||||||
// https://github.com/EnnuiL/OkZoomer/blob/5.0.0-beta.6+1.18.2/src/main/java/io/github/ennuil/okzoomer/key_binds/ZoomKeyBinds.java
|
// https://github.com/EnnuiL/OkZoomer/blob/5.0.0-beta.6+1.18.2/src/main/java/io/github/ennuil/okzoomer/key_binds/ZoomKeyBinds.java
|
||||||
MidnightControlsClient.get().log("Ok Zoomer version 5.0.0-beta.6, 5.0.0-beta.5, or 5.0.0-beta.4 detected!");
|
MidnightControls.log("Ok Zoomer version 5.0.0-beta.6, 5.0.0-beta.5, or 5.0.0-beta.4 detected!");
|
||||||
|
|
||||||
okZoomerZoomKeybindsClassString = "io.github.ennuil.okzoomer.key_binds.ZoomKeyBinds";
|
okZoomerZoomKeybindsClassString = "io.github.ennuil.okzoomer.key_binds.ZoomKeyBinds";
|
||||||
|
|
||||||
@@ -83,7 +84,7 @@ public class OkZoomerCompat implements CompatHandler {
|
|||||||
okZoomerAreExtraKeyBindsEnabledMethodNameString = "areExtraKeyBindsEnabled";
|
okZoomerAreExtraKeyBindsEnabledMethodNameString = "areExtraKeyBindsEnabled";
|
||||||
} else if (LambdaReflection.doesClassExist("io.github.ennuil.ok_zoomer.key_binds.ZoomKeyBinds")) {
|
} else if (LambdaReflection.doesClassExist("io.github.ennuil.ok_zoomer.key_binds.ZoomKeyBinds")) {
|
||||||
// https://github.com/EnnuiL/OkZoomer/blob/5.0.0-beta.7+1.18.2/src/main/java/io/github/ennuil/ok_zoomer/key_binds/ZoomKeyBinds.java
|
// https://github.com/EnnuiL/OkZoomer/blob/5.0.0-beta.7+1.18.2/src/main/java/io/github/ennuil/ok_zoomer/key_binds/ZoomKeyBinds.java
|
||||||
MidnightControlsClient.get().log("Ok Zoomer version 5.0.0-beta.7 (Quilt) or above detected!");
|
MidnightControls.log("Ok Zoomer version 5.0.0-beta.7 (Quilt) or above detected!");
|
||||||
|
|
||||||
okZoomerZoomKeybindsClassString = "io.github.ennuil.ok_zoomer.key_binds.ZoomKeyBinds";
|
okZoomerZoomKeybindsClassString = "io.github.ennuil.ok_zoomer.key_binds.ZoomKeyBinds";
|
||||||
|
|
||||||
@@ -95,7 +96,7 @@ public class OkZoomerCompat implements CompatHandler {
|
|||||||
okZoomerAreExtraKeyBindsEnabledMethodNameString = "areExtraKeyBindsEnabled";
|
okZoomerAreExtraKeyBindsEnabledMethodNameString = "areExtraKeyBindsEnabled";
|
||||||
} else {
|
} else {
|
||||||
// If all of the above checks fail, then the version of the Ok Zoomer API that the user is trying to use is too new.
|
// If all of the above checks fail, then the version of the Ok Zoomer API that the user is trying to use is too new.
|
||||||
MidnightControlsClient.get().warn("The version of Ok Zoomer that you are currently using is too new, and is not yet supported by MidnightControls!");
|
MidnightControls.warn("The version of Ok Zoomer that you are currently using is too new, and is not yet supported by MidnightControls!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,7 +105,7 @@ public class OkZoomerCompat implements CompatHandler {
|
|||||||
okZoomerZoomKeybindsClass = Class.forName(okZoomerZoomKeybindsClassString);
|
okZoomerZoomKeybindsClass = Class.forName(okZoomerZoomKeybindsClassString);
|
||||||
} catch (ClassNotFoundException exception) {
|
} catch (ClassNotFoundException exception) {
|
||||||
// This theoretically should never happen.
|
// This theoretically should never happen.
|
||||||
MidnightControlsClient.get().warn("MidnightControls failed to reflect to the Ok Zoomer keybinds class!");
|
MidnightControls.warn("MidnightControls failed to reflect to the Ok Zoomer keybinds class!");
|
||||||
exception.printStackTrace();
|
exception.printStackTrace();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -116,7 +117,7 @@ public class OkZoomerCompat implements CompatHandler {
|
|||||||
okZoomerDecreaseZoomKeyField = okZoomerZoomKeybindsClass.getField(okZoomerDecreaseZoomKeyFieldString);
|
okZoomerDecreaseZoomKeyField = okZoomerZoomKeybindsClass.getField(okZoomerDecreaseZoomKeyFieldString);
|
||||||
okZoomerResetZoomKeyField = okZoomerZoomKeybindsClass.getField(okZoomerResetZoomKeyFieldString);
|
okZoomerResetZoomKeyField = okZoomerZoomKeybindsClass.getField(okZoomerResetZoomKeyFieldString);
|
||||||
} catch (NoSuchFieldException exception) {
|
} catch (NoSuchFieldException exception) {
|
||||||
MidnightControlsClient.get().warn("MidnightControls failed to reflect to the Ok Zoomer keybind fields!");
|
MidnightControls.warn("MidnightControls failed to reflect to the Ok Zoomer keybind fields!");
|
||||||
exception.printStackTrace();
|
exception.printStackTrace();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -128,7 +129,7 @@ public class OkZoomerCompat implements CompatHandler {
|
|||||||
okZoomerDecreaseZoomKey = (KeyBinding) okZoomerDecreaseZoomKeyField.get(null);
|
okZoomerDecreaseZoomKey = (KeyBinding) okZoomerDecreaseZoomKeyField.get(null);
|
||||||
okZoomerResetZoomKey = (KeyBinding) okZoomerResetZoomKeyField.get(null);
|
okZoomerResetZoomKey = (KeyBinding) okZoomerResetZoomKeyField.get(null);
|
||||||
} catch (IllegalAccessException exception) {
|
} catch (IllegalAccessException exception) {
|
||||||
MidnightControlsClient.get().warn("MidnightControls failed to reflect to the Ok Zoomer keybind objects!");
|
MidnightControls.warn("MidnightControls failed to reflect to the Ok Zoomer keybind objects!");
|
||||||
exception.printStackTrace();
|
exception.printStackTrace();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -138,7 +139,7 @@ public class OkZoomerCompat implements CompatHandler {
|
|||||||
try {
|
try {
|
||||||
okZoomerAreExtraKeyBindsEnabledMethod = okZoomerZoomKeybindsClass.getDeclaredMethod(okZoomerAreExtraKeyBindsEnabledMethodNameString);
|
okZoomerAreExtraKeyBindsEnabledMethod = okZoomerZoomKeybindsClass.getDeclaredMethod(okZoomerAreExtraKeyBindsEnabledMethodNameString);
|
||||||
} catch (NoSuchMethodException exception) {
|
} catch (NoSuchMethodException exception) {
|
||||||
MidnightControlsClient.get().warn("MidnightControls failed to reflect to an Ok Zoomer method (areExtraKeyBindsEnabled / areExtraKeybindsEnabled)!");
|
MidnightControls.warn("MidnightControls failed to reflect to an Ok Zoomer method (areExtraKeyBindsEnabled / areExtraKeybindsEnabled)!");
|
||||||
exception.printStackTrace();
|
exception.printStackTrace();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -147,7 +148,7 @@ public class OkZoomerCompat implements CompatHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handle(@NotNull MidnightControlsClient mod) {
|
public void handle() {
|
||||||
if (didAllReflectionCallsSucceed) {
|
if (didAllReflectionCallsSucceed) {
|
||||||
new ButtonBinding.Builder("zoom")
|
new ButtonBinding.Builder("zoom")
|
||||||
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP, GLFW.GLFW_GAMEPAD_BUTTON_X)
|
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP, GLFW.GLFW_GAMEPAD_BUTTON_X)
|
||||||
@@ -161,10 +162,10 @@ public class OkZoomerCompat implements CompatHandler {
|
|||||||
try {
|
try {
|
||||||
okZoomerAreExtraKeyBindsEnabled = (boolean) okZoomerAreExtraKeyBindsEnabledMethod.invoke(null);
|
okZoomerAreExtraKeyBindsEnabled = (boolean) okZoomerAreExtraKeyBindsEnabledMethod.invoke(null);
|
||||||
} catch (IllegalAccessException exception) {
|
} catch (IllegalAccessException exception) {
|
||||||
MidnightControlsClient.get().warn("MidnightControls encountered an IllegalAccessException while attempting to invoke a reflected Ok Zoomer method (areExtraKeyBindsEnabled / areExtraKeybindsEnabled)!");
|
MidnightControls.warn("MidnightControls encountered an IllegalAccessException while attempting to invoke a reflected Ok Zoomer method (areExtraKeyBindsEnabled / areExtraKeybindsEnabled)!");
|
||||||
exception.printStackTrace();
|
exception.printStackTrace();
|
||||||
} catch (InvocationTargetException exception) {
|
} catch (InvocationTargetException exception) {
|
||||||
MidnightControlsClient.get().warn("MidnightControls encountered an InvocationTargetException while attempting to invoke a reflected Ok Zoomer method (areExtraKeyBindsEnabled / areExtraKeybindsEnabled)!");
|
MidnightControls.warn("MidnightControls encountered an InvocationTargetException while attempting to invoke a reflected Ok Zoomer method (areExtraKeyBindsEnabled / areExtraKeybindsEnabled)!");
|
||||||
exception.printStackTrace();
|
exception.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,20 +1,20 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.compat;
|
package eu.midnightdust.midnightcontrols.client.compat;
|
||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.MidnightControls;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.compat.mixin.sodium.SodiumOptionsGUIAccessor;
|
import eu.midnightdust.midnightcontrols.client.compat.mixin.sodium.SodiumOptionsGUIAccessor;
|
||||||
import me.jellysquid.mods.sodium.client.gui.SodiumOptionsGUI;
|
import me.jellysquid.mods.sodium.client.gui.SodiumOptionsGUI;
|
||||||
import net.minecraft.client.gui.screen.Screen;
|
import net.minecraft.client.gui.screen.Screen;
|
||||||
|
|
||||||
public class SodiumCompat {
|
public class SodiumCompat implements CompatHandler {
|
||||||
public static void handleTabs(Screen screen, boolean direction) {
|
@Override
|
||||||
|
public boolean handleTabs(Screen screen, boolean direction) {
|
||||||
if (screen instanceof SodiumOptionsGUI optionsGUI) {
|
if (screen instanceof SodiumOptionsGUI optionsGUI) {
|
||||||
SodiumOptionsGUIAccessor accessor = (SodiumOptionsGUIAccessor) optionsGUI;
|
SodiumOptionsGUIAccessor accessor = (SodiumOptionsGUIAccessor) optionsGUI;
|
||||||
final int max = accessor.getPages().size()-1;
|
final int max = accessor.getPages().size()-1;
|
||||||
int i = accessor.getPages().indexOf(accessor.getCurrentPage());
|
int i = accessor.getPages().indexOf(accessor.getCurrentPage());
|
||||||
i = (direction ? ((max > i) ? ++i : 0) : (i > 0 ? --i : max));
|
i = (direction ? ((max > i) ? ++i : 0) : (i > 0 ? --i : max));
|
||||||
if (MidnightControlsConfig.debug) MidnightControls.get().log(""+i);
|
|
||||||
optionsGUI.setPage(accessor.getPages().get(i));
|
optionsGUI.setPage(accessor.getPages().get(i));
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9,10 +9,10 @@ import net.minecraft.client.gui.Element;
|
|||||||
import net.minecraft.client.gui.screen.Screen;
|
import net.minecraft.client.gui.screen.Screen;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
|
||||||
public class YACLCompat {
|
public class YACLCompat implements CompatHandler {
|
||||||
public static boolean handleAButton(Screen screen, Element element) {
|
public static boolean handleAButton(Screen screen, Element element) {
|
||||||
if (element instanceof AbstractWidget abstractWidget) {
|
if (element instanceof AbstractWidget abstractWidget) {
|
||||||
// imitate ender key press
|
// imitate enter key press
|
||||||
return abstractWidget.keyPressed(GLFW.GLFW_KEY_ENTER, 0, 0);
|
return abstractWidget.keyPressed(GLFW.GLFW_KEY_ENTER, 0, 0);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -41,7 +41,8 @@ public class YACLCompat {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean handleCategories(Screen screen, boolean direction) {
|
@Override
|
||||||
|
public boolean handleTabs(Screen screen, boolean direction) {
|
||||||
if (screen instanceof YACLScreen yaclScreen) {
|
if (screen instanceof YACLScreen yaclScreen) {
|
||||||
int categoryIdx = yaclScreen.getCurrentCategoryIdx();
|
int categoryIdx = yaclScreen.getCurrentCategoryIdx();
|
||||||
if (direction) categoryIdx++; else categoryIdx--;
|
if (direction) categoryIdx++; else categoryIdx--;
|
||||||
@@ -49,7 +49,7 @@ public class ButtonBinding {
|
|||||||
public static final ButtonBinding CONTROLS_RING = new Builder("controls_ring").buttons(GLFW_GAMEPAD_BUTTON_GUIDE).onlyInGame().cooldown()
|
public static final ButtonBinding CONTROLS_RING = new Builder("controls_ring").buttons(GLFW_GAMEPAD_BUTTON_GUIDE).onlyInGame().cooldown()
|
||||||
.action((client, button1, value, action) -> {
|
.action((client, button1, value, action) -> {
|
||||||
if (action.isPressed()) {
|
if (action.isPressed()) {
|
||||||
MidnightControlsClient.get().ring.loadFromUnbound();
|
MidnightControlsClient.ring.loadFromUnbound();
|
||||||
client.setScreen(new RingScreen());
|
client.setScreen(new RingScreen());
|
||||||
}
|
}
|
||||||
if (action.isUnpressed() && client.currentScreen != null) client.currentScreen.close();
|
if (action.isUnpressed() && client.currentScreen != null) client.currentScreen.close();
|
||||||
@@ -114,10 +114,10 @@ public class ButtonBinding {
|
|||||||
private KeyBinding mcKeyBinding = null;
|
private KeyBinding mcKeyBinding = null;
|
||||||
protected PairPredicate<MinecraftClient, ButtonBinding> filter;
|
protected PairPredicate<MinecraftClient, ButtonBinding> filter;
|
||||||
private final List<PressAction> actions = new ArrayList<>(Collections.singletonList(PressAction.DEFAULT_ACTION));
|
private final List<PressAction> actions = new ArrayList<>(Collections.singletonList(PressAction.DEFAULT_ACTION));
|
||||||
private boolean hasCooldown;
|
private final boolean hasCooldown;
|
||||||
private int cooldownLength = 5;
|
private int cooldownLength = 5;
|
||||||
private int cooldown = 0;
|
private int cooldown = 0;
|
||||||
boolean pressed = false;
|
private boolean pressed = false;
|
||||||
|
|
||||||
public ButtonBinding(String key, int[] defaultButton, List<PressAction> actions, PairPredicate<MinecraftClient, ButtonBinding> filter, boolean hasCooldown) {
|
public ButtonBinding(String key, int[] defaultButton, List<PressAction> actions, PairPredicate<MinecraftClient, ButtonBinding> filter, boolean hasCooldown) {
|
||||||
this.setButton(this.defaultButton = defaultButton);
|
this.setButton(this.defaultButton = defaultButton);
|
||||||
@@ -164,6 +164,14 @@ public class ButtonBinding {
|
|||||||
if (InputManager.hasBinding(this))
|
if (InputManager.hasBinding(this))
|
||||||
InputManager.sortBindings();
|
InputManager.sortBindings();
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Sets the button press state.
|
||||||
|
*
|
||||||
|
* @param pressed whether the button is pressed
|
||||||
|
*/
|
||||||
|
public void setPressed(boolean pressed) {
|
||||||
|
this.pressed = pressed;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether the bound button is the specified button or not.
|
* Returns whether the bound button is the specified button or not.
|
||||||
@@ -179,8 +187,18 @@ public class ButtonBinding {
|
|||||||
* Returns whether this button is down or not.
|
* Returns whether this button is down or not.
|
||||||
*
|
*
|
||||||
* @return true if the button is down, else false
|
* @return true if the button is down, else false
|
||||||
|
* @deprecated Use {@link #isPressed()} instead
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public boolean isButtonDown() {
|
public boolean isButtonDown() {
|
||||||
|
return isPressed();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns whether this button is down or not.
|
||||||
|
*
|
||||||
|
* @return true if the button is down, else false
|
||||||
|
*/
|
||||||
|
public boolean isPressed() {
|
||||||
return this.pressed;
|
return this.pressed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -10,8 +10,7 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.controller;
|
package eu.midnightdust.midnightcontrols.client.controller;
|
||||||
|
|
||||||
import net.minecraft.client.resource.language.I18n;
|
import net.minecraft.client.resource.language.I18n;
|
||||||
import org.aperlambda.lambdacommon.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
import org.aperlambda.lambdacommon.utils.Identifiable;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -26,7 +25,7 @@ import java.util.List;
|
|||||||
* @version 1.1.0
|
* @version 1.1.0
|
||||||
* @since 1.1.0
|
* @since 1.1.0
|
||||||
*/
|
*/
|
||||||
public class ButtonCategory implements Identifiable {
|
public class ButtonCategory {
|
||||||
private final List<ButtonBinding> bindings = new ArrayList<>();
|
private final List<ButtonBinding> bindings = new ArrayList<>();
|
||||||
private final Identifier id;
|
private final Identifier id;
|
||||||
private final int priority;
|
private final int priority;
|
||||||
@@ -72,9 +71,9 @@ public class ButtonCategory implements Identifiable {
|
|||||||
*/
|
*/
|
||||||
public @NotNull String getTranslatedName() {
|
public @NotNull String getTranslatedName() {
|
||||||
if (this.id.getNamespace().equals("minecraft"))
|
if (this.id.getNamespace().equals("minecraft"))
|
||||||
return I18n.translate(this.id.getName());
|
return I18n.translate(this.id.getPath());
|
||||||
else
|
else
|
||||||
return I18n.translate(this.id.getNamespace() + "." + this.id.getName());
|
return I18n.translate(this.id.getNamespace() + "." + this.id.getPath());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -87,7 +86,6 @@ public class ButtonCategory implements Identifiable {
|
|||||||
return this.priority;
|
return this.priority;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull Identifier getIdentifier() {
|
public @NotNull Identifier getIdentifier() {
|
||||||
return this.id;
|
return this.id;
|
||||||
}
|
}
|
||||||
@@ -24,7 +24,7 @@ import org.lwjgl.system.MemoryStack;
|
|||||||
import org.lwjgl.system.MemoryUtil;
|
import org.lwjgl.system.MemoryUtil;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.URL;
|
import java.net.URI;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
@@ -99,7 +99,7 @@ public record Controller(int id) implements Nameable {
|
|||||||
|
|
||||||
public static Controller byId(int id) {
|
public static Controller byId(int id) {
|
||||||
if (id > GLFW.GLFW_JOYSTICK_LAST) {
|
if (id > GLFW.GLFW_JOYSTICK_LAST) {
|
||||||
MidnightControlsClient.get().log("Controller '" + id + "' doesn't exist.");
|
MidnightControls.log("Controller '" + id + "' doesn't exist.");
|
||||||
id = GLFW.GLFW_JOYSTICK_LAST;
|
id = GLFW.GLFW_JOYSTICK_LAST;
|
||||||
}
|
}
|
||||||
Controller controller;
|
Controller controller;
|
||||||
@@ -122,11 +122,10 @@ public record Controller(int id) implements Nameable {
|
|||||||
* Reads the specified resource and returns the raw data as a ByteBuffer.
|
* Reads the specified resource and returns the raw data as a ByteBuffer.
|
||||||
*
|
*
|
||||||
* @param resource the resource to read
|
* @param resource the resource to read
|
||||||
* @param bufferSize the initial buffer size
|
|
||||||
* @return the resource data
|
* @return the resource data
|
||||||
* @throws IOException If an IO error occurs.
|
* @throws IOException If an IO error occurs.
|
||||||
*/
|
*/
|
||||||
private static ByteBuffer ioResourceToBuffer(String resource, int bufferSize) throws IOException {
|
private static ByteBuffer ioResourceToBuffer(String resource) throws IOException {
|
||||||
ByteBuffer buffer = null;
|
ByteBuffer buffer = null;
|
||||||
|
|
||||||
var path = Paths.get(resource);
|
var path = Paths.get(resource);
|
||||||
@@ -150,15 +149,15 @@ public record Controller(int id) implements Nameable {
|
|||||||
}
|
}
|
||||||
private static boolean updateMappingsSync() {
|
private static boolean updateMappingsSync() {
|
||||||
try {
|
try {
|
||||||
MidnightControlsClient.get().log("Updating controller mappings...");
|
MidnightControls.log("Updating controller mappings...");
|
||||||
Optional<File> databaseFile = getDatabaseFile();
|
Optional<File> databaseFile = getDatabaseFile();
|
||||||
if (databaseFile.isPresent()) {
|
if (databaseFile.isPresent()) {
|
||||||
var database = ioResourceToBuffer(databaseFile.get().getPath(), 1024);
|
var database = ioResourceToBuffer(databaseFile.get().getPath());
|
||||||
if (database != null) GLFW.glfwUpdateGamepadMappings(database);
|
if (database != null) GLFW.glfwUpdateGamepadMappings(database);
|
||||||
}
|
}
|
||||||
if (!MidnightControlsClient.MAPPINGS_FILE.exists())
|
if (!MidnightControlsClient.MAPPINGS_FILE.exists())
|
||||||
return false;
|
return false;
|
||||||
var buffer = ioResourceToBuffer(MidnightControlsClient.MAPPINGS_FILE.getPath(), 1024);
|
var buffer = ioResourceToBuffer(MidnightControlsClient.MAPPINGS_FILE.getPath());
|
||||||
if (buffer != null) GLFW.glfwUpdateGamepadMappings(buffer);
|
if (buffer != null) GLFW.glfwUpdateGamepadMappings(buffer);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.fillInStackTrace();
|
e.fillInStackTrace();
|
||||||
@@ -175,7 +174,7 @@ public record Controller(int id) implements Nameable {
|
|||||||
client.getToastManager().add(SystemToast.create(client, SystemToast.Type.PERIODIC_NOTIFICATION,
|
client.getToastManager().add(SystemToast.create(client, SystemToast.Type.PERIODIC_NOTIFICATION,
|
||||||
Text.translatable("midnightcontrols.controller.mappings.error"), Text.literal(string)));
|
Text.translatable("midnightcontrols.controller.mappings.error"), Text.literal(string)));
|
||||||
}
|
}
|
||||||
MidnightControls.get().log(I18n.translate("midnightcontrols.controller.mappings.error")+string);
|
MidnightControls.log(I18n.translate("midnightcontrols.controller.mappings.error")+string);
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
/* Ignored :concern: */
|
/* Ignored :concern: */
|
||||||
@@ -188,7 +187,7 @@ public record Controller(int id) implements Nameable {
|
|||||||
if (!controller.isConnected())
|
if (!controller.isConnected())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
MidnightControls.get().log(String.format("Controller #%d name: \"%s\"\n GUID: %s\n Gamepad: %s",
|
MidnightControls.log(String.format("Controller #%d name: \"%s\"\n GUID: %s\n Gamepad: %s",
|
||||||
controller.id,
|
controller.id,
|
||||||
controller.getName(),
|
controller.getName(),
|
||||||
controller.getGuid(),
|
controller.getGuid(),
|
||||||
@@ -201,7 +200,7 @@ public record Controller(int id) implements Nameable {
|
|||||||
private static Optional<File> getDatabaseFile() {
|
private static Optional<File> getDatabaseFile() {
|
||||||
File databaseFile = new File("config/gamecontrollerdatabase.txt");
|
File databaseFile = new File("config/gamecontrollerdatabase.txt");
|
||||||
try {
|
try {
|
||||||
BufferedInputStream in = new BufferedInputStream(new URL("https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt").openStream());
|
BufferedInputStream in = new BufferedInputStream(URI.create("https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt").toURL().openStream());
|
||||||
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(databaseFile));
|
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(databaseFile));
|
||||||
byte[] dataBuffer = new byte[1024];
|
byte[] dataBuffer = new byte[1024];
|
||||||
int bytesRead;
|
int bytesRead;
|
||||||
@@ -10,41 +10,32 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.controller;
|
package eu.midnightdust.midnightcontrols.client.controller;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import eu.midnightdust.lib.util.PlatformFunctions;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.ButtonState;
|
import eu.midnightdust.midnightcontrols.client.enums.ButtonState;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightInput;
|
import eu.midnightdust.midnightcontrols.client.MidnightInput;
|
||||||
import eu.midnightdust.midnightcontrols.client.compat.InventoryTabsCompat;
|
import eu.midnightdust.midnightcontrols.client.compat.InventoryTabsCompat;
|
||||||
import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat;
|
import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat;
|
||||||
import eu.midnightdust.midnightcontrols.client.compat.SodiumCompat;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.compat.YACLCompat;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.RingScreen;
|
import eu.midnightdust.midnightcontrols.client.gui.RingScreen;
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay;
|
import eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay;
|
||||||
import eu.midnightdust.midnightcontrols.client.mixin.*;
|
import eu.midnightdust.midnightcontrols.client.mixin.*;
|
||||||
import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor;
|
import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor;
|
||||||
import net.fabricmc.loader.api.FabricLoader;
|
import eu.midnightdust.midnightcontrols.client.util.InventoryUtil;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.util.ToggleSneakSprintUtil;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.util.platform.ItemGroupUtil;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.gui.screen.TitleScreen;
|
import net.minecraft.client.gui.screen.TitleScreen;
|
||||||
import net.minecraft.client.gui.screen.advancement.AdvancementsScreen;
|
import net.minecraft.client.gui.screen.advancement.AdvancementsScreen;
|
||||||
import net.minecraft.client.gui.screen.ingame.*;
|
import net.minecraft.client.gui.screen.ingame.*;
|
||||||
import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget;
|
import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget;
|
||||||
import net.minecraft.client.gui.widget.PressableWidget;
|
|
||||||
import net.minecraft.client.gui.widget.TabNavigationWidget;
|
import net.minecraft.client.gui.widget.TabNavigationWidget;
|
||||||
import net.minecraft.client.util.ScreenshotRecorder;
|
import net.minecraft.client.util.ScreenshotRecorder;
|
||||||
import net.minecraft.item.ItemGroup;
|
|
||||||
import net.minecraft.item.ItemGroups;
|
|
||||||
import net.minecraft.screen.slot.Slot;
|
import net.minecraft.screen.slot.Slot;
|
||||||
import net.minecraft.screen.slot.SlotActionType;
|
import net.minecraft.screen.slot.SlotActionType;
|
||||||
import net.minecraft.util.math.MathHelper;
|
import net.minecraft.util.math.MathHelper;
|
||||||
import org.aperlambda.lambdacommon.utils.Pair;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.Predicate;
|
|
||||||
|
|
||||||
import static org.lwjgl.glfw.GLFW.*;
|
import static org.lwjgl.glfw.GLFW.*;
|
||||||
import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_2;
|
import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_2;
|
||||||
@@ -56,13 +47,9 @@ import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_2;
|
|||||||
* @version 1.7.0
|
* @version 1.7.0
|
||||||
* @since 1.1.0
|
* @since 1.1.0
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("UnstableApiUsage")
|
|
||||||
public class InputHandlers {
|
public class InputHandlers {
|
||||||
private InputHandlers() {
|
private InputHandlers() {
|
||||||
}
|
}
|
||||||
private static List<ItemGroup> getVisibleGroups(CreativeInventoryScreen screen) {
|
|
||||||
return (screen.getItemGroupsOnPage(screen.getCurrentPage()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static PressAction handleHotbar(boolean next) {
|
public static PressAction handleHotbar(boolean next) {
|
||||||
return (client, button, value, action) -> {
|
return (client, button, value, action) -> {
|
||||||
@@ -87,34 +74,9 @@ public class InputHandlers {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} else if (client.currentScreen instanceof RingScreen) {
|
} else if (client.currentScreen instanceof RingScreen) {
|
||||||
MidnightControlsClient.get().ring.cyclePage(next);
|
MidnightControlsClient.ring.cyclePage(next);
|
||||||
} else if (client.currentScreen instanceof CreativeInventoryScreenAccessor inventory) {
|
} else if (client.currentScreen instanceof CreativeInventoryScreenAccessor inventory) {
|
||||||
if (PlatformFunctions.isModLoaded("connectormod")) return true;
|
inventory.midnightcontrols$setSelectedTab(ItemGroupUtil.cycleTab(next, client));
|
||||||
ItemGroup currentTab = CreativeInventoryScreenAccessor.getSelectedTab();
|
|
||||||
int currentColumn = currentTab.getColumn();
|
|
||||||
ItemGroup.Row currentRow = currentTab.getRow();
|
|
||||||
ItemGroup newTab = null;
|
|
||||||
List<ItemGroup> visibleTabs = getVisibleGroups((CreativeInventoryScreen) client.currentScreen);
|
|
||||||
for (ItemGroup tab : visibleTabs) {
|
|
||||||
if (tab.getRow().equals(currentRow) && ((newTab == null && ((next && tab.getColumn() > currentColumn) ||
|
|
||||||
(!next && tab.getColumn() < currentColumn))) || (newTab != null && ((next && tab.getColumn() > currentColumn && tab.getColumn() < newTab.getColumn()) ||
|
|
||||||
(!next && tab.getColumn() < currentColumn && tab.getColumn() > newTab.getColumn())))))
|
|
||||||
newTab = tab;
|
|
||||||
}
|
|
||||||
if (newTab == null)
|
|
||||||
for (ItemGroup tab : visibleTabs) {
|
|
||||||
if ((tab.getRow().compareTo(currentRow)) != 0 && ((next && newTab == null || next && newTab.getColumn() > tab.getColumn()) || (!next && newTab == null) || (!next && newTab.getColumn() < tab.getColumn())))
|
|
||||||
newTab = tab;
|
|
||||||
}
|
|
||||||
if (newTab == null) {
|
|
||||||
for (ItemGroup tab : visibleTabs) {
|
|
||||||
if ((next && tab.getRow() == ItemGroup.Row.TOP && tab.getColumn() == 0) ||
|
|
||||||
!next && tab.getRow() == ItemGroup.Row.BOTTOM && (newTab == null || tab.getColumn() > newTab.getColumn()))
|
|
||||||
newTab = tab;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (newTab == null || newTab.equals(currentTab)) newTab = ItemGroups.getDefaultTab();
|
|
||||||
inventory.midnightcontrols$setSelectedTab(newTab);
|
|
||||||
return true;
|
return true;
|
||||||
} else if (client.currentScreen instanceof InventoryScreen || client.currentScreen instanceof CraftingScreen || client.currentScreen instanceof AbstractFurnaceScreen<?>) {
|
} else if (client.currentScreen instanceof InventoryScreen || client.currentScreen instanceof CraftingScreen || client.currentScreen instanceof AbstractFurnaceScreen<?>) {
|
||||||
RecipeBookWidget recipeBook;
|
RecipeBookWidget recipeBook;
|
||||||
@@ -168,36 +130,18 @@ public class InputHandlers {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
} else {
|
} else return MidnightControlsCompat.handleTabs(client.currentScreen, next);
|
||||||
if (FabricLoader.getInstance().isModLoaded("sodium"))
|
|
||||||
SodiumCompat.handleTabs(client.currentScreen, next);
|
|
||||||
if (FabricLoader.getInstance().isModLoaded("yet-another-config-lib") && YACLCompat.handleCategories(client.currentScreen, next))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (MidnightControlsCompat.isInventoryTabsPresent()) InventoryTabsCompat.handleInventoryTabs(client.currentScreen, next);
|
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public static PressAction handlePage(boolean next) {
|
public static PressAction handlePage(boolean next) {
|
||||||
return (client, button, value, action) -> {
|
return (client, button, value, action) -> {
|
||||||
if (action == ButtonState.RELEASE)
|
if (action == ButtonState.RELEASE)
|
||||||
return false;
|
return false;
|
||||||
if (client.currentScreen instanceof CreativeInventoryScreen) {
|
if (client.currentScreen instanceof CreativeInventoryScreen creativeScreen) {
|
||||||
try {
|
return ItemGroupUtil.cyclePage(next, creativeScreen);
|
||||||
return client.currentScreen.children().stream().filter(element -> element instanceof PressableWidget)
|
|
||||||
.map(element -> (PressableWidget) element)
|
|
||||||
.filter(element -> element.getMessage() != null && element.getMessage().getContent() != null)
|
|
||||||
.anyMatch(element -> {
|
|
||||||
if (next && element.getMessage().getString().equals(">")) {
|
|
||||||
element.onPress();
|
|
||||||
return true;
|
|
||||||
} else if (element.getMessage().getString().equals("<")) {
|
|
||||||
element.onPress();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
} catch (Exception ignored) {}
|
|
||||||
}
|
}
|
||||||
if (MidnightControlsCompat.isInventoryTabsPresent()) InventoryTabsCompat.handleInventoryPage(client.currentScreen, next);
|
if (MidnightControlsCompat.isInventoryTabsPresent()) InventoryTabsCompat.handleInventoryPage(client.currentScreen, next);
|
||||||
|
|
||||||
@@ -208,7 +152,7 @@ public class InputHandlers {
|
|||||||
return (client, button, value, action) -> {
|
return (client, button, value, action) -> {
|
||||||
if (client.currentScreen != null && client.currentScreen.getClass() != TitleScreen.class) {
|
if (client.currentScreen != null && client.currentScreen.getClass() != TitleScreen.class) {
|
||||||
if (!MidnightControlsCompat.handleMenuBack(client, client.currentScreen))
|
if (!MidnightControlsCompat.handleMenuBack(client, client.currentScreen))
|
||||||
if (!MidnightControlsClient.get().input.tryGoBack(client.currentScreen))
|
if (!MidnightControlsClient.input.tryGoBack(client.currentScreen))
|
||||||
client.currentScreen.close();
|
client.currentScreen.close();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -221,13 +165,13 @@ public class InputHandlers {
|
|||||||
if (client.interactionManager == null || client.player == null)
|
if (client.interactionManager == null || client.player == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (MidnightControlsClient.get().input.inventoryInteractionCooldown > 0)
|
if (MidnightControlsClient.input.inventoryInteractionCooldown > 0)
|
||||||
return true;
|
return true;
|
||||||
double x = client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth();
|
double x = client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth();
|
||||||
double y = client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight();
|
double y = client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight();
|
||||||
|
|
||||||
var accessor = (HandledScreenAccessor) screen;
|
var accessor = (HandledScreenAccessor) screen;
|
||||||
Slot slot = ((HandledScreenAccessor) screen).midnightcontrols$getSlotAt(x, y);
|
Slot slot = accessor.midnightcontrols$getSlotAt(x, y);
|
||||||
|
|
||||||
int slotId;
|
int slotId;
|
||||||
if (slot == null) {
|
if (slot == null) {
|
||||||
@@ -242,7 +186,7 @@ public class InputHandlers {
|
|||||||
var actionType = SlotActionType.PICKUP;
|
var actionType = SlotActionType.PICKUP;
|
||||||
int clickData = GLFW.GLFW_MOUSE_BUTTON_1;
|
int clickData = GLFW.GLFW_MOUSE_BUTTON_1;
|
||||||
|
|
||||||
MidnightControlsClient.get().input.inventoryInteractionCooldown = 5;
|
MidnightControlsClient.input.inventoryInteractionCooldown = 5;
|
||||||
switch (button.getName()) {
|
switch (button.getName()) {
|
||||||
case "take_all" -> {
|
case "take_all" -> {
|
||||||
if (screen instanceof CreativeInventoryScreen) {
|
if (screen instanceof CreativeInventoryScreen) {
|
||||||
@@ -294,95 +238,25 @@ public class InputHandlers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean handleToggleSneak(@NotNull MinecraftClient client, @NotNull ButtonBinding button, float value, @NotNull ButtonState action) {
|
public static boolean handleToggleSneak(@NotNull MinecraftClient client, @NotNull ButtonBinding button, float value, @NotNull ButtonState action) {
|
||||||
button.asKeyBinding().ifPresent(binding -> {
|
return ToggleSneakSprintUtil.toggleSneak(button);
|
||||||
boolean sneakToggled = client.options.getSneakToggled().getValue();
|
|
||||||
if (client.player.getAbilities().flying && sneakToggled)
|
|
||||||
client.options.getSneakToggled().setValue(false);
|
|
||||||
else if (MidnightControlsConfig.controllerToggleSneak != sneakToggled)
|
|
||||||
client.options.getSneakToggled().setValue(!sneakToggled);
|
|
||||||
binding.setPressed(button.pressed);
|
|
||||||
if (client.player.getAbilities().flying && sneakToggled)
|
|
||||||
client.options.getSneakToggled().setValue(true);
|
|
||||||
else if (MidnightControlsConfig.controllerToggleSneak != sneakToggled)
|
|
||||||
client.options.getSneakToggled().setValue(sneakToggled);
|
|
||||||
});
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
public static boolean handleToggleSprint(@NotNull MinecraftClient client, @NotNull ButtonBinding button, float value, @NotNull ButtonState action) {
|
public static boolean handleToggleSprint(@NotNull MinecraftClient client, @NotNull ButtonBinding button, float value, @NotNull ButtonState action) {
|
||||||
button.asKeyBinding().ifPresent(binding -> {
|
return ToggleSneakSprintUtil.toggleSprint(button);
|
||||||
boolean sprintToggled = client.options.getSprintToggled().getValue();
|
|
||||||
if (client.player.getAbilities().flying && sprintToggled)
|
|
||||||
client.options.getSprintToggled().setValue(false);
|
|
||||||
else if (MidnightControlsConfig.controllerToggleSprint != sprintToggled)
|
|
||||||
client.options.getSprintToggled().setValue(!sprintToggled);
|
|
||||||
binding.setPressed(button.pressed);
|
|
||||||
if (client.player.getAbilities().flying && sprintToggled)
|
|
||||||
client.options.getSprintToggled().setValue(true);
|
|
||||||
else if (MidnightControlsConfig.controllerToggleSprint != sprintToggled)
|
|
||||||
client.options.getSprintToggled().setValue(sprintToggled);
|
|
||||||
});
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static PressAction handleInventorySlotPad(int direction) {
|
public static PressAction handleInventorySlotPad(int direction) {
|
||||||
return (client, binding, value, action) -> {
|
return (client, binding, value, action) -> {
|
||||||
if (!(client.currentScreen instanceof HandledScreen inventory && action != ButtonState.RELEASE))
|
if (!(client.currentScreen instanceof HandledScreen<?> inventory && action != ButtonState.RELEASE))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
var accessor = (HandledScreenAccessor) inventory;
|
var accessor = (HandledScreenAccessor) inventory;
|
||||||
int guiLeft = accessor.getX();
|
|
||||||
int guiTop = accessor.getY();
|
|
||||||
double mouseX = client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth();
|
|
||||||
double mouseY = client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight();
|
|
||||||
|
|
||||||
// Finds the hovered slot.
|
Optional<Slot> closestSlot = InventoryUtil.findClosestSlot(inventory, direction);
|
||||||
var mouseSlot = accessor.midnightcontrols$getSlotAt(mouseX, mouseY);
|
|
||||||
|
|
||||||
// Finds the closest slot in the GUI within 14 pixels.
|
|
||||||
Optional<Slot> closestSlot = inventory.getScreenHandler().slots.parallelStream()
|
|
||||||
.filter(Predicate.isEqual(mouseSlot).negate())
|
|
||||||
.map(slot -> {
|
|
||||||
int posX = guiLeft + slot.x + 8;
|
|
||||||
int posY = guiTop + slot.y + 8;
|
|
||||||
|
|
||||||
int otherPosX = (int) mouseX;
|
|
||||||
int otherPosY = (int) mouseY;
|
|
||||||
if (mouseSlot != null) {
|
|
||||||
otherPosX = guiLeft + mouseSlot.x + 8;
|
|
||||||
otherPosY = guiTop + mouseSlot.y + 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Distance between the slot and the cursor.
|
|
||||||
double distance = Math.sqrt(Math.pow(posX - otherPosX, 2) + Math.pow(posY - otherPosY, 2));
|
|
||||||
return Pair.of(slot, distance);
|
|
||||||
}).filter(entry -> {
|
|
||||||
var slot = entry.key;
|
|
||||||
int posX = guiLeft + slot.x + 8;
|
|
||||||
int posY = guiTop + slot.y + 8;
|
|
||||||
int otherPosX = (int) mouseX;
|
|
||||||
int otherPosY = (int) mouseY;
|
|
||||||
if (mouseSlot != null) {
|
|
||||||
otherPosX = guiLeft + mouseSlot.x + 8;
|
|
||||||
otherPosY = guiTop + mouseSlot.y + 8;
|
|
||||||
}
|
|
||||||
if (direction == 0)
|
|
||||||
return posY < otherPosY;
|
|
||||||
else if (direction == 1)
|
|
||||||
return posY > otherPosY;
|
|
||||||
else if (direction == 2)
|
|
||||||
return posX > otherPosX;
|
|
||||||
else if (direction == 3)
|
|
||||||
return posX < otherPosX;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
})
|
|
||||||
.min(Comparator.comparingDouble(p -> p.value))
|
|
||||||
.map(p -> p.key);
|
|
||||||
|
|
||||||
if (closestSlot.isPresent()) {
|
if (closestSlot.isPresent()) {
|
||||||
var slot = closestSlot.get();
|
var slot = closestSlot.get();
|
||||||
int x = guiLeft + slot.x + 8;
|
int x = accessor.getX() + slot.x + 8;
|
||||||
int y = guiTop + slot.y + 8;
|
int y = accessor.getY() + slot.y + 8;
|
||||||
InputManager.queueMousePosition(x * (double) client.getWindow().getWidth() / (double) client.getWindow().getScaledWidth(),
|
InputManager.queueMousePosition(x * (double) client.getWindow().getWidth() / (double) client.getWindow().getScaledWidth(),
|
||||||
y * (double) client.getWindow().getHeight() / (double) client.getWindow().getScaledHeight());
|
y * (double) client.getWindow().getHeight() / (double) client.getWindow().getScaledHeight());
|
||||||
return true;
|
return true;
|
||||||
@@ -410,7 +284,7 @@ public class InputHandlers {
|
|||||||
* @return true if the client is in game, else false
|
* @return true if the client is in game, else false
|
||||||
*/
|
*/
|
||||||
public static boolean inGame(@NotNull MinecraftClient client, @NotNull ButtonBinding binding) {
|
public static boolean inGame(@NotNull MinecraftClient client, @NotNull ButtonBinding binding) {
|
||||||
return (client.currentScreen == null && MidnightControlsClient.get().input.screenCloseCooldown <= 0) || client.currentScreen instanceof TouchscreenOverlay || client.currentScreen instanceof RingScreen;
|
return (client.currentScreen == null && MidnightControlsClient.input.screenCloseCooldown <= 0) || client.currentScreen instanceof TouchscreenOverlay || client.currentScreen instanceof RingScreen;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -19,8 +19,8 @@ import net.minecraft.client.MinecraftClient;
|
|||||||
import net.minecraft.client.option.KeyBinding;
|
import net.minecraft.client.option.KeyBinding;
|
||||||
import net.minecraft.client.resource.language.I18n;
|
import net.minecraft.client.resource.language.I18n;
|
||||||
import net.minecraft.client.util.InputUtil;
|
import net.minecraft.client.util.InputUtil;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
import net.minecraft.util.math.MathHelper;
|
import net.minecraft.util.math.MathHelper;
|
||||||
import org.aperlambda.lambdacommon.Identifier;
|
|
||||||
import org.aperlambda.lambdacommon.utils.function.PairPredicate;
|
import org.aperlambda.lambdacommon.utils.function.PairPredicate;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
@@ -126,7 +126,7 @@ public class InputManager {
|
|||||||
* @return true if the binding is registered, else false
|
* @return true if the binding is registered, else false
|
||||||
*/
|
*/
|
||||||
public static boolean hasBinding(@NotNull Identifier identifier) {
|
public static boolean hasBinding(@NotNull Identifier identifier) {
|
||||||
return hasBinding(identifier.getNamespace() + "." + identifier.getName());
|
return hasBinding(identifier.getNamespace() + "." + identifier.getPath());
|
||||||
}
|
}
|
||||||
private static ButtonBinding tempBinding;
|
private static ButtonBinding tempBinding;
|
||||||
/**
|
/**
|
||||||
@@ -165,19 +165,21 @@ public class InputManager {
|
|||||||
return binding;
|
return binding;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static @NotNull ButtonBinding registerBinding(@NotNull Identifier id, int[] defaultButton, @NotNull List<PressAction> actions, @NotNull PairPredicate<MinecraftClient, ButtonBinding> filter, boolean hasCooldown) {
|
@Deprecated
|
||||||
return registerBinding(new ButtonBinding(id.getNamespace() + "." + id.getName(), defaultButton, actions, filter, hasCooldown));
|
public static @NotNull ButtonBinding registerBinding(@NotNull org.aperlambda.lambdacommon.Identifier id, int[] defaultButton, @NotNull List<PressAction> actions, @NotNull PairPredicate<MinecraftClient, ButtonBinding> filter, boolean hasCooldown) {
|
||||||
|
return registerBinding(Identifier.of(id.getNamespace(), id.getName()), defaultButton, actions, filter, hasCooldown);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static @NotNull ButtonBinding registerBinding(@NotNull Identifier id, int[] defaultButton, boolean hasCooldown) {
|
@Deprecated
|
||||||
|
public static @NotNull ButtonBinding registerBinding(@NotNull org.aperlambda.lambdacommon.Identifier id, int[] defaultButton, boolean hasCooldown) {
|
||||||
return registerBinding(id, defaultButton, Collections.emptyList(), InputHandlers::always, hasCooldown);
|
return registerBinding(id, defaultButton, Collections.emptyList(), InputHandlers::always, hasCooldown);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static @NotNull ButtonBinding registerBinding(@NotNull net.minecraft.util.Identifier id, int[] defaultButton, @NotNull List<PressAction> actions, @NotNull PairPredicate<MinecraftClient, ButtonBinding> filter, boolean hasCooldown) {
|
public static @NotNull ButtonBinding registerBinding(@NotNull Identifier id, int[] defaultButton, @NotNull List<PressAction> actions, @NotNull PairPredicate<MinecraftClient, ButtonBinding> filter, boolean hasCooldown) {
|
||||||
return registerBinding(new Identifier(id.getNamespace(), id.getPath()), defaultButton, actions, filter, hasCooldown);
|
return registerBinding(new ButtonBinding(id.getNamespace() + "." + id.getPath(), defaultButton, actions, filter, hasCooldown));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static @NotNull ButtonBinding registerBinding(@NotNull net.minecraft.util.Identifier id, int[] defaultButton, boolean hasCooldown) {
|
public static @NotNull ButtonBinding registerBinding(@NotNull Identifier id, int[] defaultButton, boolean hasCooldown) {
|
||||||
return registerBinding(id, defaultButton, Collections.emptyList(), InputHandlers::always, hasCooldown);
|
return registerBinding(id, defaultButton, Collections.emptyList(), InputHandlers::always, hasCooldown);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -203,6 +205,13 @@ public class InputManager {
|
|||||||
CATEGORIES.add(category);
|
CATEGORIES.add(category);
|
||||||
return category;
|
return category;
|
||||||
}
|
}
|
||||||
|
public static ButtonCategory registerCategory(@NotNull org.aperlambda.lambdacommon.Identifier identifier, int priority) {
|
||||||
|
return registerCategory(Identifier.of(identifier.getNamespace(), identifier.getName()), priority);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ButtonCategory registerCategory(@NotNull org.aperlambda.lambdacommon.Identifier identifier) {
|
||||||
|
return registerCategory(Identifier.of(identifier.getNamespace(), identifier.getName()));
|
||||||
|
}
|
||||||
|
|
||||||
public static ButtonCategory registerCategory(@NotNull Identifier identifier, int priority) {
|
public static ButtonCategory registerCategory(@NotNull Identifier identifier, int priority) {
|
||||||
return registerCategory(new ButtonCategory(identifier, priority));
|
return registerCategory(new ButtonCategory(identifier, priority));
|
||||||
@@ -213,7 +222,7 @@ public class InputManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected static ButtonCategory registerDefaultCategory(@NotNull String key, @NotNull Consumer<ButtonCategory> keyAdder) {
|
protected static ButtonCategory registerDefaultCategory(@NotNull String key, @NotNull Consumer<ButtonCategory> keyAdder) {
|
||||||
var category = registerCategory(new Identifier("minecraft", key), CATEGORIES.size());
|
var category = registerCategory(Identifier.of("minecraft", key), CATEGORIES.size());
|
||||||
keyAdder.accept(category);
|
keyAdder.accept(category);
|
||||||
return category;
|
return category;
|
||||||
}
|
}
|
||||||
@@ -338,19 +347,19 @@ public class InputManager {
|
|||||||
for (var binding : BINDINGS) {
|
for (var binding : BINDINGS) {
|
||||||
var state = binding.isAvailable(client) ? getBindingState(binding) : ButtonState.NONE;
|
var state = binding.isAvailable(client) ? getBindingState(binding) : ButtonState.NONE;
|
||||||
if (skipButtons.intStream().anyMatch(btn -> containsButton(binding.getButton(), btn))) {
|
if (skipButtons.intStream().anyMatch(btn -> containsButton(binding.getButton(), btn))) {
|
||||||
if (binding.pressed)
|
if (binding.isPressed())
|
||||||
state = ButtonState.RELEASE;
|
state = ButtonState.RELEASE;
|
||||||
else
|
else
|
||||||
state = ButtonState.NONE;
|
state = ButtonState.NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state == ButtonState.RELEASE && !binding.pressed) {
|
if (state == ButtonState.RELEASE && !binding.isPressed()) {
|
||||||
state = ButtonState.NONE;
|
state = ButtonState.NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
binding.pressed = state.isPressed();
|
binding.setPressed(state.isPressed());
|
||||||
binding.update();
|
binding.update();
|
||||||
if (binding.pressed)
|
if (binding.isPressed())
|
||||||
Arrays.stream(binding.getButton()).forEach(skipButtons::add);
|
Arrays.stream(binding.getButton()).forEach(skipButtons::add);
|
||||||
|
|
||||||
float value = getBindingValue(binding, state);
|
float value = getBindingValue(binding, state);
|
||||||
@@ -390,10 +399,10 @@ public class InputManager {
|
|||||||
* @param code the code
|
* @param code the code
|
||||||
* @param category the category of the key binding
|
* @param category the category of the key binding
|
||||||
* @return the key binding
|
* @return the key binding
|
||||||
* @see #makeKeyBinding(Identifier, InputUtil.Type, int, String)
|
* @see #makeKeyBinding(org.aperlambda.lambdacommon.Identifier, InputUtil.Type, int, String)
|
||||||
*/
|
*/
|
||||||
public static @NotNull KeyBinding makeKeyBinding(@NotNull net.minecraft.util.Identifier id, InputUtil.Type type, int code, @NotNull String category) {
|
public static @NotNull KeyBinding makeKeyBinding(@NotNull org.aperlambda.lambdacommon.Identifier id, InputUtil.Type type, int code, @NotNull String category) {
|
||||||
return makeKeyBinding(new Identifier(id.getNamespace(), id.getPath()), type, code, category);
|
return makeKeyBinding(Identifier.of(id.getNamespace(), id.getName()), type, code, category);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -404,9 +413,9 @@ public class InputManager {
|
|||||||
* @param code the code
|
* @param code the code
|
||||||
* @param category the category of the key binding
|
* @param category the category of the key binding
|
||||||
* @return the key binding
|
* @return the key binding
|
||||||
* @see #makeKeyBinding(net.minecraft.util.Identifier, InputUtil.Type, int, String)
|
* @see #makeKeyBinding(Identifier, InputUtil.Type, int, String)
|
||||||
*/
|
*/
|
||||||
public static @NotNull KeyBinding makeKeyBinding(@NotNull Identifier id, InputUtil.Type type, int code, @NotNull String category) {
|
public static @NotNull KeyBinding makeKeyBinding(@NotNull Identifier id, InputUtil.Type type, int code, @NotNull String category) {
|
||||||
return new KeyBinding(String.format("key.%s.%s", id.getNamespace(), id.getName()), type, code, category);
|
return new KeyBinding(String.format("key.%s.%s", id.getNamespace(), id.getPath()), type, code, category);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -14,18 +14,9 @@ import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
|||||||
import eu.midnightdust.midnightcontrols.client.util.MathUtil;
|
import eu.midnightdust.midnightcontrols.client.util.MathUtil;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.network.ClientPlayerEntity;
|
import net.minecraft.client.network.ClientPlayerEntity;
|
||||||
import net.minecraft.enchantment.Enchantment;
|
|
||||||
import net.minecraft.enchantment.EnchantmentHelper;
|
|
||||||
import net.minecraft.entity.LivingEntity;
|
|
||||||
import net.minecraft.entity.attribute.EntityAttributes;
|
import net.minecraft.entity.attribute.EntityAttributes;
|
||||||
import net.minecraft.entity.damage.DamageSource;
|
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import net.minecraft.predicate.entity.MovementPredicate;
|
|
||||||
import net.minecraft.server.world.ServerWorld;
|
|
||||||
import net.minecraft.util.math.MathHelper;
|
import net.minecraft.util.math.MathHelper;
|
||||||
import org.apache.commons.lang3.mutable.MutableFloat;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.spongepowered.asm.mixin.Unique;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents the movement handler.
|
* Represents the movement handler.
|
||||||
@@ -29,9 +29,9 @@ public interface PressAction {
|
|||||||
return false;
|
return false;
|
||||||
button.asKeyBinding().ifPresent(binding -> {
|
button.asKeyBinding().ifPresent(binding -> {
|
||||||
if (binding instanceof StickyKeyBinding)
|
if (binding instanceof StickyKeyBinding)
|
||||||
binding.setPressed(button.pressed);
|
binding.setPressed(button.isPressed());
|
||||||
else
|
else
|
||||||
((KeyBindingAccessor) binding).midnightcontrols$handlePressState(button.isButtonDown());
|
((KeyBindingAccessor) binding).midnightcontrols$handlePressState(button.isPressed());
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
@@ -10,7 +10,6 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.enums;
|
package eu.midnightdust.midnightcontrols.client.enums;
|
||||||
|
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
import org.aperlambda.lambdacommon.utils.Nameable;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@@ -23,7 +22,7 @@ import java.util.Optional;
|
|||||||
* @version 1.4.3
|
* @version 1.4.3
|
||||||
* @since 1.0.0
|
* @since 1.0.0
|
||||||
*/
|
*/
|
||||||
public enum ControllerType implements Nameable {
|
public enum ControllerType {
|
||||||
DEFAULT(0),
|
DEFAULT(0),
|
||||||
DUALSHOCK(1),
|
DUALSHOCK(1),
|
||||||
DUALSENSE(2),
|
DUALSENSE(2),
|
||||||
@@ -78,7 +77,6 @@ public enum ControllerType implements Nameable {
|
|||||||
return this.text;
|
return this.text;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull String getName() {
|
public @NotNull String getName() {
|
||||||
return this.name().toLowerCase();
|
return this.name().toLowerCase();
|
||||||
}
|
}
|
||||||
@@ -23,7 +23,7 @@ import java.util.Optional;
|
|||||||
* @version 1.4.0
|
* @version 1.4.0
|
||||||
* @since 1.0.0
|
* @since 1.0.0
|
||||||
*/
|
*/
|
||||||
public enum HudSide implements Nameable {
|
public enum HudSide {
|
||||||
LEFT,
|
LEFT,
|
||||||
RIGHT;
|
RIGHT;
|
||||||
|
|
||||||
@@ -63,9 +63,8 @@ public enum HudSide implements Nameable {
|
|||||||
return this.text;
|
return this.text;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull String getName() {
|
public @NotNull String getName() {
|
||||||
return this.name().toLowerCase();
|
return this.name();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -74,6 +73,7 @@ public enum HudSide implements Nameable {
|
|||||||
* @param id the identifier of the hud side
|
* @param id the identifier of the hud side
|
||||||
* @return the hud side if found, else empty
|
* @return the hud side if found, else empty
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public static @NotNull Optional<HudSide> byId(@NotNull String id) {
|
public static @NotNull Optional<HudSide> byId(@NotNull String id) {
|
||||||
return Arrays.stream(values()).filter(mode -> mode.getName().equalsIgnoreCase(id)).findFirst();
|
return Arrays.stream(values()).filter(mode -> mode.getName().equalsIgnoreCase(id)).findFirst();
|
||||||
}
|
}
|
||||||
@@ -77,6 +77,7 @@ public enum VirtualMouseSkin implements Nameable {
|
|||||||
* @param id the identifier of the virtual mouse skin
|
* @param id the identifier of the virtual mouse skin
|
||||||
* @return the virtual mouse skin if found, else empty
|
* @return the virtual mouse skin if found, else empty
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public static @NotNull Optional<VirtualMouseSkin> byId(@NotNull String id) {
|
public static @NotNull Optional<VirtualMouseSkin> byId(@NotNull String id) {
|
||||||
return Arrays.stream(values()).filter(mode -> mode.getName().equalsIgnoreCase(id)).findFirst();
|
return Arrays.stream(values()).filter(mode -> mode.getName().equalsIgnoreCase(id)).findFirst();
|
||||||
}
|
}
|
||||||
@@ -11,6 +11,7 @@ package eu.midnightdust.midnightcontrols.client.gui;
|
|||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.Controller;
|
import eu.midnightdust.midnightcontrols.client.controller.Controller;
|
||||||
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
import org.thinkingstudio.obsidianui.Position;
|
import org.thinkingstudio.obsidianui.Position;
|
||||||
import org.thinkingstudio.obsidianui.option.SpruceOption;
|
import org.thinkingstudio.obsidianui.option.SpruceOption;
|
||||||
import org.thinkingstudio.obsidianui.widget.container.SpruceContainerWidget;
|
import org.thinkingstudio.obsidianui.widget.container.SpruceContainerWidget;
|
||||||
@@ -65,7 +66,7 @@ public class MappingsStringInputWidget extends SpruceContainerWidget {
|
|||||||
if (this.client != null)
|
if (this.client != null)
|
||||||
this.client.getToastManager().add(SystemToast.create(this.client, SystemToast.Type.PERIODIC_NOTIFICATION,
|
this.client.getToastManager().add(SystemToast.create(this.client, SystemToast.Type.PERIODIC_NOTIFICATION,
|
||||||
Text.translatable("midnightcontrols.controller.mappings.error.write"), Text.empty()));
|
Text.translatable("midnightcontrols.controller.mappings.error.write"), Text.empty()));
|
||||||
e.printStackTrace();
|
e.fillInStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -98,7 +99,7 @@ public class MappingsStringInputWidget extends SpruceContainerWidget {
|
|||||||
this.addChild(this.reloadMappingsOption.createWidget(Position.of(this.width / 2 - 155, this.height - 29), 310));
|
this.addChild(this.reloadMappingsOption.createWidget(Position.of(this.width / 2 - 155, this.height - 29), 310));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*public void renderTitle(MatrixStack matrices, int mouseX, int mouseY, float delta) {
|
//public void renderTitle(MatrixStack matrices, int mouseX, int mouseY, float delta) {
|
||||||
drawCenteredText(matrices, this.textRenderer, this.title, this.width / 2, 8, 16777215);
|
//this.drawCenteredText(matrices, this.textRenderer, this.title, this.width / 2, 8, 16777215);
|
||||||
}*/
|
//}
|
||||||
}
|
}
|
||||||
@@ -37,7 +37,6 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
* @since 1.0.0
|
* @since 1.0.0
|
||||||
*/
|
*/
|
||||||
public class MidnightControlsHud extends Hud {
|
public class MidnightControlsHud extends Hud {
|
||||||
private final MidnightControlsClient mod;
|
|
||||||
private final MinecraftClient client = MinecraftClient.getInstance();
|
private final MinecraftClient client = MinecraftClient.getInstance();
|
||||||
private int attackWidth = 0;
|
private int attackWidth = 0;
|
||||||
private int attackButtonWidth = 0;
|
private int attackButtonWidth = 0;
|
||||||
@@ -50,15 +49,13 @@ public class MidnightControlsHud extends Hud {
|
|||||||
private boolean showSwapHandsAction = false;
|
private boolean showSwapHandsAction = false;
|
||||||
private int useWidth = 0;
|
private int useWidth = 0;
|
||||||
private int useButtonWidth = 0;
|
private int useButtonWidth = 0;
|
||||||
private BlockHitResult placeHitResult;
|
|
||||||
private String attackAction = "";
|
private String attackAction = "";
|
||||||
private String placeAction = "";
|
private String placeAction = "";
|
||||||
private int ticksDisplayedCrosshair = 0;
|
private int ticksDisplayedCrosshair = 0;
|
||||||
private static boolean isCrammed = false;
|
private static boolean isCrammed = false;
|
||||||
|
|
||||||
public MidnightControlsHud(@NotNull MidnightControlsClient mod) {
|
public MidnightControlsHud() {
|
||||||
super(Identifier.of(MidnightControlsConstants.NAMESPACE, "hud/button_indicator"));
|
super(Identifier.of(MidnightControlsConstants.NAMESPACE, "hud/button_indicator"));
|
||||||
this.mod = mod;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -93,7 +90,7 @@ public class MidnightControlsHud extends Hud {
|
|||||||
matrices.pop();
|
matrices.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.mod.reacharound.isLastReacharoundVertical()) {
|
if (MidnightControlsClient.reacharound.isLastReacharoundVertical()) {
|
||||||
// Render crosshair indicator.
|
// Render crosshair indicator.
|
||||||
var window = this.client.getWindow();
|
var window = this.client.getWindow();
|
||||||
var text = "[ ]";
|
var text = "[ ]";
|
||||||
@@ -119,7 +116,8 @@ public class MidnightControlsHud extends Hud {
|
|||||||
currentX = MidnightControlsConfig.hudSide == HudSide.LEFT ? x : x - this.dropItemButtonWidth;
|
currentX = MidnightControlsConfig.hudSide == HudSide.LEFT ? x : x - this.dropItemButtonWidth;
|
||||||
y -= 20;
|
y -= 20;
|
||||||
}
|
}
|
||||||
if (!ButtonBinding.DROP_ITEM.isNotBound()) this.drawButton(context, currentX, y, ButtonBinding.DROP_ITEM, !this.client.player.getMainHandStack().isEmpty());
|
if (!ButtonBinding.DROP_ITEM.isNotBound() && client.player != null)
|
||||||
|
this.drawButton(context, currentX, y, ButtonBinding.DROP_ITEM, !this.client.player.getMainHandStack().isEmpty());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void renderSecondIcons(DrawContext context, int x, int y) {
|
public void renderSecondIcons(DrawContext context, int x, int y) {
|
||||||
@@ -163,7 +161,7 @@ public class MidnightControlsHud extends Hud {
|
|||||||
y -= 20;
|
y -= 20;
|
||||||
currentX = MidnightControlsConfig.hudSide == HudSide.LEFT ? x + this.dropItemButtonWidth + 2 : x - this.dropItemButtonWidth - 2 - this.dropItemWidth;
|
currentX = MidnightControlsConfig.hudSide == HudSide.LEFT ? x + this.dropItemButtonWidth + 2 : x - this.dropItemButtonWidth - 2 - this.dropItemWidth;
|
||||||
}
|
}
|
||||||
if (!ButtonBinding.DROP_ITEM.isNotBound()) this.drawTip(context, currentX, y, ButtonBinding.DROP_ITEM, !this.client.player.getMainHandStack().isEmpty());
|
if (!ButtonBinding.DROP_ITEM.isNotBound() && client.player != null) this.drawTip(context, currentX, y, ButtonBinding.DROP_ITEM, !this.client.player.getMainHandStack().isEmpty());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void renderSecondSection(DrawContext context, int x, int y) {
|
public void renderSecondSection(DrawContext context, int x, int y) {
|
||||||
@@ -206,28 +204,29 @@ public class MidnightControlsHud extends Hud {
|
|||||||
String placeAction;
|
String placeAction;
|
||||||
|
|
||||||
// Update "Use" tip status.
|
// Update "Use" tip status.
|
||||||
|
BlockHitResult placeHitResult;
|
||||||
if (this.client.crosshairTarget.getType() == HitResult.Type.MISS) {
|
if (this.client.crosshairTarget.getType() == HitResult.Type.MISS) {
|
||||||
this.placeHitResult = this.mod.reacharound.getLastReacharoundResult();
|
placeHitResult = MidnightControlsClient.reacharound.getLastReacharoundResult();
|
||||||
this.attackAction = "";
|
this.attackAction = "";
|
||||||
this.attackWidth = 0;
|
this.attackWidth = 0;
|
||||||
} else {
|
} else {
|
||||||
if (this.client.crosshairTarget.getType() == HitResult.Type.BLOCK)
|
if (this.client.crosshairTarget.getType() == HitResult.Type.BLOCK)
|
||||||
this.placeHitResult = (BlockHitResult) this.client.crosshairTarget;
|
placeHitResult = (BlockHitResult) this.client.crosshairTarget;
|
||||||
else
|
else
|
||||||
this.placeHitResult = null;
|
placeHitResult = null;
|
||||||
|
|
||||||
this.attackAction = this.client.crosshairTarget.getType() == HitResult.Type.BLOCK ? "midnightcontrols.action.hit" : ButtonBinding.ATTACK.getTranslationKey();
|
this.attackAction = this.client.crosshairTarget.getType() == HitResult.Type.BLOCK ? "midnightcontrols.action.hit" : ButtonBinding.ATTACK.getTranslationKey();
|
||||||
this.attackWidth = this.width(attackAction);
|
this.attackWidth = this.width(attackAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.mod.reacharound.isLastReacharoundVertical()) {
|
if (MidnightControlsClient.reacharound.isLastReacharoundVertical()) {
|
||||||
if (this.ticksDisplayedCrosshair < 5)
|
if (this.ticksDisplayedCrosshair < 5)
|
||||||
this.ticksDisplayedCrosshair++;
|
this.ticksDisplayedCrosshair++;
|
||||||
} else {
|
} else {
|
||||||
this.ticksDisplayedCrosshair = 0;
|
this.ticksDisplayedCrosshair = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
var customAttackAction = MidnightControlsCompat.getAttackActionAt(this.client, this.placeHitResult);
|
var customAttackAction = MidnightControlsCompat.getAttackActionAt(this.client, placeHitResult);
|
||||||
if (customAttackAction != null) {
|
if (customAttackAction != null) {
|
||||||
this.attackAction = customAttackAction;
|
this.attackAction = customAttackAction;
|
||||||
this.attackWidth = this.width(customAttackAction);
|
this.attackWidth = this.width(customAttackAction);
|
||||||
@@ -242,14 +241,14 @@ public class MidnightControlsHud extends Hud {
|
|||||||
if (stack == null || stack.isEmpty()) {
|
if (stack == null || stack.isEmpty()) {
|
||||||
placeAction = "";
|
placeAction = "";
|
||||||
} else {
|
} else {
|
||||||
if (this.placeHitResult != null && stack.getItem() instanceof BlockItem) {
|
if (placeHitResult != null && stack.getItem() instanceof BlockItem) {
|
||||||
placeAction = "midnightcontrols.action.place";
|
placeAction = "midnightcontrols.action.place";
|
||||||
} else {
|
} else {
|
||||||
placeAction = ButtonBinding.USE.getTranslationKey();
|
placeAction = ButtonBinding.USE.getTranslationKey();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var customUseAction = MidnightControlsCompat.getUseActionAt(this.client, this.placeHitResult);
|
var customUseAction = MidnightControlsCompat.getUseActionAt(this.client, placeHitResult);
|
||||||
if (customUseAction != null)
|
if (customUseAction != null)
|
||||||
placeAction = customUseAction;
|
placeAction = customUseAction;
|
||||||
|
|
||||||
@@ -216,7 +216,7 @@ public class MidnightControlsRenderer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hoverSlot) {
|
if (!hoverSlot && client.currentScreen != null) {
|
||||||
var slot = MidnightControlsCompat.getSlotAt(client.currentScreen, mouseX, mouseY);
|
var slot = MidnightControlsCompat.getSlotAt(client.currentScreen, mouseX, mouseY);
|
||||||
|
|
||||||
if (slot != null) {
|
if (slot != null) {
|
||||||
@@ -10,11 +10,12 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.gui;
|
package eu.midnightdust.midnightcontrols.client.gui;
|
||||||
|
|
||||||
import com.mojang.blaze3d.systems.RenderSystem;
|
import com.mojang.blaze3d.systems.RenderSystem;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.util.platform.NetworkUtil;
|
||||||
import org.thinkingstudio.obsidianui.background.Background;
|
import org.thinkingstudio.obsidianui.background.Background;
|
||||||
import org.thinkingstudio.obsidianui.widget.SpruceWidget;
|
import org.thinkingstudio.obsidianui.widget.SpruceWidget;
|
||||||
import eu.midnightdust.lib.util.MidnightColorUtil;
|
import eu.midnightdust.lib.util.MidnightColorUtil;
|
||||||
import eu.midnightdust.midnightcontrols.MidnightControls;
|
import eu.midnightdust.midnightcontrols.MidnightControls;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.Controller;
|
import eu.midnightdust.midnightcontrols.client.controller.Controller;
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.widget.ControllerControlsWidget;
|
import eu.midnightdust.midnightcontrols.client.gui.widget.ControllerControlsWidget;
|
||||||
@@ -27,8 +28,7 @@ import org.thinkingstudio.obsidianui.widget.SpruceLabelWidget;
|
|||||||
import org.thinkingstudio.obsidianui.widget.container.SpruceContainerWidget;
|
import org.thinkingstudio.obsidianui.widget.container.SpruceContainerWidget;
|
||||||
import org.thinkingstudio.obsidianui.widget.container.SpruceOptionListWidget;
|
import org.thinkingstudio.obsidianui.widget.container.SpruceOptionListWidget;
|
||||||
import org.thinkingstudio.obsidianui.widget.container.tabbed.SpruceTabbedWidget;
|
import org.thinkingstudio.obsidianui.widget.container.tabbed.SpruceTabbedWidget;
|
||||||
import eu.midnightdust.midnightcontrols.packet.ControlsModePacket;
|
import eu.midnightdust.midnightcontrols.packet.ControlsModePayload;
|
||||||
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.gui.DrawContext;
|
import net.minecraft.client.gui.DrawContext;
|
||||||
import net.minecraft.client.gui.screen.Screen;
|
import net.minecraft.client.gui.screen.Screen;
|
||||||
@@ -51,7 +51,6 @@ import java.awt.*;
|
|||||||
public class MidnightControlsSettingsScreen extends SpruceScreen {
|
public class MidnightControlsSettingsScreen extends SpruceScreen {
|
||||||
private static final Text SDL2_GAMEPAD_TOOL = Text.literal("SDL2 Gamepad Tool").formatted(Formatting.GREEN);
|
private static final Text SDL2_GAMEPAD_TOOL = Text.literal("SDL2 Gamepad Tool").formatted(Formatting.GREEN);
|
||||||
public static final String GAMEPAD_TOOL_URL = "https://generalarcade.com/gamepadtool/";
|
public static final String GAMEPAD_TOOL_URL = "https://generalarcade.com/gamepadtool/";
|
||||||
final MidnightControlsClient mod = MidnightControlsClient.get();
|
|
||||||
private final Screen parent;
|
private final Screen parent;
|
||||||
// General options
|
// General options
|
||||||
private final SpruceOption inputModeOption;
|
private final SpruceOption inputModeOption;
|
||||||
@@ -184,7 +183,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
MidnightControlsConfig.save();
|
MidnightControlsConfig.save();
|
||||||
|
|
||||||
if (this.client != null && this.client.player != null) {
|
if (this.client != null && this.client.player != null) {
|
||||||
ClientPlayNetworking.getSender().sendPacket(new ControlsModePacket(next.getName()));
|
NetworkUtil.sendPayloadC2S(new ControlsModePayload(next.getName()));
|
||||||
}
|
}
|
||||||
}, option -> option.getDisplayText(Text.translatable(MidnightControlsConfig.controlsMode.getTranslationKey())),
|
}, option -> option.getDisplayText(Text.translatable(MidnightControlsConfig.controlsMode.getTranslationKey())),
|
||||||
Text.translatable("midnightcontrols.menu.controls_mode.tooltip"));
|
Text.translatable("midnightcontrols.menu.controls_mode.tooltip"));
|
||||||
@@ -254,7 +253,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
option -> option.getDisplayText(MidnightControlsConfig.virtualMouseSkin.getTranslatedText()),
|
option -> option.getDisplayText(MidnightControlsConfig.virtualMouseSkin.getTranslatedText()),
|
||||||
null);
|
null);
|
||||||
this.hudEnableOption = new SpruceToggleBooleanOption("midnightcontrols.menu.hud_enable", () -> MidnightControlsConfig.hudEnable,
|
this.hudEnableOption = new SpruceToggleBooleanOption("midnightcontrols.menu.hud_enable", () -> MidnightControlsConfig.hudEnable,
|
||||||
this.mod::setHudEnabled, Text.translatable("midnightcontrols.menu.hud_enable.tooltip"));
|
MidnightControlsClient::setHudEnabled, Text.translatable("midnightcontrols.menu.hud_enable.tooltip"));
|
||||||
this.hudSideOption = new SpruceCyclingOption("midnightcontrols.menu.hud_side",
|
this.hudSideOption = new SpruceCyclingOption("midnightcontrols.menu.hud_side",
|
||||||
amount -> MidnightControlsConfig.hudSide = MidnightControlsConfig.hudSide.next(),
|
amount -> MidnightControlsConfig.hudSide = MidnightControlsConfig.hudSide.next(),
|
||||||
option -> option.getDisplayText(MidnightControlsConfig.hudSide.getTranslatedText()),
|
option -> option.getDisplayText(MidnightControlsConfig.hudSide.getTranslatedText()),
|
||||||
@@ -271,7 +270,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
MidnightControlsConfig.updateBindingsForController(MidnightControlsConfig.getController());
|
MidnightControlsConfig.updateBindingsForController(MidnightControlsConfig.getController());
|
||||||
}
|
}
|
||||||
|
|
||||||
}, Text.translatable(""));
|
}, Text.empty());
|
||||||
this.cameraModeOption = new SpruceCyclingOption("midnightcontrols.menu.camera_mode",
|
this.cameraModeOption = new SpruceCyclingOption("midnightcontrols.menu.camera_mode",
|
||||||
amount -> MidnightControlsConfig.cameraMode = MidnightControlsConfig.cameraMode.next(),
|
amount -> MidnightControlsConfig.cameraMode = MidnightControlsConfig.cameraMode.next(),
|
||||||
option -> option.getDisplayText(MidnightControlsConfig.cameraMode.getTranslatedText()),
|
option -> option.getDisplayText(MidnightControlsConfig.cameraMode.getTranslatedText()),
|
||||||
@@ -17,6 +17,8 @@ import net.minecraft.client.gui.screen.Screen;
|
|||||||
import net.minecraft.client.gui.widget.ButtonWidget;
|
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
|
||||||
|
import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.ring;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents the controls ring screen.
|
* Represents the controls ring screen.
|
||||||
*
|
*
|
||||||
@@ -25,19 +27,17 @@ import net.minecraft.text.Text;
|
|||||||
* @since 1.4.3
|
* @since 1.4.3
|
||||||
*/
|
*/
|
||||||
public class RingScreen extends Screen {
|
public class RingScreen extends Screen {
|
||||||
protected final MidnightControlsClient mod;
|
|
||||||
|
|
||||||
public RingScreen() {
|
public RingScreen() {
|
||||||
super(Text.literal("midnightcontrols.menu.title.ring"));
|
super(Text.literal("midnightcontrols.menu.title.ring"));
|
||||||
this.mod = MidnightControlsClient.get();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void init() {
|
protected void init() {
|
||||||
super.init();
|
super.init();
|
||||||
if (mod.ring.getMaxPages() > 1) {
|
if (ring.getMaxPages() > 1) {
|
||||||
this.addDrawableChild(ButtonWidget.builder(Text.of("◀"), button -> this.mod.ring.cyclePage(false)).dimensions(5, 5, 20, 20).build());
|
this.addDrawableChild(ButtonWidget.builder(Text.of("◀"), button -> ring.cyclePage(false)).dimensions(5, 5, 20, 20).build());
|
||||||
this.addDrawableChild(ButtonWidget.builder(Text.of("▶"), button -> this.mod.ring.cyclePage(true)).dimensions(width - 25, 5, 20, 20).build());
|
this.addDrawableChild(ButtonWidget.builder(Text.of("▶"), button -> ring.cyclePage(true)).dimensions(width - 25, 5, 20, 20).build());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@ public class RingScreen extends Screen {
|
|||||||
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
|
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
|
||||||
super.render(context, mouseX, mouseY, delta);
|
super.render(context, mouseX, mouseY, delta);
|
||||||
|
|
||||||
RingPage page = this.mod.ring.getCurrentPage();
|
RingPage page = ring.getCurrentPage();
|
||||||
page.render(context, this.textRenderer, this.width, this.height, mouseX, mouseY, delta);
|
page.render(context, this.textRenderer, this.width, this.height, mouseX, mouseY, delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,7 +59,7 @@ public class RingScreen extends Screen {
|
|||||||
super.close();
|
super.close();
|
||||||
assert client != null;
|
assert client != null;
|
||||||
client.currentScreen = null;
|
client.currentScreen = null;
|
||||||
RingPage page = this.mod.ring.getCurrentPage();
|
RingPage page = ring.getCurrentPage();
|
||||||
if (RingPage.selected >= 0 && page.actions[RingPage.selected] != null)
|
if (RingPage.selected >= 0 && page.actions[RingPage.selected] != null)
|
||||||
page.actions[RingPage.selected].activate(RingButtonMode.PRESS);
|
page.actions[RingPage.selected].activate(RingButtonMode.PRESS);
|
||||||
RingPage.selected = -1;
|
RingPage.selected = -1;
|
||||||
@@ -80,7 +80,7 @@ public class RingScreen extends Screen {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean mouseReleased(double mouseX, double mouseY, int button) {
|
public boolean mouseReleased(double mouseX, double mouseY, int button) {
|
||||||
if (mod.ring.getCurrentPage().onClick(width, height, (int) mouseX, (int) mouseY)) {
|
if (ring.getCurrentPage().onClick(width, height, (int) mouseX, (int) mouseY)) {
|
||||||
this.close();
|
this.close();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -15,7 +15,6 @@ import eu.midnightdust.lib.util.PlatformFunctions;
|
|||||||
import eu.midnightdust.midnightcontrols.MidnightControlsConstants;
|
import eu.midnightdust.midnightcontrols.MidnightControlsConstants;
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.ButtonState;
|
import eu.midnightdust.midnightcontrols.client.enums.ButtonState;
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.HudSide;
|
import eu.midnightdust.midnightcontrols.client.enums.HudSide;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
import eu.midnightdust.midnightcontrols.client.compat.EmotecraftCompat;
|
import eu.midnightdust.midnightcontrols.client.compat.EmotecraftCompat;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
||||||
@@ -38,12 +37,12 @@ import net.minecraft.text.Text;
|
|||||||
import net.minecraft.util.*;
|
import net.minecraft.util.*;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.Direction;
|
import net.minecraft.util.math.Direction;
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.input;
|
||||||
import static org.lwjgl.glfw.GLFW.GLFW_GAMEPAD_AXIS_RIGHT_X;
|
import static org.lwjgl.glfw.GLFW.GLFW_GAMEPAD_AXIS_RIGHT_X;
|
||||||
import static org.lwjgl.glfw.GLFW.GLFW_GAMEPAD_AXIS_RIGHT_Y;
|
import static org.lwjgl.glfw.GLFW.GLFW_GAMEPAD_AXIS_RIGHT_Y;
|
||||||
|
|
||||||
@@ -52,7 +51,6 @@ import static org.lwjgl.glfw.GLFW.GLFW_GAMEPAD_AXIS_RIGHT_Y;
|
|||||||
*/
|
*/
|
||||||
public class TouchscreenOverlay extends Screen {
|
public class TouchscreenOverlay extends Screen {
|
||||||
public static final Identifier WIDGETS_LOCATION = Identifier.of("midnightcontrols", "textures/gui/widgets.png");
|
public static final Identifier WIDGETS_LOCATION = Identifier.of("midnightcontrols", "textures/gui/widgets.png");
|
||||||
private final MidnightControlsClient mod;
|
|
||||||
private SilentTexturedButtonWidget inventoryButton;
|
private SilentTexturedButtonWidget inventoryButton;
|
||||||
private SilentTexturedButtonWidget swapHandsButton;
|
private SilentTexturedButtonWidget swapHandsButton;
|
||||||
private SilentTexturedButtonWidget dropButton;
|
private SilentTexturedButtonWidget dropButton;
|
||||||
@@ -71,11 +69,9 @@ public class TouchscreenOverlay extends Screen {
|
|||||||
private SilentTexturedButtonWidget endSneakButton;
|
private SilentTexturedButtonWidget endSneakButton;
|
||||||
private int flyButtonEnableTicks = 0;
|
private int flyButtonEnableTicks = 0;
|
||||||
private int forwardButtonTick = 0;
|
private int forwardButtonTick = 0;
|
||||||
public static TouchscreenOverlay instance;
|
|
||||||
|
|
||||||
public TouchscreenOverlay(@NotNull MidnightControlsClient mod) {
|
public TouchscreenOverlay() {
|
||||||
super(Text.literal("Touchscreen overlay"));
|
super(Text.literal("Touchscreen Overlay"));
|
||||||
this.mod = mod;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -287,7 +283,6 @@ public class TouchscreenOverlay extends Screen {
|
|||||||
initCustomButtons(false);
|
initCustomButtons(false);
|
||||||
|
|
||||||
this.setButtonProperties(MidnightControlsConfig.touchTransparency / 100f);
|
this.setButtonProperties(MidnightControlsConfig.touchTransparency / 100f);
|
||||||
TouchscreenOverlay.instance = this;
|
|
||||||
}
|
}
|
||||||
private void initCustomButtons(boolean left) {
|
private void initCustomButtons(boolean left) {
|
||||||
assert client != null;
|
assert client != null;
|
||||||
@@ -354,12 +349,12 @@ public class TouchscreenOverlay extends Screen {
|
|||||||
deltaY = -deltaY;
|
deltaY = -deltaY;
|
||||||
}
|
}
|
||||||
if (deltaY > 0.01)
|
if (deltaY > 0.01)
|
||||||
this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs((deltaY / 3.0)*MidnightControlsConfig.touchSpeed/100), 2);
|
input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs((deltaY / 3.0)*MidnightControlsConfig.touchSpeed/100), 2);
|
||||||
else this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs((deltaY / 3.0)*MidnightControlsConfig.touchSpeed/100), 1);
|
else input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs((deltaY / 3.0)*MidnightControlsConfig.touchSpeed/100), 1);
|
||||||
|
|
||||||
if (deltaX > 0.01)
|
if (deltaX > 0.01)
|
||||||
this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_X, (float) Math.abs((deltaX / 3.0)*MidnightControlsConfig.touchSpeed/100), 2);
|
input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_X, (float) Math.abs((deltaX / 3.0)*MidnightControlsConfig.touchSpeed/100), 2);
|
||||||
else this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_X, (float) Math.abs((deltaX / 3.0)*MidnightControlsConfig.touchSpeed/100), 1);
|
else input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_X, (float) Math.abs((deltaX / 3.0)*MidnightControlsConfig.touchSpeed/100), 1);
|
||||||
}
|
}
|
||||||
return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY);
|
return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY);
|
||||||
}
|
}
|
||||||
@@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.gui.widget;
|
package eu.midnightdust.midnightcontrols.client.gui.widget;
|
||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
||||||
@@ -31,8 +30,6 @@ import java.util.stream.Collectors;
|
|||||||
* Represents the controls screen.
|
* Represents the controls screen.
|
||||||
*/
|
*/
|
||||||
public class ControllerControlsWidget extends SpruceContainerWidget {
|
public class ControllerControlsWidget extends SpruceContainerWidget {
|
||||||
final MidnightControlsClient mod;
|
|
||||||
private ControlsListWidget bindingsListWidget;
|
|
||||||
private SpruceButtonWidget resetButton;
|
private SpruceButtonWidget resetButton;
|
||||||
public ButtonBinding focusedBinding;
|
public ButtonBinding focusedBinding;
|
||||||
public boolean waiting = false;
|
public boolean waiting = false;
|
||||||
@@ -40,7 +37,6 @@ public class ControllerControlsWidget extends SpruceContainerWidget {
|
|||||||
|
|
||||||
public ControllerControlsWidget(Position position, int width, int height) {
|
public ControllerControlsWidget(Position position, int width, int height) {
|
||||||
super(position, width, height);
|
super(position, width, height);
|
||||||
this.mod = MidnightControlsClient.get();
|
|
||||||
|
|
||||||
this.init();
|
this.init();
|
||||||
}
|
}
|
||||||
@@ -49,9 +45,9 @@ public class ControllerControlsWidget extends SpruceContainerWidget {
|
|||||||
this.addChild(new SpruceButtonWidget(Position.of(this, this.width / 2 - 155, 18), 310, 20,
|
this.addChild(new SpruceButtonWidget(Position.of(this, this.width / 2 - 155, 18), 310, 20,
|
||||||
Text.translatable("midnightcontrols.menu.keyboard_controls"),
|
Text.translatable("midnightcontrols.menu.keyboard_controls"),
|
||||||
btn -> this.client.setScreen(new ControlsOptionsScreen(null, this.client.options))));
|
btn -> this.client.setScreen(new ControlsOptionsScreen(null, this.client.options))));
|
||||||
this.bindingsListWidget = new ControlsListWidget(Position.of(this, 0, 43), this.width, this.height - 43 - 35, this);
|
ControlsListWidget bindingsListWidget = new ControlsListWidget(Position.of(this, 0, 43), this.width, this.height - 43 - 35, this);
|
||||||
this.bindingsListWidget.setBackground(new MidnightControlsSettingsScreen.MidnightControlsBackground(130));
|
bindingsListWidget.setBackground(new MidnightControlsSettingsScreen.MidnightControlsBackground(130));
|
||||||
this.addChild(this.bindingsListWidget);
|
this.addChild(bindingsListWidget);
|
||||||
this.addChild(this.resetButton = new SpruceButtonWidget(Position.of(this, this.width / 2 - 155, this.height - 29), 150, 20,
|
this.addChild(this.resetButton = new SpruceButtonWidget(Position.of(this, this.width / 2 - 155, this.height - 29), 150, 20,
|
||||||
SpruceTexts.CONTROLS_RESET_ALL,
|
SpruceTexts.CONTROLS_RESET_ALL,
|
||||||
btn -> InputManager.streamBindings().collect(Collectors.toSet()).forEach(binding -> MidnightControlsConfig.setButtonBinding(binding, binding.getDefaultButton()))));
|
btn -> InputManager.streamBindings().collect(Collectors.toSet()).forEach(binding -> MidnightControlsConfig.setButtonBinding(binding, binding.getDefaultButton()))));
|
||||||
@@ -88,7 +88,7 @@ public class ControlsListWidget extends SpruceEntryListWidget<ControlsListWidget
|
|||||||
this.bindingName = I18n.translate(this.binding.getTranslationKey());
|
this.bindingName = I18n.translate(this.binding.getTranslationKey());
|
||||||
this.editButton = new ControllerButtonWidget(Position.of(this, parent.getWidth() / 2 - 8, 0), 110, this.binding, btn -> {
|
this.editButton = new ControllerButtonWidget(Position.of(this, parent.getWidth() / 2 - 8, 0), 110, this.binding, btn -> {
|
||||||
gui.focusedBinding = binding;
|
gui.focusedBinding = binding;
|
||||||
MidnightControlsClient.get().input.beginControlsInput(gui);
|
MidnightControlsClient.input.beginControlsInput(gui);
|
||||||
}) {
|
}) {
|
||||||
protected Text getNarrationMessage() {
|
protected Text getNarrationMessage() {
|
||||||
return binding.isNotBound() ? Text.translatable("narrator.controls.unbound", bindingName)
|
return binding.isNotBound() ? Text.translatable("narrator.controls.unbound", bindingName)
|
||||||
@@ -111,7 +111,7 @@ public class ControlsListWidget extends SpruceEntryListWidget<ControlsListWidget
|
|||||||
btn -> {
|
btn -> {
|
||||||
MidnightControlsConfig.setButtonBinding(binding, UNBOUND);
|
MidnightControlsConfig.setButtonBinding(binding, UNBOUND);
|
||||||
gui.focusedBinding = null;
|
gui.focusedBinding = null;
|
||||||
MidnightControlsClient.get().input.beginControlsInput(null);
|
MidnightControlsClient.input.beginControlsInput(null);
|
||||||
}) {
|
}) {
|
||||||
protected Text getNarrationMessage() {
|
protected Text getNarrationMessage() {
|
||||||
return Text.translatable("midnightcontrols.narrator.unbound", bindingName);
|
return Text.translatable("midnightcontrols.narrator.unbound", bindingName);
|
||||||
@@ -26,6 +26,7 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
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.Redirect;
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
@@ -36,7 +37,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||||||
*/
|
*/
|
||||||
@Mixin(ClientPlayerEntity.class)
|
@Mixin(ClientPlayerEntity.class)
|
||||||
public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity {
|
public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity {
|
||||||
private boolean midnightcontrols$driftingPrevented = false;
|
@Unique private boolean midnightcontrols$driftingPrevented = false;
|
||||||
|
|
||||||
public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile) {
|
public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile) {
|
||||||
super(world, profile);
|
super(world, profile);
|
||||||
@@ -20,9 +20,6 @@ import net.minecraft.text.Text;
|
|||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Unique;
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Injects the new controls settings button.
|
* Injects the new controls settings button.
|
||||||
@@ -33,14 +30,14 @@ public abstract class ControlsOptionsScreenMixin extends GameOptionsScreen {
|
|||||||
public ControlsOptionsScreenMixin(Screen parent, GameOptions gameOptions, Text title) {
|
public ControlsOptionsScreenMixin(Screen parent, GameOptions gameOptions, Text title) {
|
||||||
super(parent, gameOptions, title);
|
super(parent, gameOptions, title);
|
||||||
}
|
}
|
||||||
@Unique TextIconButtonWidget button = TextIconButtonWidget.builder(Text.translatable("midnightcontrols.menu.title.controller"), (button -> this.client.setScreen(new MidnightControlsSettingsScreen(this, false))), true)
|
@Unique TextIconButtonWidget midnightcontrols$button = TextIconButtonWidget.builder(Text.translatable("midnightcontrols.menu.title.controller"), (button -> this.client.setScreen(new MidnightControlsSettingsScreen(this, false))), true)
|
||||||
.dimension(20,20).texture(Identifier.of("midnightcontrols", "icon/controller"), 20, 20).build();
|
.dimension(20,20).texture(Identifier.of("midnightcontrols", "icon/controller"), 20, 20).build();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init() {
|
public void init() {
|
||||||
super.init();
|
super.init();
|
||||||
this.midnightcontrols$setupButton();
|
this.midnightcontrols$setupButton();
|
||||||
this.addDrawableChild(button);
|
this.addDrawableChild(midnightcontrols$button);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -51,6 +48,6 @@ public abstract class ControlsOptionsScreenMixin extends GameOptionsScreen {
|
|||||||
@Unique
|
@Unique
|
||||||
public void midnightcontrols$setupButton() {
|
public void midnightcontrols$setupButton() {
|
||||||
assert body != null;
|
assert body != null;
|
||||||
button.setPosition(body.getWidth() / 2 + 158, body.getY() + 4);
|
midnightcontrols$button.setPosition(body.getWidth() / 2 + 158, body.getY() + 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -37,7 +37,7 @@ public abstract class GameRendererMixin {
|
|||||||
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Mouse;getX()D", shift = At.Shift.BEFORE))
|
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Mouse;getX()D", shift = At.Shift.BEFORE))
|
||||||
private void onRender(RenderTickCounter tickCounter, boolean tick, CallbackInfo ci) {
|
private void onRender(RenderTickCounter tickCounter, boolean tick, CallbackInfo ci) {
|
||||||
if (this.client.currentScreen != null && MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER)
|
if (this.client.currentScreen != null && MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER)
|
||||||
MidnightControlsClient.get().input.onPreRenderScreen(this.client, this.client.currentScreen);
|
MidnightControlsClient.input.onPreRenderScreen(this.client, this.client.currentScreen);
|
||||||
}
|
}
|
||||||
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;draw()V", shift = At.Shift.BEFORE))
|
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;draw()V", shift = At.Shift.BEFORE))
|
||||||
private void renderVirtualCursor(RenderTickCounter tickCounter, boolean tick, CallbackInfo ci, @Local DrawContext drawContext) {
|
private void renderVirtualCursor(RenderTickCounter tickCounter, boolean tick, CallbackInfo ci, @Local DrawContext drawContext) {
|
||||||
@@ -9,9 +9,9 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.mixin;
|
package eu.midnightdust.midnightcontrols.client.mixin;
|
||||||
|
|
||||||
|
import eu.midnightdust.lib.util.PlatformFunctions;
|
||||||
import eu.midnightdust.midnightcontrols.ControlsMode;
|
import eu.midnightdust.midnightcontrols.ControlsMode;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightInput;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.compat.EMICompat;
|
import eu.midnightdust.midnightcontrols.client.compat.EMICompat;
|
||||||
import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat;
|
import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
||||||
@@ -20,14 +20,11 @@ import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor;
|
|||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.gui.DrawContext;
|
import net.minecraft.client.gui.DrawContext;
|
||||||
import net.minecraft.client.gui.screen.ingame.HandledScreen;
|
import net.minecraft.client.gui.screen.ingame.HandledScreen;
|
||||||
import net.minecraft.client.util.math.MatrixStack;
|
|
||||||
import net.minecraft.screen.slot.Slot;
|
import net.minecraft.screen.slot.Slot;
|
||||||
import net.minecraft.screen.slot.SlotActionType;
|
import net.minecraft.screen.slot.SlotActionType;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.lwjgl.glfw.GLFW;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Unique;
|
|
||||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||||
import org.spongepowered.asm.mixin.gen.Invoker;
|
import org.spongepowered.asm.mixin.gen.Invoker;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
@@ -65,7 +62,7 @@ public abstract class HandledScreenMixin implements HandledScreenAccessor {
|
|||||||
}
|
}
|
||||||
if (!ButtonBinding.TAKE_ALL.isNotBound()) x = MidnightControlsRenderer.drawButtonTip(context, x, y, ButtonBinding.TAKE_ALL,true, client) + 2;
|
if (!ButtonBinding.TAKE_ALL.isNotBound()) x = MidnightControlsRenderer.drawButtonTip(context, x, y, ButtonBinding.TAKE_ALL,true, client) + 2;
|
||||||
if (!ButtonBinding.EXIT.isNotBound()) x = MidnightControlsRenderer.drawButtonTip(context, x, y, ButtonBinding.EXIT, true, client) + 2;
|
if (!ButtonBinding.EXIT.isNotBound()) x = MidnightControlsRenderer.drawButtonTip(context, x, y, ButtonBinding.EXIT, true, client) + 2;
|
||||||
if (MidnightControlsCompat.isReiPresent()) {
|
if (PlatformFunctions.isModLoaded("roughlyenoughitems")) {
|
||||||
x = 2;
|
x = 2;
|
||||||
y -= 24;
|
y -= 24;
|
||||||
}
|
}
|
||||||
@@ -16,7 +16,6 @@ import net.minecraft.client.MinecraftClient;
|
|||||||
import net.minecraft.client.gui.screen.Screen;
|
import net.minecraft.client.gui.screen.Screen;
|
||||||
import net.minecraft.client.network.ClientPlayerEntity;
|
import net.minecraft.client.network.ClientPlayerEntity;
|
||||||
import net.minecraft.client.network.ClientPlayerInteractionManager;
|
import net.minecraft.client.network.ClientPlayerInteractionManager;
|
||||||
import net.minecraft.client.render.BufferBuilderStorage;
|
|
||||||
import net.minecraft.client.render.GameRenderer;
|
import net.minecraft.client.render.GameRenderer;
|
||||||
import net.minecraft.item.BlockItem;
|
import net.minecraft.item.BlockItem;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
@@ -32,11 +31,14 @@ import org.lwjgl.glfw.GLFW;
|
|||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
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;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
|
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
|
||||||
|
|
||||||
|
import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.reacharound;
|
||||||
|
|
||||||
@Mixin(MinecraftClient.class)
|
@Mixin(MinecraftClient.class)
|
||||||
public abstract class MinecraftClientMixin {
|
public abstract class MinecraftClientMixin {
|
||||||
@Shadow @Nullable public HitResult crosshairTarget;
|
@Shadow @Nullable public HitResult crosshairTarget;
|
||||||
@@ -49,15 +51,13 @@ public abstract class MinecraftClientMixin {
|
|||||||
|
|
||||||
@Shadow private int itemUseCooldown;
|
@Shadow private int itemUseCooldown;
|
||||||
|
|
||||||
@Shadow public abstract BufferBuilderStorage getBufferBuilders();
|
@Unique private BlockPos midnightcontrols$lastTargetPos;
|
||||||
|
@Unique private Vec3d midnightcontrols$lastPos;
|
||||||
private BlockPos midnightcontrols$lastTargetPos;
|
@Unique private Direction midnightcontrols$lastTargetSide;
|
||||||
private Vec3d midnightcontrols$lastPos;
|
|
||||||
private Direction midnightcontrols$lastTargetSide;
|
|
||||||
|
|
||||||
@Inject(method = "<init>", at = @At("RETURN"))
|
@Inject(method = "<init>", at = @At("RETURN"))
|
||||||
private void onInit(CallbackInfo ci) {
|
private void onInit(CallbackInfo ci) {
|
||||||
MidnightControlsClient.get().onMcInit((MinecraftClient) (Object) this);
|
MidnightControlsClient.onMcInit((MinecraftClient) (Object) this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "tick", at = @At("HEAD"))
|
@Inject(method = "tick", at = @At("HEAD"))
|
||||||
@@ -110,16 +110,15 @@ public abstract class MinecraftClientMixin {
|
|||||||
|
|
||||||
@Inject(method = "doItemUse()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/hit/HitResult;getType()Lnet/minecraft/util/hit/HitResult$Type;"), locals = LocalCapture.CAPTURE_FAILEXCEPTION, cancellable = true)
|
@Inject(method = "doItemUse()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/hit/HitResult;getType()Lnet/minecraft/util/hit/HitResult$Type;"), locals = LocalCapture.CAPTURE_FAILEXCEPTION, cancellable = true)
|
||||||
private void onItemUse(CallbackInfo ci, Hand[] hands, int handCount, int handIndex, Hand hand, ItemStack stackInHand) {
|
private void onItemUse(CallbackInfo ci, Hand[] hands, int handCount, int handIndex, Hand hand, ItemStack stackInHand) {
|
||||||
var mod = MidnightControlsClient.get();
|
if (player != null && !stackInHand.isEmpty() && this.player.getPitch(0.f) > 35.0F && reacharound.isReacharoundAvailable()) {
|
||||||
if (!stackInHand.isEmpty() && this.player.getPitch(0.f) > 35.0F && mod.reacharound.isReacharoundAvailable()) {
|
|
||||||
if (this.crosshairTarget != null && this.crosshairTarget.getType() == HitResult.Type.MISS && this.player.isOnGround()) {
|
if (this.crosshairTarget != null && this.crosshairTarget.getType() == HitResult.Type.MISS && this.player.isOnGround()) {
|
||||||
if (!stackInHand.isEmpty() && stackInHand.getItem() instanceof BlockItem) {
|
if (!stackInHand.isEmpty() && stackInHand.getItem() instanceof BlockItem) {
|
||||||
var hitResult = mod.reacharound.getLastReacharoundResult();
|
var hitResult = reacharound.getLastReacharoundResult();
|
||||||
|
|
||||||
if (hitResult == null)
|
if (hitResult == null || this.interactionManager == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
hitResult = mod.reacharound.withSideForReacharound(hitResult, stackInHand);
|
hitResult = reacharound.withSideForReacharound(hitResult, stackInHand);
|
||||||
|
|
||||||
int previousStackCount = stackInHand.getCount();
|
int previousStackCount = stackInHand.getCount();
|
||||||
var result = this.interactionManager.interactBlock(this.player, hand, hitResult);
|
var result = this.interactionManager.interactBlock(this.player, hand, hitResult);
|
||||||
@@ -67,7 +67,7 @@ public abstract class MouseMixin implements MouseAccessor {
|
|||||||
private void midnightcontrols$onMouseButton(long window, int button, int action, int mods, CallbackInfo ci) {
|
private void midnightcontrols$onMouseButton(long window, int button, int action, int mods, CallbackInfo ci) {
|
||||||
if (window != this.client.getWindow().getHandle()) return;
|
if (window != this.client.getWindow().getHandle()) return;
|
||||||
if (action == 1 && button == GLFW.GLFW_MOUSE_BUTTON_4 && client.currentScreen != null) {
|
if (action == 1 && button == GLFW.GLFW_MOUSE_BUTTON_4 && client.currentScreen != null) {
|
||||||
MidnightControlsClient.get().input.tryGoBack(client.currentScreen);
|
MidnightControlsClient.input.tryGoBack(client.currentScreen);
|
||||||
}
|
}
|
||||||
else if ((client.currentScreen == null && doMixedInput() || client.currentScreen instanceof TouchscreenOverlay) && client.player != null && button == GLFW_MOUSE_BUTTON_1) {
|
else if ((client.currentScreen == null && doMixedInput() || client.currentScreen instanceof TouchscreenOverlay) && client.player != null && button == GLFW_MOUSE_BUTTON_1) {
|
||||||
double mouseX = x / client.getWindow().getScaleFactor();
|
double mouseX = x / client.getWindow().getScaleFactor();
|
||||||
@@ -87,7 +87,7 @@ public abstract class MouseMixin implements MouseAccessor {
|
|||||||
TouchInput.clickStartTime = System.currentTimeMillis();
|
TouchInput.clickStartTime = System.currentTimeMillis();
|
||||||
boolean bl = false;
|
boolean bl = false;
|
||||||
if (client.currentScreen instanceof TouchscreenOverlay overlay) bl = overlay.mouseClicked(mouseX, mouseY, button);
|
if (client.currentScreen instanceof TouchscreenOverlay overlay) bl = overlay.mouseClicked(mouseX, mouseY, button);
|
||||||
if (!bl) TouchInput.firstHitResult = TouchUtils.getTargettedObject(mouseX, mouseY);
|
if (!bl) TouchInput.firstHitResult = TouchUtils.getTargetedObject(mouseX, mouseY);
|
||||||
if (client.currentScreen == null) ci.cancel();
|
if (client.currentScreen == null) ci.cancel();
|
||||||
}
|
}
|
||||||
else if (TouchInput.mouseReleased(mouseX, mouseY, button)) ci.cancel();
|
else if (TouchInput.mouseReleased(mouseX, mouseY, button)) ci.cancel();
|
||||||
@@ -120,7 +120,7 @@ public abstract class MouseMixin implements MouseAccessor {
|
|||||||
cursorYSmoother.clear();
|
cursorYSmoother.clear();
|
||||||
}
|
}
|
||||||
EyeTrackerHandler.updateMouseWithEyeTracking(x + cursorDeltaX, y + cursorDeltaY, client,
|
EyeTrackerHandler.updateMouseWithEyeTracking(x + cursorDeltaX, y + cursorDeltaY, client,
|
||||||
glfwTime, leftButtonClicked, isUsingLongRangedTool(), cursorXSmoother, cursorYSmoother);
|
glfwTime, leftButtonClicked, midnightcontrols$isUsingLongRangedTool(), cursorXSmoother, cursorYSmoother);
|
||||||
glfwTime = GlfwUtil.getTime();
|
glfwTime = GlfwUtil.getTime();
|
||||||
cursorDeltaX = 0.0;
|
cursorDeltaX = 0.0;
|
||||||
cursorDeltaY = 0.0;
|
cursorDeltaY = 0.0;
|
||||||
@@ -132,7 +132,7 @@ public abstract class MouseMixin implements MouseAccessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Unique
|
@Unique
|
||||||
private boolean isUsingLongRangedTool() {
|
private boolean midnightcontrols$isUsingLongRangedTool() {
|
||||||
if (client.player == null) return false;
|
if (client.player == null) return false;
|
||||||
ItemStack stack = client.player.getActiveItem();
|
ItemStack stack = client.player.getActiveItem();
|
||||||
return (leftButtonClicked && (stack.getUseAction() == UseAction.BOW || stack.getUseAction() == UseAction.CROSSBOW ||
|
return (leftButtonClicked && (stack.getUseAction() == UseAction.BOW || stack.getUseAction() == UseAction.CROSSBOW ||
|
||||||
@@ -41,6 +41,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
|
|
||||||
|
import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.reacharound;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a mixin to WorldRenderer.
|
* Represents a mixin to WorldRenderer.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -83,12 +85,12 @@ public abstract class WorldRendererMixin {
|
|||||||
private void onOutlineRender(RenderTickCounter tickCounter, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightmapTextureManager lightmapTextureManager, Matrix4f matrix4f, Matrix4f matrix4f2, CallbackInfo ci, @Local MatrixStack matrices) {
|
private void onOutlineRender(RenderTickCounter tickCounter, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightmapTextureManager lightmapTextureManager, Matrix4f matrix4f, Matrix4f matrix4f2, CallbackInfo ci, @Local MatrixStack matrices) {
|
||||||
if (((MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && MidnightControlsConfig.touchInControllerMode) || MidnightControlsConfig.controlsMode == ControlsMode.TOUCHSCREEN)
|
if (((MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && MidnightControlsConfig.touchInControllerMode) || MidnightControlsConfig.controlsMode == ControlsMode.TOUCHSCREEN)
|
||||||
&& MidnightControlsConfig.touchMode == TouchMode.FINGER_POS) {
|
&& MidnightControlsConfig.touchMode == TouchMode.FINGER_POS) {
|
||||||
this.renderFingerOutline(matrices, camera);
|
this.midnightcontrols$renderFingerOutline(matrices, camera);
|
||||||
}
|
}
|
||||||
this.renderReacharoundOutline(matrices, camera);
|
this.midnightcontrols$renderReacharoundOutline(matrices, camera);
|
||||||
}
|
}
|
||||||
@Unique
|
@Unique
|
||||||
private void renderFingerOutline(MatrixStack matrices, Camera camera) {
|
private void midnightcontrols$renderFingerOutline(MatrixStack matrices, Camera camera) {
|
||||||
if (TouchInput.firstHitResult == null || TouchInput.firstHitResult.getType() != HitResult.Type.BLOCK)
|
if (TouchInput.firstHitResult == null || TouchInput.firstHitResult.getType() != HitResult.Type.BLOCK)
|
||||||
return;
|
return;
|
||||||
BlockHitResult result = (BlockHitResult) TouchInput.firstHitResult;
|
BlockHitResult result = (BlockHitResult) TouchInput.firstHitResult;
|
||||||
@@ -106,10 +108,10 @@ public abstract class WorldRendererMixin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
@Unique
|
@Unique
|
||||||
private void renderReacharoundOutline(MatrixStack matrices, Camera camera) {
|
private void midnightcontrols$renderReacharoundOutline(MatrixStack matrices, Camera camera) {
|
||||||
if (this.client.crosshairTarget == null || this.client.crosshairTarget.getType() != HitResult.Type.MISS || !MidnightControlsConfig.shouldRenderReacharoundOutline)
|
if (this.client.crosshairTarget == null || this.client.crosshairTarget.getType() != HitResult.Type.MISS || !MidnightControlsConfig.shouldRenderReacharoundOutline)
|
||||||
return;
|
return;
|
||||||
var result = MidnightControlsClient.get().reacharound.getLastReacharoundResult();
|
var result = reacharound.getLastReacharoundResult();
|
||||||
if (result == null)
|
if (result == null)
|
||||||
return;
|
return;
|
||||||
var blockPos = result.getBlockPos();
|
var blockPos = result.getBlockPos();
|
||||||
@@ -118,10 +120,8 @@ public abstract class WorldRendererMixin {
|
|||||||
if (stack == null || !(stack.getItem() instanceof BlockItem))
|
if (stack == null || !(stack.getItem() instanceof BlockItem))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var mod = MidnightControlsClient.get();
|
|
||||||
|
|
||||||
var block = ((BlockItem) stack.getItem()).getBlock();
|
var block = ((BlockItem) stack.getItem()).getBlock();
|
||||||
result = mod.reacharound.withSideForReacharound(result, block);
|
result = reacharound.withSideForReacharound(result, block);
|
||||||
var context = new ItemPlacementContext(new ItemUsageContext(this.client.player, Hand.MAIN_HAND, result));
|
var context = new ItemPlacementContext(new ItemUsageContext(this.client.player, Hand.MAIN_HAND, result));
|
||||||
|
|
||||||
var placementState = block.getPlacementState(context);
|
var placementState = block.getPlacementState(context);
|
||||||
@@ -11,22 +11,16 @@ public class EyeTrackerHandler {
|
|||||||
* Based on the updateMouse method in the Mouse.class, this changes the mouse algorithm to suit eye tracking.
|
* Based on the updateMouse method in the Mouse.class, this changes the mouse algorithm to suit eye tracking.
|
||||||
* This requires the cursor to not be locked, and the raw input setting to be turned off.
|
* This requires the cursor to not be locked, and the raw input setting to be turned off.
|
||||||
*/
|
*/
|
||||||
public static void updateMouseWithEyeTracking(double mouseX, double mouseY,
|
public static void updateMouseWithEyeTracking(double mouseX, double mouseY, MinecraftClient client, double lastMouseUpdateTime, boolean holdingLeftMouseButton, boolean usingLongRangedTool, Smoother smoothX, Smoother smoothY) {
|
||||||
MinecraftClient client,
|
if (client.player == null) return;
|
||||||
double lastMouseUpdateTime,
|
/* The player wants objects of interest to be moved under the crosshair that is always center of screen.
|
||||||
boolean holdingLeftMouseButton,
|
* Normal mouse controls operate with the delta values from the direction of mouse movement,
|
||||||
boolean usingLongRangedTool,
|
* but in eye tracking we want to use the cursor's actual x,y values (their point of gaze), relative to
|
||||||
Smoother smoothX,
|
* the screen center (where the crosshair is). This new eye tracking delta creates a vector that points
|
||||||
Smoother smoothY
|
* from the crosshair to the gaze point. As the player keeps their eyes on the object of interest, we pull
|
||||||
) {
|
* that object into the center until the object is underneath the crosshair.
|
||||||
// The player wants objects of interest to be moved under the crosshair that is always center of screen.
|
*/
|
||||||
// Normal mouse controls operate with the delta values from the direction of mouse movement,
|
double deltaTime = GlfwUtil.getTime() - lastMouseUpdateTime;
|
||||||
// but in eye tracking we want to use the cursor's actual x,y values (their point of gaze), relative to
|
|
||||||
// the screen center (where the crosshair is). This new eye tracking delta creates a vector that points
|
|
||||||
// from the crosshair to the gaze point. As the player keeps their eyes on the object of interest, we pull
|
|
||||||
// that object into the center until the object is underneath the crosshair.
|
|
||||||
double timestamp = GlfwUtil.getTime();
|
|
||||||
double deltaTime = timestamp - lastMouseUpdateTime;
|
|
||||||
|
|
||||||
// The center of screen is the new (0,0)
|
// The center of screen is the new (0,0)
|
||||||
double centerX = client.getWindow().getWidth() / 2.0;
|
double centerX = client.getWindow().getWidth() / 2.0;
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.ring;
|
package eu.midnightdust.midnightcontrols.client.ring;
|
||||||
|
|
||||||
import com.electronwill.nightconfig.core.Config;
|
import com.google.gson.Gson;
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.ButtonState;
|
import eu.midnightdust.midnightcontrols.client.enums.ButtonState;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
||||||
import eu.midnightdust.midnightcontrols.client.util.KeyBindingAccessor;
|
import eu.midnightdust.midnightcontrols.client.util.KeyBindingAccessor;
|
||||||
@@ -63,7 +63,7 @@ public class ButtonBindingRingAction extends RingAction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable RingAction parse(@NotNull Config config) {
|
public @Nullable RingAction parse(@NotNull Gson config) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.ring;
|
package eu.midnightdust.midnightcontrols.client.ring;
|
||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
import eu.midnightdust.midnightcontrols.MidnightControls;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
||||||
@@ -34,16 +34,14 @@ public final class MidnightRing {
|
|||||||
|
|
||||||
private final Map<String, RingAction.Factory> actionFactories = new Object2ObjectOpenHashMap<>();
|
private final Map<String, RingAction.Factory> actionFactories = new Object2ObjectOpenHashMap<>();
|
||||||
private final List<RingPage> pages = new ArrayList<>(Collections.singletonList(RingPage.DEFAULT));
|
private final List<RingPage> pages = new ArrayList<>(Collections.singletonList(RingPage.DEFAULT));
|
||||||
private final MidnightControlsClient mod;
|
|
||||||
private int currentPage = 0;
|
private int currentPage = 0;
|
||||||
|
|
||||||
public MidnightRing(@NotNull MidnightControlsClient mod) {
|
public MidnightRing() {
|
||||||
this.mod = mod;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void registerAction(@NotNull String name, @NotNull RingAction.Factory factory) {
|
public void registerAction(@NotNull String name, @NotNull RingAction.Factory factory) {
|
||||||
if (this.actionFactories.containsKey(name)) {
|
if (this.actionFactories.containsKey(name)) {
|
||||||
this.mod.warn("Tried to register a ring action twice: \"" + name + "\".");
|
MidnightControls.warn("Tried to register a ring action twice: \"" + name + "\".");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.actionFactories.put(name, factory);
|
this.actionFactories.put(name, factory);
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.ring;
|
package eu.midnightdust.midnightcontrols.client.ring;
|
||||||
|
|
||||||
import com.electronwill.nightconfig.core.Config;
|
import com.google.gson.Gson;
|
||||||
import net.minecraft.client.font.TextRenderer;
|
import net.minecraft.client.font.TextRenderer;
|
||||||
import net.minecraft.client.gui.DrawContext;
|
import net.minecraft.client.gui.DrawContext;
|
||||||
import net.minecraft.client.gui.screen.Screen;
|
import net.minecraft.client.gui.screen.Screen;
|
||||||
@@ -75,6 +75,6 @@ public abstract class RingAction implements Nameable {
|
|||||||
public interface Factory {
|
public interface Factory {
|
||||||
@NotNull Supplier<RingAction> newFromGui(@NotNull Screen screen);
|
@NotNull Supplier<RingAction> newFromGui(@NotNull Screen screen);
|
||||||
|
|
||||||
@Nullable RingAction parse(@NotNull Config config);
|
@Nullable RingAction parse(@NotNull Gson config);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -12,7 +12,6 @@ package eu.midnightdust.midnightcontrols.client.ring;
|
|||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
||||||
import net.minecraft.client.font.TextRenderer;
|
import net.minecraft.client.font.TextRenderer;
|
||||||
import net.minecraft.client.gui.DrawContext;
|
import net.minecraft.client.gui.DrawContext;
|
||||||
import net.minecraft.client.util.math.MatrixStack;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -49,7 +48,7 @@ public class RingPage {
|
|||||||
public void render(@NotNull DrawContext context, @NotNull TextRenderer textRenderer, int width, int height, int mouseX, int mouseY, float tickDelta) {
|
public void render(@NotNull DrawContext context, @NotNull TextRenderer textRenderer, int width, int height, int mouseX, int mouseY, float tickDelta) {
|
||||||
int centerX = width / 2;
|
int centerX = width / 2;
|
||||||
int centerY = height / 2;
|
int centerY = height / 2;
|
||||||
if (MidnightControlsClient.get().ring.getMaxPages() > 1) context.drawCenteredTextWithShadow(textRenderer, name, centerX, 5, 0xffffff);
|
if (MidnightControlsClient.ring.getMaxPages() > 1) context.drawCenteredTextWithShadow(textRenderer, name, centerX, 5, 0xffffff);
|
||||||
|
|
||||||
int offset = MidnightRing.ELEMENT_SIZE + (MidnightRing.ELEMENT_SIZE / 2) + 5;
|
int offset = MidnightRing.ELEMENT_SIZE + (MidnightRing.ELEMENT_SIZE / 2) + 5;
|
||||||
|
|
||||||
@@ -18,6 +18,7 @@ public class TouchInput {
|
|||||||
private static final MinecraftClient client = MinecraftClient.getInstance();
|
private static final MinecraftClient client = MinecraftClient.getInstance();
|
||||||
public static long clickStartTime;
|
public static long clickStartTime;
|
||||||
public static HitResult firstHitResult = null;
|
public static HitResult firstHitResult = null;
|
||||||
|
|
||||||
public static void tick() {
|
public static void tick() {
|
||||||
if ((client.currentScreen == null && doMixedInput()) || client.currentScreen instanceof TouchscreenOverlay) {
|
if ((client.currentScreen == null && doMixedInput()) || client.currentScreen instanceof TouchscreenOverlay) {
|
||||||
double scaleFactor = client.getWindow().getScaleFactor();
|
double scaleFactor = client.getWindow().getScaleFactor();
|
||||||
@@ -35,7 +36,7 @@ public class TouchInput {
|
|||||||
client.interactionManager.interactItem(client.player, client.player.getActiveHand());
|
client.interactionManager.interactItem(client.player, client.player.getActiveHand());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
HitResult result = TouchUtils.getTargettedObject(mouseX, mouseY);
|
HitResult result = TouchUtils.getTargetedObject(mouseX, mouseY);
|
||||||
if (result == null || firstHitResult == null) {
|
if (result == null || firstHitResult == null) {
|
||||||
client.interactionManager.cancelBlockBreaking();
|
client.interactionManager.cancelBlockBreaking();
|
||||||
return;
|
return;
|
||||||
@@ -47,13 +48,13 @@ public class TouchInput {
|
|||||||
client.particleManager.addBlockBreakingParticles(blockHit.getBlockPos(), blockHit.getSide());
|
client.particleManager.addBlockBreakingParticles(blockHit.getBlockPos(), blockHit.getSide());
|
||||||
client.player.swingHand(Hand.MAIN_HAND);
|
client.player.swingHand(Hand.MAIN_HAND);
|
||||||
} else client.interactionManager.cancelBlockBreaking();
|
} else client.interactionManager.cancelBlockBreaking();
|
||||||
firstHitResult = TouchUtils.getTargettedObject(mouseX, mouseY);
|
firstHitResult = TouchUtils.getTargetedObject(mouseX, mouseY);
|
||||||
}
|
}
|
||||||
else if (result instanceof EntityHitResult entityHit && firstHitResult instanceof EntityHitResult firstEntity && entityHit.getEntity().getUuid().compareTo(firstEntity.getEntity().getUuid()) == 0) {
|
else if (result instanceof EntityHitResult entityHit && firstHitResult instanceof EntityHitResult firstEntity && entityHit.getEntity().getUuid().compareTo(firstEntity.getEntity().getUuid()) == 0) {
|
||||||
if (client.interactionManager.interactEntity(client.player, entityHit.getEntity(), client.player.getActiveHand()) == ActionResult.SUCCESS) {
|
if (client.interactionManager.interactEntity(client.player, entityHit.getEntity(), client.player.getActiveHand()) == ActionResult.SUCCESS) {
|
||||||
client.player.swingHand(Hand.MAIN_HAND);
|
client.player.swingHand(Hand.MAIN_HAND);
|
||||||
}
|
}
|
||||||
firstHitResult = TouchUtils.getTargettedObject(mouseX, mouseY);
|
firstHitResult = TouchUtils.getTargetedObject(mouseX, mouseY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public static boolean mouseReleased(double mouseX, double mouseY, int button) {
|
public static boolean mouseReleased(double mouseX, double mouseY, int button) {
|
||||||
@@ -69,7 +70,7 @@ public class TouchInput {
|
|||||||
client.interactionManager.stopUsingItem(client.player);
|
client.interactionManager.stopUsingItem(client.player);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
HitResult result = TouchUtils.getTargettedObject(mouseX, mouseY);
|
HitResult result = TouchUtils.getTargetedObject(mouseX, mouseY);
|
||||||
if (result == null) return false;
|
if (result == null) return false;
|
||||||
|
|
||||||
|
|
||||||
@@ -25,8 +25,9 @@ public class TouchUtils {
|
|||||||
public static final Matrix4f lastWorldSpaceMatrix = new Matrix4f();
|
public static final Matrix4f lastWorldSpaceMatrix = new Matrix4f();
|
||||||
public static final Matrix4f lastProjMat = new Matrix4f();
|
public static final Matrix4f lastProjMat = new Matrix4f();
|
||||||
public static final Matrix4f lastModMat = new Matrix4f();
|
public static final Matrix4f lastModMat = new Matrix4f();
|
||||||
public static HitResult getTargettedObject(double mouseX, double mouseY) {
|
|
||||||
if (MidnightControlsConfig.touchMode == TouchMode.CROSSHAIR || PlatformFunctions.isModLoaded("vulkanmod")) {
|
public static HitResult getTargetedObject(double mouseX, double mouseY) {
|
||||||
|
if (client.player == null || client.world == null || MidnightControlsConfig.touchMode == TouchMode.CROSSHAIR || PlatformFunctions.isModLoaded("vulkanmod")) {
|
||||||
return client.crosshairTarget;
|
return client.crosshairTarget;
|
||||||
}
|
}
|
||||||
Vec3d near = screenSpaceToWorldSpace(mouseX, mouseY, 0);
|
Vec3d near = screenSpaceToWorldSpace(mouseX, mouseY, 0);
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
package eu.midnightdust.midnightcontrols.client.util;
|
||||||
|
|
||||||
|
import net.minecraft.client.gui.screen.ingame.HandledScreen;
|
||||||
|
import net.minecraft.screen.slot.Slot;
|
||||||
|
import org.aperlambda.lambdacommon.utils.Pair;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.client;
|
||||||
|
|
||||||
|
public class InventoryUtil {
|
||||||
|
// Finds the closest slot in the GUI within 14 pixels.
|
||||||
|
public static Optional<Slot> findClosestSlot(HandledScreen<?> inventory, int direction) {
|
||||||
|
var accessor = (HandledScreenAccessor) inventory;
|
||||||
|
int guiLeft = accessor.getX();
|
||||||
|
int guiTop = accessor.getY();
|
||||||
|
double mouseX = client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth();
|
||||||
|
double mouseY = client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight();
|
||||||
|
// Finds the hovered slot.
|
||||||
|
var mouseSlot = accessor.midnightcontrols$getSlotAt(mouseX, mouseY);
|
||||||
|
return inventory.getScreenHandler().slots.parallelStream()
|
||||||
|
.filter(Predicate.isEqual(mouseSlot).negate())
|
||||||
|
.map(slot -> {
|
||||||
|
int posX = guiLeft + slot.x + 8;
|
||||||
|
int posY = guiTop + slot.y + 8;
|
||||||
|
|
||||||
|
int otherPosX = (int) mouseX;
|
||||||
|
int otherPosY = (int) mouseY;
|
||||||
|
if (mouseSlot != null) {
|
||||||
|
otherPosX = guiLeft + mouseSlot.x + 8;
|
||||||
|
otherPosY = guiTop + mouseSlot.y + 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Distance between the slot and the cursor.
|
||||||
|
double distance = Math.sqrt(Math.pow(posX - otherPosX, 2) + Math.pow(posY - otherPosY, 2));
|
||||||
|
return Pair.of(slot, distance);
|
||||||
|
}).filter(entry -> {
|
||||||
|
var slot = entry.key;
|
||||||
|
int posX = guiLeft + slot.x + 8;
|
||||||
|
int posY = guiTop + slot.y + 8;
|
||||||
|
int otherPosX = (int) mouseX;
|
||||||
|
int otherPosY = (int) mouseY;
|
||||||
|
if (mouseSlot != null) {
|
||||||
|
otherPosX = guiLeft + mouseSlot.x + 8;
|
||||||
|
otherPosY = guiTop + mouseSlot.y + 8;
|
||||||
|
}
|
||||||
|
if (direction == 0)
|
||||||
|
return posY < otherPosY;
|
||||||
|
else if (direction == 1)
|
||||||
|
return posY > otherPosY;
|
||||||
|
else if (direction == 2)
|
||||||
|
return posX > otherPosX;
|
||||||
|
else if (direction == 3)
|
||||||
|
return posX < otherPosX;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
})
|
||||||
|
.min(Comparator.comparingDouble(p -> p.value))
|
||||||
|
.map(p -> p.key);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
package eu.midnightdust.midnightcontrols.client.util;
|
||||||
|
|
||||||
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
||||||
|
|
||||||
|
import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.client;
|
||||||
|
|
||||||
|
public class ToggleSneakSprintUtil {
|
||||||
|
public static boolean toggleSneak(ButtonBinding button) {
|
||||||
|
if (client.player == null) return false;
|
||||||
|
boolean isFlying = client.player.getAbilities().flying;
|
||||||
|
var option = client.options.getSneakToggled();
|
||||||
|
|
||||||
|
button.asKeyBinding().ifPresent(binding -> {
|
||||||
|
boolean sneakToggled = option.getValue();
|
||||||
|
if (isFlying && sneakToggled)
|
||||||
|
option.setValue(false);
|
||||||
|
else if (MidnightControlsConfig.controllerToggleSneak != sneakToggled)
|
||||||
|
option.setValue(!sneakToggled);
|
||||||
|
binding.setPressed(button.isPressed());
|
||||||
|
if (isFlying && sneakToggled)
|
||||||
|
option.setValue(true);
|
||||||
|
else if (MidnightControlsConfig.controllerToggleSneak != sneakToggled)
|
||||||
|
option.setValue(sneakToggled);
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
public static boolean toggleSprint(ButtonBinding button) {
|
||||||
|
if (client.player == null) return false;
|
||||||
|
boolean isFlying = client.player.getAbilities().flying;
|
||||||
|
var option = client.options.getSprintToggled();
|
||||||
|
|
||||||
|
button.asKeyBinding().ifPresent(binding -> {
|
||||||
|
boolean sprintToggled = option.getValue();
|
||||||
|
if (isFlying && sprintToggled)
|
||||||
|
option.setValue(false);
|
||||||
|
else if (MidnightControlsConfig.controllerToggleSprint != sprintToggled)
|
||||||
|
option.setValue(!sprintToggled);
|
||||||
|
binding.setPressed(button.isPressed());
|
||||||
|
if (client.player.getAbilities().flying && sprintToggled)
|
||||||
|
option.setValue(true);
|
||||||
|
else if (MidnightControlsConfig.controllerToggleSprint != sprintToggled)
|
||||||
|
option.setValue(sprintToggled);
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
package eu.midnightdust.midnightcontrols.client.util.platform;
|
||||||
|
|
||||||
|
import dev.architectury.injectables.annotations.ExpectPlatform;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.mixin.CreativeInventoryScreenAccessor;
|
||||||
|
import net.minecraft.client.MinecraftClient;
|
||||||
|
import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
|
||||||
|
import net.minecraft.item.ItemGroup;
|
||||||
|
import net.minecraft.item.ItemGroups;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class ItemGroupUtil {
|
||||||
|
@ExpectPlatform
|
||||||
|
public static List<ItemGroup> getVisibleGroups(CreativeInventoryScreen screen) {
|
||||||
|
throw new AssertionError();
|
||||||
|
}
|
||||||
|
@ExpectPlatform
|
||||||
|
public static boolean cyclePage(boolean next, CreativeInventoryScreen screen) {
|
||||||
|
throw new AssertionError();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static @NotNull ItemGroup cycleTab(boolean next, MinecraftClient client) {
|
||||||
|
ItemGroup currentTab = CreativeInventoryScreenAccessor.getSelectedTab();
|
||||||
|
int currentColumn = currentTab.getColumn();
|
||||||
|
ItemGroup.Row currentRow = currentTab.getRow();
|
||||||
|
ItemGroup newTab = null;
|
||||||
|
List<ItemGroup> visibleTabs = ItemGroupUtil.getVisibleGroups((CreativeInventoryScreen) client.currentScreen);
|
||||||
|
for (ItemGroup tab : visibleTabs) {
|
||||||
|
if (tab.getRow().equals(currentRow) && ((newTab == null && ((next && tab.getColumn() > currentColumn) ||
|
||||||
|
(!next && tab.getColumn() < currentColumn))) || (newTab != null && ((next && tab.getColumn() > currentColumn && tab.getColumn() < newTab.getColumn()) ||
|
||||||
|
(!next && tab.getColumn() < currentColumn && tab.getColumn() > newTab.getColumn())))))
|
||||||
|
newTab = tab;
|
||||||
|
}
|
||||||
|
if (newTab == null)
|
||||||
|
for (ItemGroup tab : visibleTabs) {
|
||||||
|
if ((tab.getRow().compareTo(currentRow)) != 0 && ((next && newTab == null || next && newTab.getColumn() > tab.getColumn()) || (!next && newTab == null) || (!next && newTab.getColumn() < tab.getColumn())))
|
||||||
|
newTab = tab;
|
||||||
|
}
|
||||||
|
if (newTab == null) {
|
||||||
|
for (ItemGroup tab : visibleTabs) {
|
||||||
|
if ((next && tab.getRow() == ItemGroup.Row.TOP && tab.getColumn() == 0) ||
|
||||||
|
!next && tab.getRow() == ItemGroup.Row.BOTTOM && (newTab == null || tab.getColumn() > newTab.getColumn()))
|
||||||
|
newTab = tab;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (newTab == null || newTab.equals(currentTab)) newTab = ItemGroups.getDefaultTab();
|
||||||
|
return newTab;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package eu.midnightdust.midnightcontrols.client.util.platform;
|
||||||
|
|
||||||
|
import dev.architectury.injectables.annotations.ExpectPlatform;
|
||||||
|
import net.minecraft.network.packet.CustomPayload;
|
||||||
|
import net.minecraft.network.packet.Packet;
|
||||||
|
|
||||||
|
public class NetworkUtil {
|
||||||
|
@ExpectPlatform
|
||||||
|
public static void sendPacketC2S(Packet<?> packet) {
|
||||||
|
throw new AssertionError();
|
||||||
|
}
|
||||||
|
@ExpectPlatform
|
||||||
|
public static void sendPayloadC2S(CustomPayload payload) {
|
||||||
|
throw new AssertionError();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package eu.midnightdust.midnightcontrols.packet;
|
||||||
|
|
||||||
|
import eu.midnightdust.midnightcontrols.MidnightControlsConstants;
|
||||||
|
import net.minecraft.network.RegistryByteBuf;
|
||||||
|
import net.minecraft.network.codec.PacketCodec;
|
||||||
|
import net.minecraft.network.packet.CustomPayload;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public record ControlsModePayload(String controlsMode) implements CustomPayload {
|
||||||
|
public static final Id<ControlsModePayload> PACKET_ID = new Id<>(MidnightControlsConstants.CONTROLS_MODE_CHANNEL);
|
||||||
|
public static final PacketCodec<RegistryByteBuf, ControlsModePayload> codec = PacketCodec.of(ControlsModePayload::write, ControlsModePayload::read);
|
||||||
|
|
||||||
|
public static ControlsModePayload read(RegistryByteBuf buf) {
|
||||||
|
return new ControlsModePayload(buf.readString(32));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void write(RegistryByteBuf buf) {
|
||||||
|
Objects.requireNonNull(controlsMode, "Controls mode cannot be null.");
|
||||||
|
buf.writeString(controlsMode, 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Id<? extends CustomPayload> getId() {
|
||||||
|
return PACKET_ID;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,11 +6,11 @@ import net.minecraft.network.RegistryByteBuf;
|
|||||||
import net.minecraft.network.codec.PacketCodec;
|
import net.minecraft.network.codec.PacketCodec;
|
||||||
import net.minecraft.network.packet.CustomPayload;
|
import net.minecraft.network.packet.CustomPayload;
|
||||||
|
|
||||||
public record FeaturePacket(MidnightControlsFeature... features) implements CustomPayload {
|
public record FeaturePayload(MidnightControlsFeature... features) implements CustomPayload {
|
||||||
public static final Id<FeaturePacket> PACKET_ID = new Id<>(MidnightControlsConstants.FEATURE_CHANNEL);
|
public static final Id<FeaturePayload> PACKET_ID = new Id<>(MidnightControlsConstants.FEATURE_CHANNEL);
|
||||||
public static final PacketCodec<RegistryByteBuf, FeaturePacket> codec = PacketCodec.of(FeaturePacket::write, FeaturePacket::read);
|
public static final PacketCodec<RegistryByteBuf, FeaturePayload> codec = PacketCodec.of(FeaturePayload::write, FeaturePayload::read);
|
||||||
|
|
||||||
public static FeaturePacket read(RegistryByteBuf buf) {
|
public static FeaturePayload read(RegistryByteBuf buf) {
|
||||||
int featureLength = buf.readVarInt();
|
int featureLength = buf.readVarInt();
|
||||||
MidnightControlsFeature[] receivedFeatures = new MidnightControlsFeature[featureLength];
|
MidnightControlsFeature[] receivedFeatures = new MidnightControlsFeature[featureLength];
|
||||||
for (int i = 0; i < featureLength; i++) {
|
for (int i = 0; i < featureLength; i++) {
|
||||||
@@ -22,7 +22,7 @@ public record FeaturePacket(MidnightControlsFeature... features) implements Cust
|
|||||||
receivedFeatures[i] = feature.get();
|
receivedFeatures[i] = feature.get();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new FeaturePacket(receivedFeatures);
|
return new FeaturePayload(receivedFeatures);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void write(RegistryByteBuf buf) {
|
public void write(RegistryByteBuf buf) {
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package eu.midnightdust.midnightcontrols.packet;
|
||||||
|
|
||||||
|
import eu.midnightdust.midnightcontrols.MidnightControlsConstants;
|
||||||
|
import net.minecraft.network.RegistryByteBuf;
|
||||||
|
import net.minecraft.network.codec.PacketCodec;
|
||||||
|
import net.minecraft.network.packet.CustomPayload;
|
||||||
|
|
||||||
|
public record HelloPayload(String version, String controlsMode) implements CustomPayload {
|
||||||
|
public static final CustomPayload.Id<HelloPayload> PACKET_ID = new CustomPayload.Id<>(MidnightControlsConstants.HELLO_CHANNEL);
|
||||||
|
public static final PacketCodec<RegistryByteBuf, HelloPayload> codec = PacketCodec.of(HelloPayload::write, HelloPayload::read);
|
||||||
|
|
||||||
|
public static HelloPayload read(RegistryByteBuf buf) {
|
||||||
|
return new HelloPayload(buf.readString(32), buf.readString(32));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void write(RegistryByteBuf buf) {
|
||||||
|
buf.writeString(version, 32).writeString(controlsMode, 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Id<? extends CustomPayload> getId() {
|
||||||
|
return PACKET_ID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user