mirror of
https://github.com/TeamMidnightDust/MidnightControls.git
synced 2025-12-14 07:35:10 +01:00
Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3a70ab1961 | ||
|
|
1722c2ccaa | ||
|
|
46dafc3e71 | ||
|
|
99298b2bc4 | ||
|
|
070083ab6e | ||
|
|
4d74892e53 | ||
|
|
e8cfee7de5 | ||
|
|
06c589e7f8 | ||
|
|
a71dcb9765 | ||
|
|
281b266b18 | ||
|
|
8d4f8822d3 |
16
.github/ISSUE_TEMPLATE/bug_report.md
vendored
16
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: Bug report
|
name: Bug report
|
||||||
about: Create a report to help us improve
|
about: Create a report to help us improve
|
||||||
title: 'Bug: TITLE HERE'
|
title: ''
|
||||||
labels: bug
|
labels: bug
|
||||||
assignees: ''
|
assignees: ''
|
||||||
|
|
||||||
@@ -21,17 +21,15 @@ Steps to reproduce the behavior:
|
|||||||
A clear and concise description of what you expected to happen.
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
**Screenshots**
|
**Screenshots**
|
||||||
If applicable, add screenshots or videos to help explain your problem.
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
**Desktop (please complete the following information):**
|
**Desktop (please complete the following information):**
|
||||||
- OS: [e.g. Windows / Linux / MacOS]
|
- OS: [e.g. Linux]
|
||||||
- Minecraft [e.g. 1.20.4]
|
- Minecraft [e.g. 1.14.4]
|
||||||
- Modloader [e.g. Fabric Loader 0.15.6]
|
- Fabric [e.g. fabric 0.7.2+build.174]
|
||||||
- Fabric/Quilt Libraries [e.g. Fabric Api 0.96.1+1.20.4]
|
- Mods [e.g. aurora_keystrokes v1.0.0, modmenu v1.7.15]
|
||||||
- Mods [e.g. Puzzle v1.6.1, LilTaterReloaded v1.1.15]
|
|
||||||
- Version [e.g. 1.0.0]
|
- Version [e.g. 1.0.0]
|
||||||
- Remove this line if you actually completed it
|
- Branch [e.g. dev]
|
||||||
|
|
||||||
**Additional context**
|
**Additional context**
|
||||||
Add any other context about the problem here.
|
Add any other context about the problem here.
|
||||||
In case of a crash, please provide the crash log.
|
|
||||||
|
|||||||
40
.github/ISSUE_TEMPLATE/controller_support.md
vendored
40
.github/ISSUE_TEMPLATE/controller_support.md
vendored
@@ -1,40 +0,0 @@
|
|||||||
---
|
|
||||||
name: Controller support
|
|
||||||
about: Report a problem related to a specific controller
|
|
||||||
title: 'Controller Issues: CONTROLLER NAME HERE'
|
|
||||||
labels: controller
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Describe the current state**
|
|
||||||
A clear and concise description of current state of support for the controller and the issues.
|
|
||||||
|
|
||||||
**To Reproduce**
|
|
||||||
If needed, specify steps to reproduce the behavior:
|
|
||||||
1. Go to '...'
|
|
||||||
2. Click on '....'
|
|
||||||
3. Scroll down to '....'
|
|
||||||
4. See error
|
|
||||||
|
|
||||||
**Expected behavior**
|
|
||||||
A clear and concise description of what you expected to happen.
|
|
||||||
|
|
||||||
**Screenshots**
|
|
||||||
If applicable, add screenshots or videos to help explain your problem.
|
|
||||||
|
|
||||||
**Desktop (please complete the following information):**
|
|
||||||
- Have you checked #263 for your controller? [e.g. Yes/No]
|
|
||||||
- Connection method [e.g. Wired / Bluetooth]
|
|
||||||
|
|
||||||
- OS: [e.g. Windows / Linux / MacOS]
|
|
||||||
- Minecraft [e.g. 1.20.4]
|
|
||||||
- Modloader [e.g. Fabric Loader 0.15.6]
|
|
||||||
- Fabric/Quilt Libraries [e.g. Fabric Api 0.96.1+1.20.4]
|
|
||||||
- Mods [e.g. Puzzle v1.6.1, LilTaterReloaded v1.1.15]
|
|
||||||
- Version [e.g. 1.0.0]
|
|
||||||
- Remove this line if you actually completed it
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
Add any other context about the problem here.
|
|
||||||
In case of a crash, please provide the crash log.
|
|
||||||
4
.github/ISSUE_TEMPLATE/feature_request.md
vendored
4
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: Feature request
|
name: Feature request
|
||||||
about: Suggest an idea for this project
|
about: Suggest an idea for this project
|
||||||
title: 'Feature: TITLE HERE'
|
title: ''
|
||||||
labels: enhancement
|
labels: enhancement
|
||||||
assignees: ''
|
assignees: ''
|
||||||
|
|
||||||
@@ -17,4 +17,4 @@ A clear and concise description of what you want to happen.
|
|||||||
A clear and concise description of any alternative solutions or features you've considered.
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
**Additional context**
|
**Additional context**
|
||||||
Add any other context or screenshots/videos about the feature request here.
|
Add any other context or screenshots about the feature request here.
|
||||||
|
|||||||
20
.github/ISSUE_TEMPLATE/mod_support.md
vendored
20
.github/ISSUE_TEMPLATE/mod_support.md
vendored
@@ -1,20 +0,0 @@
|
|||||||
---
|
|
||||||
name: Mod Support
|
|
||||||
about: Compatibility improvements with a specific mod (not for crashes)
|
|
||||||
title: 'Mod Support: MOD NAME HERE'
|
|
||||||
labels: mod compatibility
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Is your compatibility request related to a problem? Please describe.**
|
|
||||||
A clear and concise description of what the problem is. Ex. I've always wanted to [...]
|
|
||||||
|
|
||||||
**Describe the way of compatibility you'd imagine**
|
|
||||||
A clear and concise description of what you want to happen.
|
|
||||||
|
|
||||||
**Describe alternatives you've considered**
|
|
||||||
A clear and concise description of any alternative mods or workarounds you've considered.
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
Add any other context or screenshots/videos about the compatibility request here.
|
|
||||||
@@ -62,10 +62,6 @@ Enter the folder created and run:
|
|||||||
```
|
```
|
||||||
After this is done, everything should be built just fine!
|
After this is done, everything should be built just fine!
|
||||||
|
|
||||||
## FAQ:
|
|
||||||
### The controller does not work, and it's name appears in orange, what can I do?
|
|
||||||
Create a custom mapping as pointed out in the [wiki](https://midnightdust.eu/wiki/midnightcontrols/)
|
|
||||||
|
|
||||||
[Quilt]: https://quiltmc.org
|
[Quilt]: https://quiltmc.org
|
||||||
|
|
||||||
[Mod loader: Quilt/Fabric]: https://img.shields.io/badge/modloader-Quilt%2FFabric-blueviolet?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAADGAAAAxgGwdJvFAAAFU0lEQVR4nO1bwW7bOBCdCHtP+wUNxIvhS7yA7kkPOjf9AKPam4/OF2zzB96bblXhH0jPPkS5G1jnIvgib/IFtX/ALoYZemmKtEWRRe3aDzAsURbJGQ6HM4/02Wq1gmNGcNTSnxQA8IdakDK4AOCfJpj3SpiI98r2rAMAbxrWNWFFOMeL1nCJdXQa1gPTbpCbnm34ABIeBThv2hgAfOyVcF+2ZwkAfHGo54kVIRe6NVxiny4d6vpn2g36ugfqFLhwFB6kkUoc67k0XLv0qYKj9wEnBXiqZwEAf/ZKOOuV8BkLWBFesyI8A4C/LOt6AoC39C7HtBvg9Vt65hUnC/BUDzrOf1MGq5S9WkDZnuVle7ZqsBKgw/tO73K0hku8/u64EmhxsoA96MMvxdEroBIKO+CWoshnqqJPYTAGRJ8sql3QO3Op7D19D3z7AV8KeAGArFf+32lWhDwnKNuzuaUCclaE93KBiOU9hMQV+FLAOxz9lPHRR0VkZXs2oBDUNon5ULZnKOgcYwl4FTwna/K+CtRRwIK+dTnCCwkP9I0fkXmh4FcN+6UKqqtHblvtb+18po4TvKaPilsS8qVuYx5havsbJXS1I0ZVAXP1B5jfyzm+hAnN+We1XPluioX03kJtY9oNtG1T+b1aburDxhRAQVMGHw3z9k65F41nktmjUnjjrAj7ZXv27ECIyEKgBd7saBuka7lsPu0GA1MjR0+KVpwgMTlrMkN4YoztlZ/2camTvD0QjcWZF6KxMgcLyKbdAN+HKOb1y6PYH49gEsUwUKw1G48gi2KQZcApkYxH1eldUQBxeKbkRfXEQjDZ21+h2bMiHJDwH2wk1rSX0XWueHZd2yCZ/oVSnilTaA3VAiqjRRahQ0JBjuov3ijfPqAua0kUg67tmyjWCmvsS504wGQRnywjPJ8wtY3xw3827fjMBXziUalL3DcNrIzYRwXcTbvBZ7lgPHoNxKKYky1/+2xsHxXQbw2X/EIoggQHyjC9Yh8VcC6NshDc66jLOHpC5KSAPejDL8U+KuArboTQZgjHeARn+MFnvhvbRyfYaQ2XfNkTVFgUr/mIxlvkJuyjAjCae6BrYQUPW37vhDpT4MnAsCyIgbHBnYbcADJt7/t+deBCiSWsCG8sOv5IgU2FnJh2g+RnBDl1oCpgogqEx1TEURUFokx+tpCYnEzzjg1kh+fq/Ix9OXpG6OjjgI1VIGWcOMhlXh4PPdAz1VTe90rIU8Z/L9JUnALXSK4SjSUzOY+Y1ekyOlzjaamTvf3X8cjunBH1v6OeVtsG1QI66qYEVkoVmyA/O5fYmIHjgSsrskUavAc6q1BLeXXiANMZu0HKwGav7opGv+LticZqHOToLBeZrJRxC97qjOsowCTgZYO9OlNa25haMwgvsFMJPp3gLW1ji8b6dO89fhfYIbzAl23T4adtjyNvD6/mbbs9Xgs1hRcwWoIvCxDb47nQNm5aRDHvoPGcblNYCi+gtQSfU+AdLYfioLXYtHA9eruBhsILVJRwUIGQo/ACG0o4GAV4El5grQSffMA3SqbEnBdb1zeunfYsvAB3jL4UwE92KauA2NnNbLerNKhEqJ6Q+FIAOjpcATAVzjFHoC3qC9OurCW0W9s+6vXpAy4p0hPkSUL3ziNHiY3tqfNdQN4jORgnSEGMLyU8Udbq1QIEdEyRF3hSwlp4vKkwQimrHDuxAR6S4tleFIPzERnhSFXQEtbkD1kbwiMOlhJroISK8IiDpcQsp4NWeMRBc4I1lWAUHnHwpOgOJWwVHvFbsMIGJewUHvFb7QuQYxR/ttgIzbUAgB9KOM3uc+PN7QAAAABJRU5ErkJggg==
|
[Mod loader: Quilt/Fabric]: https://img.shields.io/badge/modloader-Quilt%2FFabric-blueviolet?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAADGAAAAxgGwdJvFAAAFU0lEQVR4nO1bwW7bOBCdCHtP+wUNxIvhS7yA7kkPOjf9AKPam4/OF2zzB96bblXhH0jPPkS5G1jnIvgib/IFtX/ALoYZemmKtEWRRe3aDzAsURbJGQ6HM4/02Wq1gmNGcNTSnxQA8IdakDK4AOCfJpj3SpiI98r2rAMAbxrWNWFFOMeL1nCJdXQa1gPTbpCbnm34ABIeBThv2hgAfOyVcF+2ZwkAfHGo54kVIRe6NVxiny4d6vpn2g36ugfqFLhwFB6kkUoc67k0XLv0qYKj9wEnBXiqZwEAf/ZKOOuV8BkLWBFesyI8A4C/LOt6AoC39C7HtBvg9Vt65hUnC/BUDzrOf1MGq5S9WkDZnuVle7ZqsBKgw/tO73K0hku8/u64EmhxsoA96MMvxdEroBIKO+CWoshnqqJPYTAGRJ8sql3QO3Op7D19D3z7AV8KeAGArFf+32lWhDwnKNuzuaUCclaE93KBiOU9hMQV+FLAOxz9lPHRR0VkZXs2oBDUNon5ULZnKOgcYwl4FTwna/K+CtRRwIK+dTnCCwkP9I0fkXmh4FcN+6UKqqtHblvtb+18po4TvKaPilsS8qVuYx5havsbJXS1I0ZVAXP1B5jfyzm+hAnN+We1XPluioX03kJtY9oNtG1T+b1aburDxhRAQVMGHw3z9k65F41nktmjUnjjrAj7ZXv27ECIyEKgBd7saBuka7lsPu0GA1MjR0+KVpwgMTlrMkN4YoztlZ/2camTvD0QjcWZF6KxMgcLyKbdAN+HKOb1y6PYH49gEsUwUKw1G48gi2KQZcApkYxH1eldUQBxeKbkRfXEQjDZ21+h2bMiHJDwH2wk1rSX0XWueHZd2yCZ/oVSnilTaA3VAiqjRRahQ0JBjuov3ijfPqAua0kUg67tmyjWCmvsS504wGQRnywjPJ8wtY3xw3827fjMBXziUalL3DcNrIzYRwXcTbvBZ7lgPHoNxKKYky1/+2xsHxXQbw2X/EIoggQHyjC9Yh8VcC6NshDc66jLOHpC5KSAPejDL8U+KuArboTQZgjHeARn+MFnvhvbRyfYaQ2XfNkTVFgUr/mIxlvkJuyjAjCae6BrYQUPW37vhDpT4MnAsCyIgbHBnYbcADJt7/t+deBCiSWsCG8sOv5IgU2FnJh2g+RnBDl1oCpgogqEx1TEURUFokx+tpCYnEzzjg1kh+fq/Ix9OXpG6OjjgI1VIGWcOMhlXh4PPdAz1VTe90rIU8Z/L9JUnALXSK4SjSUzOY+Y1ekyOlzjaamTvf3X8cjunBH1v6OeVtsG1QI66qYEVkoVmyA/O5fYmIHjgSsrskUavAc6q1BLeXXiANMZu0HKwGav7opGv+LticZqHOToLBeZrJRxC97qjOsowCTgZYO9OlNa25haMwgvsFMJPp3gLW1ji8b6dO89fhfYIbzAl23T4adtjyNvD6/mbbs9Xgs1hRcwWoIvCxDb47nQNm5aRDHvoPGcblNYCi+gtQSfU+AdLYfioLXYtHA9eruBhsILVJRwUIGQo/ACG0o4GAV4El5grQSffMA3SqbEnBdb1zeunfYsvAB3jL4UwE92KauA2NnNbLerNKhEqJ6Q+FIAOjpcATAVzjFHoC3qC9OurCW0W9s+6vXpAy4p0hPkSUL3ziNHiY3tqfNdQN4jORgnSEGMLyU8Udbq1QIEdEyRF3hSwlp4vKkwQimrHDuxAR6S4tleFIPzERnhSFXQEtbkD1kbwiMOlhJroISK8IiDpcQsp4NWeMRBc4I1lWAUHnHwpOgOJWwVHvFbsMIGJewUHvFb7QuQYxR/ttgIzbUAgB9KOM3uc+PN7QAAAABJRU5ErkJggg==
|
||||||
|
|||||||
211
build.gradle
211
build.gradle
@@ -1,22 +1,64 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id 'fabric-loom' version '1.6-SNAPSHOT'
|
id 'fabric-loom' version '0.11-SNAPSHOT'
|
||||||
id 'java-library'
|
id 'java-library'
|
||||||
id 'maven-publish'
|
id 'maven-publish'
|
||||||
id 'com.github.johnrengelman.shadow' version '7.0.0'
|
id 'com.github.johnrengelman.shadow' version '7.0.0'
|
||||||
id "me.shedaniel.unified-publishing" version "0.1.+"
|
id 'com.modrinth.minotaur' version '1.2.+'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
import com.google.gson.GsonBuilder
|
||||||
|
import com.google.gson.JsonObject
|
||||||
|
import com.modrinth.minotaur.TaskModrinthUpload
|
||||||
|
import com.modrinth.minotaur.request.VersionType
|
||||||
|
import com.modrinth.minotaur.responses.ResponseError
|
||||||
|
import org.apache.http.client.config.CookieSpecs
|
||||||
|
import org.apache.http.client.config.RequestConfig
|
||||||
|
import org.apache.http.client.entity.EntityBuilder
|
||||||
|
import org.apache.http.client.methods.HttpPatch
|
||||||
|
import org.apache.http.entity.ContentType
|
||||||
|
import org.apache.http.impl.client.HttpClientBuilder
|
||||||
|
import org.apache.http.util.EntityUtils
|
||||||
|
|
||||||
group = project.maven_group
|
group = project.maven_group
|
||||||
version = "${project.mod_version}+${project.minecraft_version}"
|
version = "${project.mod_version}+${getMCVersionString()}"
|
||||||
|
archivesBaseName = project.archives_base_name
|
||||||
|
|
||||||
// This field defines the Java version your mod target.
|
// This field defines the Java version your mod target.
|
||||||
def targetJavaVersion = 21
|
def targetJavaVersion = 17
|
||||||
|
|
||||||
boolean isMCVersionNonRelease() {
|
boolean isMCVersionNonRelease() {
|
||||||
return project.minecraft_version.matches('^\\d\\dw\\d\\d[a-z]$')
|
return project.minecraft_version.matches('^\\d\\dw\\d\\d[a-z]$')
|
||||||
|| project.minecraft_version.matches('\\d+\\.\\d+-(pre|rc)(\\d+)')
|
|| project.minecraft_version.matches('\\d+\\.\\d+-(pre|rc)(\\d+)')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String getMCVersionString() {
|
||||||
|
if (isMCVersionNonRelease()) {
|
||||||
|
return project.minecraft_version
|
||||||
|
}
|
||||||
|
def version = project.minecraft_version.split('\\.')
|
||||||
|
return version[0] + '.' + version[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean pingUrl(String address) {
|
||||||
|
try {
|
||||||
|
def conn = (HttpURLConnection) new URL(address).openConnection()
|
||||||
|
int responseCode = conn.getResponseCode()
|
||||||
|
return (200 <= responseCode && responseCode <= 399)
|
||||||
|
} catch (IOException ignored) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String parseReadme() {
|
||||||
|
def excludeRegex = /(?m)<!-- modrinth_exclude\.start -->(.|\n)*?<!-- modrinth_exclude\.end -->/
|
||||||
|
def linkRegex = /!\[([A-z_ ]+)]\((images\/[A-z.\/_]+)\)/
|
||||||
|
|
||||||
|
def readme = (String) file('README.md').text
|
||||||
|
readme = readme.replaceAll(excludeRegex, '')
|
||||||
|
return readme
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenLocal()
|
mavenLocal()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
@@ -31,7 +73,6 @@ repositories {
|
|||||||
}
|
}
|
||||||
maven { url "https://maven.terraformersmc.com/releases/" }
|
maven { url "https://maven.terraformersmc.com/releases/" }
|
||||||
maven { url 'https://maven.kosmx.dev' }
|
maven { url 'https://maven.kosmx.dev' }
|
||||||
maven { url 'https://maven.isxander.dev/releases' }
|
|
||||||
maven { url 'https://maven.shedaniel.me/' }
|
maven { url 'https://maven.shedaniel.me/' }
|
||||||
maven { url 'https://jitpack.io' }
|
maven { url 'https://jitpack.io' }
|
||||||
maven { url "https://api.modrinth.com/maven" }
|
maven { url "https://api.modrinth.com/maven" }
|
||||||
@@ -52,16 +93,15 @@ dependencies {
|
|||||||
// Fabric API. This is technically optional, but you probably want it anyway.
|
// Fabric API. This is technically optional, but you probably want it anyway.
|
||||||
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
|
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
|
||||||
|
|
||||||
include modImplementation ("maven.modrinth:obsidianui:${project.obsidianui_version}") {}
|
modImplementation "dev.lambdaurora:spruceui:${project.spruceui_version}"
|
||||||
|
include "dev.lambdaurora:spruceui:${project.spruceui_version}"
|
||||||
api('org.aperlambda:lambdajcommon:1.8.1') {
|
api('org.aperlambda:lambdajcommon:1.8.1') {
|
||||||
exclude group: 'com.google.code.gson'
|
exclude group: 'com.google.code.gson'
|
||||||
exclude group: 'com.google.guava'
|
exclude group: 'com.google.guava'
|
||||||
}
|
}
|
||||||
include 'org.aperlambda:lambdajcommon:1.8.1'
|
include 'org.aperlambda:lambdajcommon:1.8.1'
|
||||||
|
|
||||||
modCompileOnlyApi ("com.terraformersmc:modmenu:${project.modmenu_version}") {
|
modImplementation "com.terraformersmc:modmenu:${project.modmenu_version}"
|
||||||
exclude(group: "net.fabricmc.fabric-api")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compatibility mods
|
// Compatibility mods
|
||||||
|
|
||||||
@@ -69,19 +109,12 @@ dependencies {
|
|||||||
// modImplementation("maven.modrinth:ok-zoomer:${project.ok_zoomer_version}")
|
// modImplementation("maven.modrinth:ok-zoomer:${project.ok_zoomer_version}")
|
||||||
// modImplementation "io.github.ennuil:LibZoomer:${project.libzoomer_version}"
|
// modImplementation "io.github.ennuil:LibZoomer:${project.libzoomer_version}"
|
||||||
|
|
||||||
modCompileOnlyApi "io.github.cottonmc:LibGui:${project.libgui_version}"
|
modImplementation "io.github.cottonmc:LibGui:${project.libgui_version}"
|
||||||
modCompileOnlyApi "org.quiltmc:quilt-json5:1.0.0"
|
modImplementation "org.quiltmc:quilt-json5:1.0.0"
|
||||||
modCompileOnly "maven.modrinth:sodium:${project.sodium_version}"
|
modCompileOnly "maven.modrinth:sodium:${project.sodium_version}"
|
||||||
modCompileOnlyApi "maven.modrinth:emi:${project.emi_version}"
|
modImplementation("maven.modrinth:emi:${project.emi_version}")
|
||||||
modCompileOnlyApi "maven.modrinth:emotecraft:${project.emotecraft_version}"
|
modImplementation "maven.modrinth:emotecraft:${project.emotecraft_version}"
|
||||||
modCompileOnlyApi "io.github.kosmx:bendy-lib:${project.bendylib_version}"
|
modImplementation "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}"
|
modImplementation "maven.modrinth:midnightlib:${project.midnightlib_version}"
|
||||||
include "maven.modrinth:midnightlib:${project.midnightlib_version}"
|
include "maven.modrinth:midnightlib:${project.midnightlib_version}"
|
||||||
@@ -115,53 +148,113 @@ processResources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ext {
|
task publishModrinth(type: TaskModrinthUpload) {
|
||||||
releaseChangelog = {
|
dependsOn(build)
|
||||||
def changes = new StringBuilder()
|
onlyIf {
|
||||||
changes << "## MidnightControls v$project.version for $project.minecraft_version\n[View the changelog](https://www.github.com/TeamMidnightDust/MidnightControls/commits/)"
|
System.getenv('MODRINTH_TOKEN')
|
||||||
def proc = "git log --max-count=1 --pretty=format:%s".execute()
|
}
|
||||||
proc.in.eachLine { line ->
|
|
||||||
def processedLine = line.toString()
|
token = System.getenv('MODRINTH_TOKEN')
|
||||||
if (!processedLine.contains("New translations") && !processedLine.contains("Merge") && !processedLine.contains("branch")) {
|
projectId = project.modrinth_id
|
||||||
changes << "\n- ${processedLine.capitalize()}"
|
versionNumber = version
|
||||||
}
|
versionName = "midnightcontrols ${project.mod_version} (${getMCVersionString()})"
|
||||||
|
addGameVersion((String) project.minecraft_version)
|
||||||
|
addLoader('fabric')
|
||||||
|
versionType = isMCVersionNonRelease() ? VersionType.BETA : VersionType.RELEASE
|
||||||
|
|
||||||
|
// Changelog fetching
|
||||||
|
def changelogText = file('CHANGELOG.md').text
|
||||||
|
def regexVersion = ((String) project.mod_version).replaceAll('\\.', /\\./).replaceAll('\\+', '\\+')
|
||||||
|
def changelogRegex = ~"###? ${regexVersion}\\n\\n(( *- .+\\n)+)"
|
||||||
|
def matcher = changelogText =~ changelogRegex
|
||||||
|
|
||||||
|
if (matcher.find()) {
|
||||||
|
changelog = matcher.group(1)
|
||||||
|
|
||||||
|
def changelogLines = changelogText.split('\n')
|
||||||
|
def linkRefRegex = ~'^\\[([A-z0-9 _\\-/+.]+)]: '
|
||||||
|
for (int i = changelogLines.length - 1; i > 0; i--) {
|
||||||
|
def line = changelogLines[i]
|
||||||
|
if ((line =~ linkRefRegex).find())
|
||||||
|
changelog += '\n' + line
|
||||||
|
else break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Readme
|
||||||
|
doFirst {
|
||||||
|
final def client = HttpClientBuilder.create().setDefaultRequestConfig(RequestConfig.custom().setCookieSpec(CookieSpecs.IGNORE_COOKIES).build()).build()
|
||||||
|
final def patch = new HttpPatch((String) (apiURL + '/v1/mod/' + projectId))
|
||||||
|
patch.addHeader("Authorization", token)
|
||||||
|
|
||||||
|
var json = new JsonObject()
|
||||||
|
json.addProperty("body", parseReadme())
|
||||||
|
patch.setEntity(EntityBuilder.create()
|
||||||
|
.setText(json.toString())
|
||||||
|
.setContentType(ContentType.APPLICATION_JSON)
|
||||||
|
.build())
|
||||||
|
|
||||||
|
final def response = client.execute(patch)
|
||||||
|
final int status = response.getStatusLine().getStatusCode()
|
||||||
|
|
||||||
|
final def gson = new GsonBuilder().create()
|
||||||
|
if (status == 200) {
|
||||||
|
project.getLogger().lifecycle("Successfully updated readme to ${projectId}.")
|
||||||
|
} else {
|
||||||
|
errorInfo = gson.fromJson(EntityUtils.toString(response.getEntity()), ResponseError.class)
|
||||||
|
project.getLogger().error("Upload failed! Status: ${status} Error: ${errorInfo.getError()} Reason: ${errorInfo.getDescription()}")
|
||||||
|
throw new GradleException("Upload failed! Status: ${status} Reason: ${errorInfo.getDescription()}")
|
||||||
}
|
}
|
||||||
proc.waitFor()
|
|
||||||
return changes.toString()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unifiedPublishing {
|
// configure the maven publication
|
||||||
project {
|
publishing {
|
||||||
displayName = "MidnightControls v$project.version - Fabric $project.minecraft_version"
|
publications {
|
||||||
releaseType = "$project.release_type"
|
mavenJava(MavenPublication) {
|
||||||
changelog = releaseChangelog()
|
artifact(sourcesJar) {
|
||||||
gameVersions = []
|
builtBy remapSourcesJar
|
||||||
gameLoaders = ["fabric","quilt"]
|
}
|
||||||
mainPublication remapJar
|
|
||||||
relations {
|
pom {
|
||||||
includes {
|
name = 'midnightcontrols'
|
||||||
curseforge = "midnightlib"
|
description = 'Adds better controls, and controller support.'
|
||||||
modrinth = "midnightlib"
|
}
|
||||||
|
|
||||||
|
pom.withXml {
|
||||||
|
def dependenciesNode = asNode().appendNode('dependencies')
|
||||||
|
|
||||||
|
configurations.shadow.allDependencies.each {
|
||||||
|
def dependencyNode = dependenciesNode.appendNode('dependency')
|
||||||
|
|
||||||
|
dependencyNode.appendNode('groupId', it.group)
|
||||||
|
dependencyNode.appendNode('artifactId', it.name)
|
||||||
|
dependencyNode.appendNode('version', it.version)
|
||||||
|
dependencyNode.appendNode('scope', 'compile')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var CURSEFORGE_TOKEN = project.findProperty("CURSEFORGE_TOKEN") ?: System.getenv("CURSEFORGE_TOKEN")
|
repositories {
|
||||||
if (CURSEFORGE_TOKEN != null) {
|
mavenLocal()
|
||||||
curseforge {
|
maven {
|
||||||
token = CURSEFORGE_TOKEN
|
name 'GithubPackages'
|
||||||
id = rootProject.curseforge_id
|
url uri('https://maven.pkg.github.com/LambdAurora/midnightcontrols')
|
||||||
gameVersions.addAll "Java 21", project.minecraft_version
|
credentials {
|
||||||
|
username = project.findProperty("gpr.user") ?: System.getenv("USERNAME")
|
||||||
|
password = project.findProperty("gpr.key") ?: System.getenv("TOKEN")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
def midnightcontrolsMaven = System.getenv('midnightcontrols_MAVEN')
|
||||||
var MODRINTH_TOKEN = project.findProperty("MODRINTH_TOKEN") ?: System.getenv("MODRINTH_TOKEN")
|
if (midnightcontrolsMaven) {
|
||||||
if (MODRINTH_TOKEN != null) {
|
maven {
|
||||||
modrinth {
|
name 'midnightcontrolsMaven'
|
||||||
token = MODRINTH_TOKEN
|
url uri(midnightcontrolsMaven)
|
||||||
id = rootProject.modrinth_id
|
credentials {
|
||||||
version = "$project.version"
|
username = project.findProperty('gpr.user') ?: System.getenv('MAVEN_USERNAME')
|
||||||
gameVersions.addAll project.minecraft_version
|
password = project.findProperty('gpr.key') ?: System.getenv('MAVEN_PASSWORD')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,33 +3,27 @@ org.gradle.jvmargs=-Xmx1G
|
|||||||
|
|
||||||
# Fabric Properties
|
# Fabric Properties
|
||||||
# check these on https://fabricmc.net/use
|
# check these on https://fabricmc.net/use
|
||||||
minecraft_version=1.21
|
minecraft_version=1.18.2
|
||||||
yarn_mappings=1.21+build.1
|
yarn_mappings=1.18.2+build.3
|
||||||
loader_version=0.15.11
|
loader_version=0.14.8
|
||||||
|
|
||||||
# Mod Properties
|
# Mod Properties
|
||||||
mod_version = 1.9.7
|
mod_version = 1.5.0
|
||||||
maven_group = eu.midnightdust
|
maven_group = eu.midnightdust
|
||||||
archives_base_name = midnightcontrols
|
archives_base_name = midnightcontrols
|
||||||
release_type=beta
|
modrinth_id=bXX9h73M
|
||||||
modrinth_id = bXX9h73M
|
|
||||||
curseforge_id = 621768
|
|
||||||
|
|
||||||
# Dependencies
|
# Dependencies
|
||||||
# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api
|
# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api
|
||||||
fabric_version=0.100.1+1.21
|
fabric_version=0.57.0+1.18.2
|
||||||
sodium_version=mc1.19.2-0.4.4
|
sodium_version=mc1.18.2-0.4.1
|
||||||
obsidianui_version=0.2.6+mc1.21-fabric
|
spruceui_version=3.3.2+1.17
|
||||||
midnightlib_version=1.5.7-fabric
|
midnightlib_version=0.4.4
|
||||||
modmenu_version=10.0.0-beta.1
|
modmenu_version=2.0.2
|
||||||
emotecraft_version=2.1.3-SNAPSHOT-build.29-MC1.19-fabric
|
emotecraft_version=2.1-MC1.18.1-fabric
|
||||||
bendylib_version=2.0.+
|
bendylib_version=2.0.+
|
||||||
emi_version=1.1.1+1.20.4+fabric
|
libgui_version=5.4.2+1.18.2
|
||||||
libgui_version=6.0.0+1.19
|
emi_version=0.2.0+1.18.2
|
||||||
inventorytabs_version=inventorytabs-0.9.beta-1.19.x
|
|
||||||
clothconfig_version=7.0.72
|
|
||||||
yacl_version=2.2.0
|
|
||||||
bedrockify_version=1.9+mc1.20
|
|
||||||
|
|
||||||
# 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.
|
# 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.
|
||||||
# ok_zoomer_version=5.0.0-beta.3+1.17.1
|
# ok_zoomer_version=5.0.0-beta.3+1.17.1
|
||||||
|
|||||||
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
4
gradle/wrapper/gradle-wrapper.properties
vendored
4
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,7 +1,5 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-bin.zip
|
||||||
networkTimeout=10000
|
|
||||||
validateDistributionUrl=true
|
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
|||||||
41
gradlew
vendored
41
gradlew
vendored
@@ -55,7 +55,7 @@
|
|||||||
# Darwin, MinGW, and NonStop.
|
# Darwin, MinGW, and NonStop.
|
||||||
#
|
#
|
||||||
# (3) This script is generated from the Groovy template
|
# (3) This script is generated from the Groovy template
|
||||||
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||||
# within the Gradle project.
|
# within the Gradle project.
|
||||||
#
|
#
|
||||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||||
@@ -80,11 +80,13 @@ do
|
|||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
# This is normally unused
|
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||||
# shellcheck disable=SC2034
|
|
||||||
|
APP_NAME="Gradle"
|
||||||
APP_BASE_NAME=${0##*/}
|
APP_BASE_NAME=${0##*/}
|
||||||
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
|
|
||||||
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
|
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||||
|
|
||||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||||
MAX_FD=maximum
|
MAX_FD=maximum
|
||||||
@@ -131,29 +133,22 @@ location of your Java installation."
|
|||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
JAVACMD=java
|
JAVACMD=java
|
||||||
if ! command -v java >/dev/null 2>&1
|
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
then
|
|
||||||
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
|
||||||
|
|
||||||
Please set the JAVA_HOME variable in your environment to match the
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
location of your Java installation."
|
location of your Java installation."
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Increase the maximum file descriptors if we can.
|
# Increase the maximum file descriptors if we can.
|
||||||
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||||
case $MAX_FD in #(
|
case $MAX_FD in #(
|
||||||
max*)
|
max*)
|
||||||
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
|
||||||
# shellcheck disable=SC2039,SC3045
|
|
||||||
MAX_FD=$( ulimit -H -n ) ||
|
MAX_FD=$( ulimit -H -n ) ||
|
||||||
warn "Could not query maximum file descriptor limit"
|
warn "Could not query maximum file descriptor limit"
|
||||||
esac
|
esac
|
||||||
case $MAX_FD in #(
|
case $MAX_FD in #(
|
||||||
'' | soft) :;; #(
|
'' | soft) :;; #(
|
||||||
*)
|
*)
|
||||||
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
|
|
||||||
# shellcheck disable=SC2039,SC3045
|
|
||||||
ulimit -n "$MAX_FD" ||
|
ulimit -n "$MAX_FD" ||
|
||||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||||
esac
|
esac
|
||||||
@@ -198,15 +193,11 @@ if "$cygwin" || "$msys" ; then
|
|||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Collect all arguments for the java command;
|
||||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
# shell script including quotes and variable substitutions, so put them in
|
||||||
|
# double quotes to make sure that they get re-expanded; and
|
||||||
# Collect all arguments for the java command:
|
# * put everything else in single quotes, so that it's not re-expanded.
|
||||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
|
|
||||||
# and any embedded shellness will be escaped.
|
|
||||||
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
|
|
||||||
# treated as '${Hostname}' itself on the command line.
|
|
||||||
|
|
||||||
set -- \
|
set -- \
|
||||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||||
@@ -214,12 +205,6 @@ set -- \
|
|||||||
org.gradle.wrapper.GradleWrapperMain \
|
org.gradle.wrapper.GradleWrapperMain \
|
||||||
"$@"
|
"$@"
|
||||||
|
|
||||||
# Stop when "xargs" is not available.
|
|
||||||
if ! command -v xargs >/dev/null 2>&1
|
|
||||||
then
|
|
||||||
die "xargs is not available"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Use "xargs" to parse quoted args.
|
# Use "xargs" to parse quoted args.
|
||||||
#
|
#
|
||||||
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||||
|
|||||||
15
gradlew.bat
vendored
15
gradlew.bat
vendored
@@ -14,7 +14,7 @@
|
|||||||
@rem limitations under the License.
|
@rem limitations under the License.
|
||||||
@rem
|
@rem
|
||||||
|
|
||||||
@if "%DEBUG%"=="" @echo off
|
@if "%DEBUG%" == "" @echo off
|
||||||
@rem ##########################################################################
|
@rem ##########################################################################
|
||||||
@rem
|
@rem
|
||||||
@rem Gradle startup script for Windows
|
@rem Gradle startup script for Windows
|
||||||
@@ -25,8 +25,7 @@
|
|||||||
if "%OS%"=="Windows_NT" setlocal
|
if "%OS%"=="Windows_NT" setlocal
|
||||||
|
|
||||||
set DIRNAME=%~dp0
|
set DIRNAME=%~dp0
|
||||||
if "%DIRNAME%"=="" set DIRNAME=.
|
if "%DIRNAME%" == "" set DIRNAME=.
|
||||||
@rem This is normally unused
|
|
||||||
set APP_BASE_NAME=%~n0
|
set APP_BASE_NAME=%~n0
|
||||||
set APP_HOME=%DIRNAME%
|
set APP_HOME=%DIRNAME%
|
||||||
|
|
||||||
@@ -41,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
|
|||||||
|
|
||||||
set JAVA_EXE=java.exe
|
set JAVA_EXE=java.exe
|
||||||
%JAVA_EXE% -version >NUL 2>&1
|
%JAVA_EXE% -version >NUL 2>&1
|
||||||
if %ERRORLEVEL% equ 0 goto execute
|
if "%ERRORLEVEL%" == "0" goto execute
|
||||||
|
|
||||||
echo.
|
echo.
|
||||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
@@ -76,15 +75,13 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
|||||||
|
|
||||||
:end
|
:end
|
||||||
@rem End local scope for the variables with windows NT shell
|
@rem End local scope for the variables with windows NT shell
|
||||||
if %ERRORLEVEL% equ 0 goto mainEnd
|
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||||
|
|
||||||
:fail
|
:fail
|
||||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||||
rem the _cmd.exe /c_ return code!
|
rem the _cmd.exe /c_ return code!
|
||||||
set EXIT_CODE=%ERRORLEVEL%
|
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||||
if %EXIT_CODE% equ 0 set EXIT_CODE=1
|
exit /b 1
|
||||||
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
|
|
||||||
exit /b %EXIT_CODE%
|
|
||||||
|
|
||||||
:mainEnd
|
:mainEnd
|
||||||
if "%OS%"=="Windows_NT" endlocal
|
if "%OS%"=="Windows_NT" endlocal
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ pluginManagement {
|
|||||||
name 'Fabric'
|
name 'Fabric'
|
||||||
url 'https://maven.fabricmc.net/'
|
url 'https://maven.fabricmc.net/'
|
||||||
}
|
}
|
||||||
maven { url "https://maven.architectury.dev/" }
|
|
||||||
gradlePluginPortal()
|
gradlePluginPortal()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,8 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols;
|
package eu.midnightdust.midnightcontrols;
|
||||||
|
|
||||||
|
import dev.lambdaurora.spruceui.util.Nameable;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.thinkingstudio.obsidianui.util.Nameable;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|||||||
@@ -10,16 +10,19 @@
|
|||||||
package eu.midnightdust.midnightcontrols;
|
package eu.midnightdust.midnightcontrols;
|
||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.event.PlayerChangeControlsModeCallback;
|
import eu.midnightdust.midnightcontrols.event.PlayerChangeControlsModeCallback;
|
||||||
import eu.midnightdust.midnightcontrols.packet.ControlsModePacket;
|
import io.netty.buffer.Unpooled;
|
||||||
import eu.midnightdust.midnightcontrols.packet.FeaturePacket;
|
|
||||||
import eu.midnightdust.midnightcontrols.packet.HelloPacket;
|
|
||||||
import net.fabricmc.api.ModInitializer;
|
import net.fabricmc.api.ModInitializer;
|
||||||
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
|
|
||||||
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
|
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
|
||||||
import net.fabricmc.loader.api.FabricLoader;
|
import net.fabricmc.loader.api.FabricLoader;
|
||||||
import net.minecraft.network.packet.CustomPayload;
|
import net.fabricmc.loader.api.ModContainer;
|
||||||
|
import net.minecraft.network.PacketByteBuf;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents the MidnightControls mod.
|
* Represents the MidnightControls mod.
|
||||||
@@ -30,9 +33,9 @@ import org.apache.logging.log4j.Logger;
|
|||||||
*/
|
*/
|
||||||
public class MidnightControls implements ModInitializer {
|
public class MidnightControls implements ModInitializer {
|
||||||
private static MidnightControls INSTANCE;
|
private static MidnightControls INSTANCE;
|
||||||
public static final CustomPayload.Id<CustomPayload> CONTROLS_MODE_CHANNEL = new CustomPayload.Id<>(MidnightControlsConstants.CONTROLS_MODE_CHANNEL);
|
public static final Identifier CONTROLS_MODE_CHANNEL = new Identifier(MidnightControlsConstants.CONTROLS_MODE_CHANNEL.toString());
|
||||||
public static final CustomPayload.Id<CustomPayload> FEATURE_CHANNEL = new CustomPayload.Id<>(MidnightControlsConstants.FEATURE_CHANNEL);
|
public static final Identifier FEATURE_CHANNEL = new Identifier(MidnightControlsConstants.FEATURE_CHANNEL.toString());
|
||||||
public static final CustomPayload.Id<CustomPayload> HELLO_CHANNEL = new CustomPayload.Id<>(MidnightControlsConstants.HELLO_CHANNEL);
|
public static final Identifier HELLO_CHANNEL = new Identifier(MidnightControlsConstants.HELLO_CHANNEL.toString());
|
||||||
public static boolean isExtrasLoaded;
|
public static boolean isExtrasLoaded;
|
||||||
|
|
||||||
public final Logger logger = LogManager.getLogger("MidnightControls");
|
public final Logger logger = LogManager.getLogger("MidnightControls");
|
||||||
@@ -43,19 +46,19 @@ public class MidnightControls implements ModInitializer {
|
|||||||
isExtrasLoaded = FabricLoader.getInstance().isModLoaded("midnightcontrols-extra");
|
isExtrasLoaded = FabricLoader.getInstance().isModLoaded("midnightcontrols-extra");
|
||||||
this.log("Initializing MidnightControls...");
|
this.log("Initializing MidnightControls...");
|
||||||
|
|
||||||
PayloadTypeRegistry.playC2S().register(HelloPacket.PACKET_ID, HelloPacket.codec);
|
ServerPlayNetworking.registerGlobalReceiver(HELLO_CHANNEL, (server, player, handler, buf, responseSender) -> {
|
||||||
PayloadTypeRegistry.playC2S().register(ControlsModePacket.PACKET_ID, ControlsModePacket.codec);
|
String version = buf.readString(32);
|
||||||
PayloadTypeRegistry.playS2C().register(ControlsModePacket.PACKET_ID, ControlsModePacket.codec);
|
ControlsMode.byId(buf.readString(32))
|
||||||
PayloadTypeRegistry.playS2C().register(FeaturePacket.PACKET_ID, FeaturePacket.codec);
|
.ifPresent(controlsMode -> server
|
||||||
|
.execute(() -> PlayerChangeControlsModeCallback.EVENT.invoker().apply(player, controlsMode)));
|
||||||
ServerPlayNetworking.registerGlobalReceiver(HelloPacket.PACKET_ID, (payload, context) -> {
|
server.execute(() -> {
|
||||||
ControlsMode.byId(payload.controlsMode())
|
ServerPlayNetworking.send(player, FEATURE_CHANNEL, this.makeFeatureBuffer(MidnightControlsFeature.HORIZONTAL_REACHAROUND));
|
||||||
.ifPresent(controlsMode -> PlayerChangeControlsModeCallback.EVENT.invoker().apply(context.player(), controlsMode));
|
});
|
||||||
context.responseSender().sendPacket(new FeaturePacket(MidnightControlsFeature.HORIZONTAL_REACHAROUND));
|
|
||||||
});
|
});
|
||||||
ServerPlayNetworking.registerGlobalReceiver(ControlsModePacket.PACKET_ID,
|
ServerPlayNetworking.registerGlobalReceiver(CONTROLS_MODE_CHANNEL,
|
||||||
(payload, context) -> ControlsMode.byId(payload.controlsMode())
|
(server, player, handler, buf, responseSender) -> ControlsMode.byId(buf.readString(32))
|
||||||
.ifPresent(controlsMode -> PlayerChangeControlsModeCallback.EVENT.invoker().apply(context.player(), controlsMode)));
|
.ifPresent(controlsMode -> server
|
||||||
|
.execute(() -> PlayerChangeControlsModeCallback.EVENT.invoker().apply(player, controlsMode))));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -76,6 +79,44 @@ public class MidnightControls implements ModInitializer {
|
|||||||
this.logger.info("[MidnightControls] " + warning);
|
this.logger.info("[MidnightControls] " + warning);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a packet byte buffer made for the midnightcontrols:controls_mode plugin message.
|
||||||
|
*
|
||||||
|
* @param controlsMode the controls mode to send
|
||||||
|
* @return the packet byte buffer
|
||||||
|
*/
|
||||||
|
public PacketByteBuf makeControlsModeBuffer(@NotNull ControlsMode controlsMode) {
|
||||||
|
Objects.requireNonNull(controlsMode, "Controls mode cannot be null.");
|
||||||
|
return new PacketByteBuf(Unpooled.buffer()).writeString(controlsMode.getName(), 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a packet byte buffer made for the midnightcontrols:feature plugin message.
|
||||||
|
*
|
||||||
|
* @param features the features data to send
|
||||||
|
* @return the packet byte buffer
|
||||||
|
*/
|
||||||
|
public PacketByteBuf makeFeatureBuffer(MidnightControlsFeature... features) {
|
||||||
|
if (features.length == 0)
|
||||||
|
throw new IllegalArgumentException("At least one feature must be provided.");
|
||||||
|
var buffer = new PacketByteBuf(Unpooled.buffer());
|
||||||
|
buffer.writeVarInt(features.length);
|
||||||
|
for (var feature : features) {
|
||||||
|
buffer.writeString(feature.getName(), 64);
|
||||||
|
buffer.writeBoolean(feature.isAllowed());
|
||||||
|
}
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PacketByteBuf makeHello(@NotNull ControlsMode controlsMode) {
|
||||||
|
var version = "";
|
||||||
|
Optional<ModContainer> container;
|
||||||
|
if ((container = FabricLoader.getInstance().getModContainer(MidnightControlsConstants.NAMESPACE)).isPresent()) {
|
||||||
|
version = container.get().getMetadata().getVersion().getFriendlyString();
|
||||||
|
}
|
||||||
|
return new PacketByteBuf(Unpooled.buffer()).writeString(version, 32).writeString(controlsMode.getName(), 32);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the MidnightControls instance.
|
* Gets the MidnightControls instance.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ import net.minecraft.util.Identifier;
|
|||||||
*/
|
*/
|
||||||
public class MidnightControlsConstants {
|
public class MidnightControlsConstants {
|
||||||
public static final String NAMESPACE = "midnightcontrols";
|
public static final String NAMESPACE = "midnightcontrols";
|
||||||
public static final Identifier CONTROLS_MODE_CHANNEL = Identifier.of(NAMESPACE, "controls_mode");
|
public static final Identifier CONTROLS_MODE_CHANNEL = new Identifier(NAMESPACE, "controls_mode");
|
||||||
public static final Identifier FEATURE_CHANNEL = Identifier.of(NAMESPACE, "feature");
|
public static final Identifier FEATURE_CHANNEL = new Identifier(NAMESPACE, "feature");
|
||||||
public static final Identifier HELLO_CHANNEL = Identifier.of(NAMESPACE, "hello");
|
public static final Identifier HELLO_CHANNEL = new Identifier("lambdacontrols", "hello");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols;
|
package eu.midnightdust.midnightcontrols;
|
||||||
|
|
||||||
import org.thinkingstudio.obsidianui.util.Nameable;
|
import dev.lambdaurora.spruceui.util.Nameable;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
* see the LICENSE file.
|
* see the LICENSE file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.enums;
|
package eu.midnightdust.midnightcontrols.client;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a button state.
|
* Represents a button state.
|
||||||
@@ -7,9 +7,10 @@
|
|||||||
* see the LICENSE file.
|
* see the LICENSE file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.enums;
|
package eu.midnightdust.midnightcontrols.client;
|
||||||
|
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableText;
|
||||||
import org.aperlambda.lambdacommon.utils.Nameable;
|
import org.aperlambda.lambdacommon.utils.Nameable;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
@@ -32,15 +33,14 @@ public enum ControllerType implements Nameable {
|
|||||||
XBOX(5),
|
XBOX(5),
|
||||||
STEAM_DECK(6),
|
STEAM_DECK(6),
|
||||||
STEAM_CONTROLLER(7),
|
STEAM_CONTROLLER(7),
|
||||||
OUYA(8),
|
OUYA(8);
|
||||||
NUMBERED(9);
|
|
||||||
|
|
||||||
private final int id;
|
private final int id;
|
||||||
private final Text text;
|
private final Text text;
|
||||||
|
|
||||||
ControllerType(int id) {
|
ControllerType(int id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.text = Text.translatable("midnightcontrols.controller_type." + this.getName());
|
this.text = new TranslatableText("midnightcontrols.controller_type." + this.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
ControllerType(int id, @NotNull Text text) {
|
ControllerType(int id, @NotNull Text text) {
|
||||||
@@ -7,9 +7,10 @@
|
|||||||
* see the LICENSE file.
|
* see the LICENSE file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.enums;
|
package eu.midnightdust.midnightcontrols.client;
|
||||||
|
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableText;
|
||||||
import org.aperlambda.lambdacommon.utils.Nameable;
|
import org.aperlambda.lambdacommon.utils.Nameable;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
@@ -30,7 +31,7 @@ public enum HudSide implements Nameable {
|
|||||||
private final Text text;
|
private final Text text;
|
||||||
|
|
||||||
HudSide() {
|
HudSide() {
|
||||||
this.text = Text.translatable(this.getTranslationKey());
|
this.text = new TranslatableText(this.getTranslationKey());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client;
|
package eu.midnightdust.midnightcontrols.client;
|
||||||
|
|
||||||
import eu.midnightdust.lib.util.PlatformFunctions;
|
import dev.lambdaurora.spruceui.event.OpenScreenCallback;
|
||||||
import eu.midnightdust.midnightcontrols.ControlsMode;
|
import eu.midnightdust.midnightcontrols.ControlsMode;
|
||||||
import eu.midnightdust.midnightcontrols.MidnightControls;
|
import eu.midnightdust.midnightcontrols.MidnightControls;
|
||||||
import eu.midnightdust.midnightcontrols.MidnightControlsConstants;
|
import eu.midnightdust.midnightcontrols.MidnightControlsConstants;
|
||||||
@@ -20,18 +20,11 @@ import eu.midnightdust.midnightcontrols.client.controller.ButtonCategory;
|
|||||||
import eu.midnightdust.midnightcontrols.client.controller.Controller;
|
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.TouchscreenOverlay;
|
import eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay;
|
||||||
import eu.midnightdust.midnightcontrols.client.mixin.KeyBindingIDAccessor;
|
import eu.midnightdust.midnightcontrols.client.mixin.KeyBindingRegistryImplAccessor;
|
||||||
import eu.midnightdust.midnightcontrols.client.ring.ButtonBindingRingAction;
|
import eu.midnightdust.midnightcontrols.client.ring.KeyBindingRingAction;
|
||||||
import eu.midnightdust.midnightcontrols.client.ring.MidnightRing;
|
import eu.midnightdust.midnightcontrols.client.ring.MidnightRing;
|
||||||
import org.thinkingstudio.obsidianui.fabric.event.OpenScreenCallback;
|
import dev.lambdaurora.spruceui.hud.HudManager;
|
||||||
import org.thinkingstudio.obsidianui.hud.HudManager;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.touch.TouchInput;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.util.RainbowColor;
|
|
||||||
import eu.midnightdust.midnightcontrols.packet.ControlsModePacket;
|
|
||||||
import eu.midnightdust.midnightcontrols.packet.FeaturePacket;
|
|
||||||
import eu.midnightdust.midnightcontrols.packet.HelloPacket;
|
|
||||||
import net.fabricmc.api.ClientModInitializer;
|
import net.fabricmc.api.ClientModInitializer;
|
||||||
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
|
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.keybinding.v1.KeyBindingHelper;
|
||||||
@@ -40,19 +33,19 @@ import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
|
|||||||
import net.fabricmc.fabric.api.resource.ResourceManagerHelper;
|
import net.fabricmc.fabric.api.resource.ResourceManagerHelper;
|
||||||
import net.fabricmc.fabric.api.resource.ResourcePackActivationType;
|
import net.fabricmc.fabric.api.resource.ResourcePackActivationType;
|
||||||
import net.fabricmc.loader.api.FabricLoader;
|
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.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;
|
||||||
|
import net.minecraft.text.LiteralText;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableText;
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents the midnightcontrols client mod.
|
* Represents the midnightcontrols client mod.
|
||||||
@@ -64,20 +57,20 @@ import java.util.*;
|
|||||||
public class MidnightControlsClient extends MidnightControls implements ClientModInitializer {
|
public class MidnightControlsClient extends MidnightControls implements ClientModInitializer {
|
||||||
public static boolean lateInitDone = false;
|
public static boolean lateInitDone = false;
|
||||||
private static MidnightControlsClient INSTANCE;
|
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(new Identifier(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(new Identifier(MidnightControlsConstants.NAMESPACE, "look_right"),
|
||||||
InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_6, "key.categories.movement");
|
InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_6, "key.categories.movement");
|
||||||
public static final KeyBinding BINDING_LOOK_DOWN = InputManager.makeKeyBinding(Identifier.of(MidnightControlsConstants.NAMESPACE, "look_down"),
|
public static final KeyBinding BINDING_LOOK_DOWN = InputManager.makeKeyBinding(new Identifier(MidnightControlsConstants.NAMESPACE, "look_down"),
|
||||||
InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_2, "key.categories.movement");
|
InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_2, "key.categories.movement");
|
||||||
public static final KeyBinding BINDING_LOOK_LEFT = InputManager.makeKeyBinding(Identifier.of(MidnightControlsConstants.NAMESPACE, "look_left"),
|
public static final KeyBinding BINDING_LOOK_LEFT = InputManager.makeKeyBinding(new Identifier(MidnightControlsConstants.NAMESPACE, "look_left"),
|
||||||
InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_4, "key.categories.movement");
|
InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_4, "key.categories.movement");
|
||||||
public static final KeyBinding BINDING_RING = InputManager.makeKeyBinding(Identifier.of(MidnightControlsConstants.NAMESPACE, "ring"),
|
public static final KeyBinding BINDING_RING = InputManager.makeKeyBinding(new Identifier(MidnightControlsConstants.NAMESPACE, "ring"),
|
||||||
InputUtil.Type.KEYSYM, InputUtil.UNKNOWN_KEY.getCode(), "key.categories.misc");
|
InputUtil.Type.KEYSYM, InputUtil.UNKNOWN_KEY.getCode(), "key.categories.misc");
|
||||||
public static final Identifier CONTROLLER_BUTTONS = Identifier.of(MidnightControlsConstants.NAMESPACE, "textures/gui/controller_buttons.png");
|
public static final Identifier CONTROLLER_BUTTONS = new Identifier(MidnightControlsConstants.NAMESPACE, "textures/gui/controller_buttons.png");
|
||||||
public static final Identifier CONTROLLER_EXPANDED = Identifier.of(MidnightControlsConstants.NAMESPACE, "textures/gui/controller_expanded.png");
|
public static final Identifier CONTROLLER_EXPANDED = new Identifier(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 = new Identifier(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 = new Identifier(MidnightControlsConstants.NAMESPACE, "textures/gui/cursor.png");
|
||||||
public final static File MAPPINGS_FILE = new File("config/gamecontrollercustommappings.txt");
|
public final static File MAPPINGS_FILE = new File("config/gamecontrollercustommappings.txt");
|
||||||
public final MidnightInput input = new MidnightInput();
|
public final MidnightInput input = new MidnightInput();
|
||||||
public final MidnightRing ring = new MidnightRing(this);
|
public final MidnightRing ring = new MidnightRing(this);
|
||||||
@@ -92,30 +85,31 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
|
|||||||
KeyBindingHelper.registerKeyBinding(BINDING_LOOK_RIGHT);
|
KeyBindingHelper.registerKeyBinding(BINDING_LOOK_RIGHT);
|
||||||
KeyBindingHelper.registerKeyBinding(BINDING_LOOK_DOWN);
|
KeyBindingHelper.registerKeyBinding(BINDING_LOOK_DOWN);
|
||||||
KeyBindingHelper.registerKeyBinding(BINDING_LOOK_LEFT);
|
KeyBindingHelper.registerKeyBinding(BINDING_LOOK_LEFT);
|
||||||
KeyBindingHelper.registerKeyBinding(BINDING_RING);
|
//KeyBindingHelper.registerKeyBinding(BINDING_RING);
|
||||||
|
|
||||||
this.ring.registerAction("buttonbinding", ButtonBindingRingAction.FACTORY);
|
this.ring.registerAction("keybinding", KeyBindingRingAction.FACTORY);
|
||||||
|
this.ring.load();
|
||||||
|
|
||||||
ClientPlayNetworking.registerGlobalReceiver(CONTROLS_MODE_CHANNEL, (payload, context) ->
|
ClientPlayNetworking.registerGlobalReceiver(CONTROLS_MODE_CHANNEL, (client, handler, buf, responseSender) ->
|
||||||
context.responseSender().sendPacket(new ControlsModePacket(MidnightControlsConfig.controlsMode.getName())));
|
responseSender.sendPacket(CONTROLS_MODE_CHANNEL, this.makeControlsModeBuffer(MidnightControlsConfig.controlsMode)));
|
||||||
ClientPlayNetworking.registerGlobalReceiver(FeaturePacket.PACKET_ID, ((payload, context) -> {}));
|
ClientPlayNetworking.registerGlobalReceiver(FEATURE_CHANNEL, (client, handler, buf, responseSender) -> {
|
||||||
|
int features = buf.readVarInt();
|
||||||
ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> {
|
for (int i = 0; i < features; i++) {
|
||||||
var version = "";
|
var name = buf.readString(64);
|
||||||
Optional<ModContainer> container;
|
boolean allowed = buf.readBoolean();
|
||||||
if ((container = FabricLoader.getInstance().getModContainer(MidnightControlsConstants.NAMESPACE)).isPresent()) {
|
MidnightControlsFeature.fromName(name).ifPresent(feature -> client.execute(() -> feature.setAllowed(allowed)));
|
||||||
version = container.get().getMetadata().getVersion().getFriendlyString();
|
|
||||||
}
|
}
|
||||||
var controlsMode = MidnightControlsConfig.controlsMode.getName();
|
});
|
||||||
sender.sendPacket(new HelloPacket(version, controlsMode));
|
ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> {
|
||||||
sender.sendPacket(new ControlsModePacket(controlsMode));
|
sender.sendPacket(HELLO_CHANNEL, this.makeHello(MidnightControlsConfig.controlsMode));
|
||||||
|
sender.sendPacket(CONTROLS_MODE_CHANNEL, this.makeControlsModeBuffer(MidnightControlsConfig.controlsMode));
|
||||||
});
|
});
|
||||||
ClientPlayConnectionEvents.DISCONNECT.register(this::onLeave);
|
ClientPlayConnectionEvents.DISCONNECT.register(this::onLeave);
|
||||||
|
|
||||||
ClientTickEvents.START_CLIENT_TICK.register(this.reacharound::tick);
|
ClientTickEvents.START_CLIENT_TICK.register(this.reacharound::tick);
|
||||||
ClientTickEvents.START_CLIENT_TICK.register(this::onTick);
|
ClientTickEvents.START_CLIENT_TICK.register(this::onTick);
|
||||||
|
|
||||||
OpenScreenCallback.POST.register((client, screen) -> {
|
OpenScreenCallback.EVENT.register((client, screen) -> {
|
||||||
if (screen == null && MidnightControlsConfig.controlsMode == ControlsMode.TOUCHSCREEN) {
|
if (screen == null && MidnightControlsConfig.controlsMode == ControlsMode.TOUCHSCREEN) {
|
||||||
screen = new TouchscreenOverlay(this);
|
screen = new TouchscreenOverlay(this);
|
||||||
screen.init(client, client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight());
|
screen.init(client, client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight());
|
||||||
@@ -125,20 +119,11 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
|
|||||||
this.input.onScreenOpen(client, client.getWindow().getWidth(), client.getWindow().getHeight());
|
this.input.onScreenOpen(client, client.getWindow().getWidth(), client.getWindow().getHeight());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
final MinecraftClient client = MinecraftClient.getInstance();
|
|
||||||
int delay = 0; // delay for 0 sec.
|
|
||||||
int period = 1; // repeat every 0.001 sec. (100 times a second)
|
|
||||||
Timer timer = new Timer();
|
|
||||||
timer.scheduleAtFixedRate(new TimerTask() {
|
|
||||||
public void run() {
|
|
||||||
input.updateCamera(client);
|
|
||||||
}
|
|
||||||
}, delay, period);
|
|
||||||
|
|
||||||
HudManager.register(this.hud = new MidnightControlsHud(this));
|
HudManager.register(this.hud = new MidnightControlsHud(this));
|
||||||
FabricLoader.getInstance().getModContainer("midnightcontrols").ifPresent(modContainer -> {
|
FabricLoader.getInstance().getModContainer("midnightcontrols").ifPresent(modContainer -> {
|
||||||
ResourceManagerHelper.registerBuiltinResourcePack(Identifier.of("midnightcontrols","bedrock"), modContainer, ResourcePackActivationType.NORMAL);
|
ResourceManagerHelper.registerBuiltinResourcePack(new Identifier("midnightcontrols","bedrock"), modContainer, ResourcePackActivationType.NORMAL);
|
||||||
ResourceManagerHelper.registerBuiltinResourcePack(Identifier.of("midnightcontrols","legacy"), modContainer, ResourcePackActivationType.NORMAL);
|
ResourceManagerHelper.registerBuiltinResourcePack(new Identifier("midnightcontrols","legacy"), modContainer, ResourcePackActivationType.NORMAL);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,30 +133,20 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
|
|||||||
public void onMcInit(@NotNull MinecraftClient client) {
|
public void onMcInit(@NotNull MinecraftClient client) {
|
||||||
ButtonBinding.init(client.options);
|
ButtonBinding.init(client.options);
|
||||||
MidnightControlsConfig.load();
|
MidnightControlsConfig.load();
|
||||||
if (MidnightControlsConfig.configVersion < 2) {
|
|
||||||
MidnightControlsConfig.mouseScreens.remove("me.jellysquid.mods.sodium.client.gui");
|
|
||||||
MidnightControlsConfig.mouseScreens.remove("net.coderbot.iris.gui");
|
|
||||||
MidnightControlsConfig.mouseScreens.remove("net.minecraft.class_5375");
|
|
||||||
MidnightControlsConfig.mouseScreens.remove("net.minecraft.client.gui.screen.pack.PackScreen");
|
|
||||||
MidnightControlsConfig.configVersion = 2;
|
|
||||||
MidnightControlsConfig.write("midnightcontrols");
|
|
||||||
}
|
|
||||||
this.hud.setVisible(MidnightControlsConfig.hudEnable);
|
this.hud.setVisible(MidnightControlsConfig.hudEnable);
|
||||||
Controller.updateMappings();
|
Controller.updateMappings();
|
||||||
try {
|
GLFW.glfwSetJoystickCallback((jid, event) -> {
|
||||||
GLFW.glfwSetJoystickCallback((jid, event) -> {
|
if (event == GLFW.GLFW_CONNECTED) {
|
||||||
if (event == GLFW.GLFW_CONNECTED) {
|
var controller = Controller.byId(jid);
|
||||||
var controller = Controller.byId(jid);
|
client.getToastManager().add(new SystemToast(SystemToast.Type.TUTORIAL_HINT, new TranslatableText("midnightcontrols.controller.connected", jid),
|
||||||
client.getToastManager().add(new SystemToast(SystemToast.Type.PERIODIC_NOTIFICATION, Text.translatable("midnightcontrols.controller.connected", jid),
|
new LiteralText(controller.getName())));
|
||||||
Text.literal(controller.getName())));
|
} else if (event == GLFW.GLFW_DISCONNECTED) {
|
||||||
} else if (event == GLFW.GLFW_DISCONNECTED) {
|
client.getToastManager().add(new SystemToast(SystemToast.Type.TUTORIAL_HINT, new TranslatableText("midnightcontrols.controller.disconnected", jid),
|
||||||
client.getToastManager().add(new SystemToast(SystemToast.Type.PERIODIC_NOTIFICATION, Text.translatable("midnightcontrols.controller.disconnected", jid),
|
null));
|
||||||
null));
|
}
|
||||||
}
|
|
||||||
|
|
||||||
this.switchControlsMode();
|
this.switchControlsMode();
|
||||||
});
|
});
|
||||||
} catch (Exception e) {e.fillInStackTrace();}
|
|
||||||
|
|
||||||
MidnightControlsCompat.init(this);
|
MidnightControlsCompat.init(this);
|
||||||
}
|
}
|
||||||
@@ -181,27 +156,23 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
|
|||||||
*/
|
*/
|
||||||
public void initKeybindings() {
|
public void initKeybindings() {
|
||||||
if (lateInitDone) return;
|
if (lateInitDone) return;
|
||||||
if (KeyBindingIDAccessor.getKEYS_BY_ID() == null || KeyBindingIDAccessor.getKEYS_BY_ID().isEmpty()) return;
|
if (KeyBindingRegistryImplAccessor.getModdedKeyBindings() == null || KeyBindingRegistryImplAccessor.getModdedKeyBindings().isEmpty()) return;
|
||||||
if (PlatformFunctions.isModLoaded("voxelmap") && !KeyBindingIDAccessor.getKEYS_BY_ID().containsKey("key.minimap.toggleingamewaypoints")) return;
|
for (int i = 0; i < KeyBindingRegistryImplAccessor.getModdedKeyBindings().size(); ++i) {
|
||||||
if (PlatformFunctions.isModLoaded("wynntils") && KeyBindingIDAccessor.getKEYS_BY_ID().entrySet().stream().noneMatch(b -> Objects.equals(b.getValue().getCategory(), "Wynntils"))) return;
|
KeyBinding keyBinding = KeyBindingRegistryImplAccessor.getModdedKeyBindings().get(i);
|
||||||
for (int i = 0; i < KeyBindingIDAccessor.getKEYS_BY_ID().size(); ++i) {
|
if (!keyBinding.getTranslationKey().contains("midnightcontrols") && !keyBinding.getTranslationKey().contains("ok_zoomer") && !keyBinding.getTranslationKey().contains("okzoomer")) {
|
||||||
KeyBinding keyBinding = KeyBindingIDAccessor.getKEYS_BY_ID().entrySet().stream().toList().get(i).getValue();
|
category = null;
|
||||||
if (MidnightControlsConfig.excludedKeybindings.stream().noneMatch(excluded -> keyBinding.getTranslationKey().startsWith(excluded))) {
|
InputManager.streamCategories().forEach(buttonCategory -> {
|
||||||
if (!keyBinding.getTranslationKey().contains("midnightcontrols") && !keyBinding.getTranslationKey().contains("ok_zoomer") && !keyBinding.getTranslationKey().contains("okzoomer")) {
|
if (buttonCategory.getIdentifier().equals(new org.aperlambda.lambdacommon.Identifier("minecraft", keyBinding.getCategory())))
|
||||||
category = null;
|
category = buttonCategory;
|
||||||
InputManager.streamCategories().forEach(buttonCategory -> {
|
});
|
||||||
if (buttonCategory.getIdentifier().equals(new org.aperlambda.lambdacommon.Identifier("minecraft", keyBinding.getCategory())))
|
if (category == null) {
|
||||||
category = buttonCategory;
|
category = new ButtonCategory(new org.aperlambda.lambdacommon.Identifier("minecraft", keyBinding.getCategory()));
|
||||||
});
|
InputManager.registerCategory(category);
|
||||||
if (category == null) {
|
}
|
||||||
category = new ButtonCategory(new org.aperlambda.lambdacommon.Identifier("minecraft", keyBinding.getCategory()));
|
ButtonBinding buttonBinding = new ButtonBinding.Builder(keyBinding.getTranslationKey()).category(category).linkKeybind(keyBinding).register();
|
||||||
InputManager.registerCategory(category);
|
if (MidnightControlsConfig.debug) {
|
||||||
}
|
logger.info(keyBinding.getTranslationKey());
|
||||||
ButtonBinding buttonBinding = new ButtonBinding.Builder(keyBinding.getTranslationKey()).category(category).linkKeybind(keyBinding).register();
|
logger.info(buttonBinding);
|
||||||
if (MidnightControlsConfig.debug) {
|
|
||||||
logger.info(keyBinding.getTranslationKey());
|
|
||||||
logger.info(buttonBinding);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -220,19 +191,19 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
|
|||||||
if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && (client.isWindowFocused() || MidnightControlsConfig.unfocusedInput))
|
if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && (client.isWindowFocused() || MidnightControlsConfig.unfocusedInput))
|
||||||
this.input.tickController(client);
|
this.input.tickController(client);
|
||||||
|
|
||||||
if (BINDING_RING.wasPressed()) {
|
// if (BINDING_RING.wasPressed()) {
|
||||||
ring.loadFromUnbound();
|
// client.setScreen(new RingScreen());
|
||||||
client.setScreen(new RingScreen());
|
// }
|
||||||
}
|
|
||||||
if (client.world != null && MidnightControlsConfig.enableHints && !MidnightControlsConfig.autoSwitchMode && MidnightControlsConfig.controlsMode == ControlsMode.DEFAULT && MidnightControlsConfig.getController().isGamepad()) {
|
if (client.world != null && MidnightControlsConfig.enableHints && !MidnightControlsConfig.autoSwitchMode && MidnightControlsConfig.controlsMode == ControlsMode.DEFAULT && MidnightControlsConfig.getController().isGamepad()) {
|
||||||
client.getToastManager().add(SystemToast.create(client, SystemToast.Type.PERIODIC_NOTIFICATION, Text.translatable("midnightcontrols.controller.tutorial.title"),
|
client.getToastManager().add(SystemToast.create(client, SystemToast.Type.PERIODIC_NOTIFICATION, new TranslatableText("midnightcontrols.controller.tutorial.title"),
|
||||||
Text.translatable("midnightcontrols.controller.tutorial.description", Text.translatable("options.title"), Text.translatable("controls.title"),
|
new TranslatableText("midnightcontrols.controller.tutorial.description", new TranslatableText("options.title"), new TranslatableText("controls.title"),
|
||||||
Text.translatable("midnightcontrols.menu.title.controller"))));
|
new TranslatableText("midnightcontrols.menu.title.controller"))));
|
||||||
MidnightControlsConfig.enableHints = false;
|
MidnightControlsConfig.enableHints = false;
|
||||||
MidnightControlsConfig.save();
|
MidnightControlsConfig.save();
|
||||||
}
|
}
|
||||||
RainbowColor.tick();
|
}
|
||||||
TouchInput.tick();
|
public void onRender(MinecraftClient client) {
|
||||||
|
this.input.onRender(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -257,7 +228,6 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
|
|||||||
|
|
||||||
MidnightControlsConfig.controlsMode = this.previousControlsMode;
|
MidnightControlsConfig.controlsMode = this.previousControlsMode;
|
||||||
}
|
}
|
||||||
ClientPlayNetworking.getSender().sendPacket(new ControlsModePacket(MidnightControlsConfig.controlsMode.getName()));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,23 +10,13 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client;
|
package eu.midnightdust.midnightcontrols.client;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
|
||||||
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.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;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.CameraMode;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.ControllerType;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.HudSide;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.VirtualMouseSkin;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.RingScreen;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.TouchMode;
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.gui.screen.ChatScreen;
|
|
||||||
import net.minecraft.client.gui.screen.advancement.AdvancementsScreen;
|
|
||||||
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;
|
||||||
@@ -40,90 +30,49 @@ import static org.lwjgl.glfw.GLFW.*;
|
|||||||
* Represents MidnightControls configuration.
|
* Represents MidnightControls configuration.
|
||||||
*/
|
*/
|
||||||
public class MidnightControlsConfig extends MidnightConfig {
|
public class MidnightControlsConfig extends MidnightConfig {
|
||||||
public static final String CONTROLLER = "controller";
|
|
||||||
public static final String TOUCH = "touch";
|
|
||||||
public static final String GAMEPLAY = "gameplay";
|
|
||||||
public static final String SCREENS = "screens";
|
|
||||||
public static final String VISUAL = "visual";
|
|
||||||
public static final String MISC = "misc";
|
|
||||||
public static boolean isEditing = false;
|
public static boolean isEditing = false;
|
||||||
@Hidden @Entry public static int configVersion = 2;
|
|
||||||
// General
|
// General
|
||||||
@Entry(category = CONTROLLER, name = "midnightcontrols.menu.controls_mode") public static ControlsMode controlsMode = ControlsMode.DEFAULT;
|
@Entry(name = "midnightcontrols.menu.controls_mode") public static ControlsMode controlsMode = ControlsMode.DEFAULT;
|
||||||
@Entry(category = CONTROLLER, name = "midnightcontrols.menu.auto_switch_mode") public static boolean autoSwitchMode = true;
|
@Entry(name = "midnightcontrols.menu.auto_switch_mode") public static boolean autoSwitchMode = true;
|
||||||
@Entry(category = MISC, name = "Debug") public static boolean debug = false;
|
@Entry(name = "Debug") public static boolean debug = false;
|
||||||
// HUD
|
// HUD
|
||||||
@Entry(category = VISUAL, name = "midnightcontrols.menu.hud_enable") public static boolean hudEnable = true;
|
@Entry(name = "midnightcontrols.menu.hud_enable") public static boolean hudEnable = true;
|
||||||
@Entry(category = VISUAL, name = "midnightcontrols.menu.hud_side") public static HudSide hudSide = HudSide.LEFT;
|
@Entry(name = "midnightcontrols.menu.hud_side") public static HudSide hudSide = HudSide.LEFT;
|
||||||
@Entry(category = SCREENS, name = "midnightcontrols.menu.move_chat") public static boolean moveChat = false;
|
|
||||||
// Gameplay
|
// Gameplay
|
||||||
@Entry(category = GAMEPLAY, name = "midnightcontrols.menu.analog_movement") public static boolean analogMovement = true;
|
@Entry(name = "midnightcontrols.menu.analog_movement") public static boolean analogMovement = true;
|
||||||
@Entry(category = GAMEPLAY, name = "midnightcontrols.menu.double_tap_to_sprint") public static boolean doubleTapToSprint = true;
|
@Entry(name = "midnightcontrols.menu.double_tap_to_sprint") public static boolean doubleTapToSprint = true;
|
||||||
@Entry(category = GAMEPLAY, name = "midnightcontrols.menu.controller_toggle_sneak") public static boolean controllerToggleSneak = MinecraftClient.getInstance().options.getSneakToggled().getValue();
|
@Entry(name = "midnightcontrols.menu.fast_block_placing") public static boolean fastBlockPlacing = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers.
|
||||||
@Entry(category = GAMEPLAY, name = "midnightcontrols.menu.controller_toggle_sprint") public static boolean controllerToggleSprint = MinecraftClient.getInstance().options.getSprintToggled().getValue();
|
@Entry(name = "midnightcontrols.menu.fly_drifting") public static boolean flyDrifting = true; // Enabled by default as disabling this behaviour can be considered cheating on multiplayer servers. It can also conflict with some other mods.
|
||||||
@Entry(category = GAMEPLAY, name = "midnightcontrols.menu.fast_block_placing") public static boolean fastBlockPlacing = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers.
|
@Entry(name = "midnightcontrols.menu.fly_drifting_vertical") public static boolean verticalFlyDrifting = true; // Enabled by default as disabling this behaviour can be considered cheating on multiplayer servers.
|
||||||
@Entry(category = GAMEPLAY, name = "midnightcontrols.menu.fly_drifting") public static boolean flyDrifting = true; // Enabled by default as disabling this behaviour can be considered cheating on multiplayer servers. It can also conflict with some other mods.
|
@Entry(name = "midnightcontrols.menu.reacharound.horizontal") public static boolean horizontalReacharound = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers.
|
||||||
@Entry(category = GAMEPLAY, name = "midnightcontrols.menu.fly_drifting_vertical") public static boolean verticalFlyDrifting = true; // Enabled by default as disabling this behaviour can be considered cheating on multiplayer servers.
|
@Entry(name = "midnightcontrols.menu.reacharound.vertical") public static boolean verticalReacharound = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers.
|
||||||
@Entry(category = GAMEPLAY, name = "midnightcontrols.menu.reacharound.horizontal") public static boolean horizontalReacharound = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers.
|
@Entry(name = "Reacharound Outline") public static boolean shouldRenderReacharoundOutline = true;
|
||||||
@Entry(category = GAMEPLAY, name = "midnightcontrols.menu.reacharound.vertical") public static boolean verticalReacharound = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers.
|
@Entry(name = "Reacharound Outline Color") public static int[] reacharoundOutlineColor = new int[]{255, 255, 255, 102};
|
||||||
@Entry(category = VISUAL, name = "Reacharound Outline") public static boolean shouldRenderReacharoundOutline = true;
|
@Entry(name = "midnightcontrols.menu.right_dead_zone") public static double rightDeadZone = 0.25;
|
||||||
@Entry(category = VISUAL, name = "Reacharound Outline Color", isColor = true) public static String reacharoundOutlineColorHex = "#ffffff";
|
@Entry(name = "midnightcontrols.menu.left_dead_zone") public static double leftDeadZone = 0.25;
|
||||||
@Entry(category = VISUAL, name = "Reacharound Outline Alpha", isSlider = true, min = 0, max = 255) public static int reacharoundOutlineColorAlpha = 102;
|
@Entry(name = "midnightcontrols.menu.invert_right_y_axis") public static boolean invertRightYAxis = false;
|
||||||
@Entry(category = CONTROLLER, name = "midnightcontrols.menu.right_dead_zone", isSlider = true, min = 0.05, max = 1) public static double rightDeadZone = 0.25;
|
@Entry(name = "midnightcontrols.menu.invert_right_x_axis") public static boolean invertRightXAxis = false;
|
||||||
@Entry(category = CONTROLLER, name = "midnightcontrols.menu.left_dead_zone", isSlider = true, min = 0.05, max = 1) public static double leftDeadZone = 0.25;
|
@Entry(name = "midnightcontrols.menu.rotation_speed") public static double rotationSpeed = 40.0; //used for x axis, name kept for compatability
|
||||||
@Entry(category = CONTROLLER, name = "midnightcontrols.menu.invert_right_y_axis") public static boolean invertRightYAxis = false;
|
@Entry(name = "midnightcontrols.menu.y_axis_rotation_speed") public static double yAxisRotationSpeed = rotationSpeed;
|
||||||
@Entry(category = CONTROLLER, name = "midnightcontrols.menu.invert_right_x_axis") public static boolean invertRightXAxis = false;
|
@Entry(name = "midnightcontrols.menu.mouse_speed") public static double mouseSpeed = 25.0;
|
||||||
@Entry(category = CONTROLLER, name = "midnightcontrols.menu.rotation_speed", isSlider = true, min = 0, max = 100, precision = 10) public static double rotationSpeed = 35.0; //used for x-axis, name kept for compatibility
|
@Entry(name = "midnightcontrols.menu.unfocused_input") public static boolean unfocusedInput = false;
|
||||||
@Entry(category = CONTROLLER, name = "midnightcontrols.menu.y_axis_rotation_speed", isSlider = true, min = 0, max = 100, precision = 10) public static double yAxisRotationSpeed = rotationSpeed;
|
@Entry(name = "midnightcontrols.menu.virtual_mouse") public static boolean virtualMouse = false;
|
||||||
@Entry(category = CONTROLLER, name = "midnightcontrols.menu.camera_mode") public static CameraMode cameraMode = CameraMode.FLAT;
|
@Entry(name = "midnightcontrols.menu.virtual_mouse.skin") public static VirtualMouseSkin virtualMouseSkin = VirtualMouseSkin.DEFAULT_LIGHT;
|
||||||
@Entry(category = SCREENS, name = "midnightcontrols.menu.mouse_speed", isSlider = true, min = 0, max = 150, precision = 10) public static double mouseSpeed = 25.0;
|
@Entry(name = "Controller ID") public static Object controllerID = 0;
|
||||||
@Entry(category = SCREENS, name = "midnightcontrols.menu.joystick_as_mouse") public static boolean joystickAsMouse = false;
|
@Entry(name = "2nd Controller ID") public static Object secondControllerID = -1;
|
||||||
@Entry(category = SCREENS, name = "midnightcontrols.menu.eye_tracker_as_mouse") public static boolean eyeTrackerAsMouse = false;
|
@Entry(name = "midnightcontrols.menu.controller_type") public static ControllerType controllerType = ControllerType.DEFAULT;
|
||||||
@Entry(category = SCREENS, name = "midnightcontrols.menu.eye_tracker_deadzone", isSlider = true, min = 0, max = 0.4) public static double eyeTrackerDeadzone = 0.05;
|
@Entry(name = "Mouse screens") public static List<String> mouseScreens = Lists.newArrayList("me.jellysquid.mods.sodium.client.gui",
|
||||||
@Entry(category = CONTROLLER, name = "midnightcontrols.menu.unfocused_input") public static boolean unfocusedInput = false;
|
"net.coderbot.iris.gui", "net.minecraft.client.gui.screen.advancement", "net.minecraft.client.gui.screen.pack.PackScreen", "net.minecraft.class_5375",
|
||||||
@Entry(category = SCREENS, name = "midnightcontrols.menu.virtual_mouse") public static boolean virtualMouse = false;
|
"net.minecraft.class_457", "net.minecraft.class_408", "me.flashyreese.mods.reeses_sodium_options.client.gui", "dev.emi.emi.screen",
|
||||||
@Entry(category = SCREENS, name = "midnightcontrols.menu.virtual_mouse.skin") public static VirtualMouseSkin virtualMouseSkin = VirtualMouseSkin.DEFAULT_LIGHT;
|
|
||||||
@Entry(category = SCREENS, name = "midnightcontrols.menu.hide_cursor") public static boolean hideNormalMouse = false;
|
|
||||||
@Entry(category = CONTROLLER, name = "Controller ID") @Hidden public static Object controllerID = 0;
|
|
||||||
@Entry(category = CONTROLLER, name = "2nd Controller ID") @Hidden public static Object secondControllerID = -1;
|
|
||||||
@Entry(category = VISUAL, name = "midnightcontrols.menu.controller_type") public static ControllerType controllerType = ControllerType.DEFAULT;
|
|
||||||
@Entry(category = SCREENS, name = "Mouse screens") public static List<String> mouseScreens = Lists.newArrayList("net.minecraft.client.gui.screen.advancement",
|
|
||||||
"net.minecraft.class_457", "net.minecraft.class_408", "net.minecraft.class_3872", "me.flashyreese.mods.reeses_sodium_options.client.gui", "dev.emi.emi.screen",
|
|
||||||
"hardcorequesting.client.interfaces.GuiQuestBook", "hardcorequesting.client.interfaces.GuiReward", "hardcorequesting.client.interfaces.EditTrackerScreen",
|
"hardcorequesting.client.interfaces.GuiQuestBook", "hardcorequesting.client.interfaces.GuiReward", "hardcorequesting.client.interfaces.EditTrackerScreen",
|
||||||
"me.shedaniel.clothconfig2.gui.ClothConfigScreen", "com.mamiyaotaru.voxelmap.gui.GuiWaypoints", "com.mamiyaotaru.voxelmap.gui.GuiPersistentMap");
|
"io.github.kosmx.emotes.arch.gui.screen.ingame.FastChosseScreen");
|
||||||
@Entry(category = SCREENS, name = "Arrow screens") public static List<String> arrowScreens = Lists.newArrayList(ChatScreen.class.getCanonicalName());
|
@Entry(name = "Keybindings") public static Map<String, String> BINDINGS = new HashMap<>();
|
||||||
@Entry(category = SCREENS, name = "WASD screens") public static List<String> wasdScreens = Lists.newArrayList("com.ultreon.devices.core.Laptop");
|
|
||||||
@Entry(category = TOUCH, name = "Screens with close button") public static List<String> closeButtonScreens = Lists.newArrayList(ChatScreen.class.getCanonicalName(), AdvancementsScreen.class.getCanonicalName(), RingScreen.class.getCanonicalName());
|
|
||||||
@Entry(category = TOUCH, name = "midnightcontrols.menu.touch_with_controller") public static boolean touchInControllerMode = false;
|
|
||||||
@Entry(category = TOUCH, name = "midnightcontrols.menu.touch_speed", isSlider = true, min = 0, max = 150, precision = 10) public static double touchSpeed = 50.0;
|
|
||||||
@Entry(category = TOUCH, name = "midnightcontrols.menu.invert_touch") public static boolean invertTouch = false;
|
|
||||||
@Entry(category = TOUCH, name = "midnightcontrols.menu.touch_mode") public static TouchMode touchMode = TouchMode.CROSSHAIR;
|
|
||||||
@Entry(category = TOUCH, name = "midnightcontrols.menu.touch_break_delay", isSlider = true, min = 50, max = 500) public static int touchBreakDelay = 120;
|
|
||||||
@Entry(category = TOUCH, name = "midnightcontrols.menu.touch_transparency", isSlider = true, min = 0, max = 100) public static int touchTransparency = 75;
|
|
||||||
@Entry(category = TOUCH, name = "Touch Outline Color", isColor = true) public static String touchOutlineColorHex = "#ffffff";
|
|
||||||
@Entry(category = TOUCH, name = "Touch Outline Alpha", isSlider = true, min = 0, max = 255) public static int touchOutlineColorAlpha = 150;
|
|
||||||
@Entry(category = TOUCH, name = "Left Touch button bindings") public static List<String> leftTouchBinds = Lists.newArrayList("debug_screen", "screenshot","toggle_perspective");
|
|
||||||
@Entry(category = TOUCH, name = "Right Touch button bindings") public static List<String> rightTouchBinds = Lists.newArrayList("screenshot","toggle_perspective", "use");
|
|
||||||
|
|
||||||
@Entry @Hidden public static Map<String, String> BINDING = new HashMap<>();
|
|
||||||
|
|
||||||
private static final Pattern BUTTON_BINDING_PATTERN = Pattern.compile("(-?\\d+)\\+?");
|
private static final Pattern BUTTON_BINDING_PATTERN = Pattern.compile("(-?\\d+)\\+?");
|
||||||
@Deprecated @Hidden @Entry public static double[] maxAnalogValues = new double[]{1, 1, 1, 1};
|
@Entry(name = "Max analog values") public static double[] maxAnalogValues = new double[]{1, 1, 1, 1};
|
||||||
@Entry(category = CONTROLLER, name = "Max analog value: Left X", isSlider = true, min = .25f, max = 1.f) public static double maxAnalogValueLeftX = maxAnalogValues[0];
|
@Entry(name = "Trigger button fix") public static boolean triggerFix = true;
|
||||||
@Entry(category = CONTROLLER, name = "Max analog value: Left Y", isSlider = true, min = .25f, max = 1.f) public static double maxAnalogValueLeftY = maxAnalogValues[1];
|
@Entry(name = "Enable Hints") public static boolean enableHints = true;
|
||||||
@Entry(category = CONTROLLER, name = "Max analog value: Right X", isSlider = true, min = .25f, max = 1.f) public static double maxAnalogValueRightX = maxAnalogValues[2];
|
@Entry(name = "Command Keybinds") public static List<String> commandKeybinds = Lists.newArrayList();
|
||||||
@Entry(category = CONTROLLER, name = "Max analog value: Right Y", isSlider = true, min = .25f, max = 1.f) public static double maxAnalogValueRightY = maxAnalogValues[3];
|
|
||||||
@Entry(category = CONTROLLER, name = "Trigger button fix") public static boolean triggerFix = true;
|
|
||||||
@Entry(category = MISC, name = "Excluded Keybindings") public static List<String> excludedKeybindings = Lists.newArrayList("key.forward", "key.left", "key.back", "key.right", "key.jump", "key.sneak", "key.sprint", "key.inventory",
|
|
||||||
"key.swapOffhand", "key.drop", "key.use", "key.attack", "key.chat", "key.playerlist", "key.screenshot", "key.togglePerspective", "key.smoothCamera", "key.fullscreen", "key.saveToolbarActivator", "key.loadToolbarActivator",
|
|
||||||
"key.pickItem", "key.hotbar.1", "key.hotbar.2", "key.hotbar.3", "key.hotbar.4", "key.hotbar.5", "key.hotbar.6", "key.hotbar.7", "key.hotbar.8", "key.hotbar.9");
|
|
||||||
@Entry(category = GAMEPLAY, name = "Enable Hints") public static boolean enableHints = true;
|
|
||||||
@Entry(category = SCREENS, name = "Enable Shortcut in Controls Options") public static boolean shortcutInControls = true;
|
|
||||||
@Entry(category = MISC, name = "Ring Bindings (WIP)") public static List<String> ringBindings = new ArrayList<>();
|
|
||||||
@Entry(category = MISC, name = "Ignored Unbound Keys") public static List<String> ignoredUnboundKeys = Lists.newArrayList("inventorytabs.key.next_tab");
|
|
||||||
@Entry @Hidden public static Map<String, Map<String, String>> controllerBindingProfiles = new HashMap<>();
|
|
||||||
private static Map<String, String> currentBindingProfile = new HashMap<>();
|
|
||||||
private static Controller prevController;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads the configuration
|
* Loads the configuration
|
||||||
@@ -133,6 +82,7 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
MidnightControlsClient.get().log("Configuration loaded.");
|
MidnightControlsClient.get().log("Configuration loaded.");
|
||||||
// Controller controls.
|
// Controller controls.
|
||||||
InputManager.loadButtonBindings();
|
InputManager.loadButtonBindings();
|
||||||
|
//this.mod.ring.load(this.config);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -143,15 +93,6 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
MidnightControlsClient.get().log("Configuration saved.");
|
MidnightControlsClient.get().log("Configuration saved.");
|
||||||
MidnightControlsFeature.refreshEnabled();
|
MidnightControlsFeature.refreshEnabled();
|
||||||
}
|
}
|
||||||
public static void updateBindingsForController(Controller controller) {
|
|
||||||
if (controller.isConnected() && controller.isGamepad() && controllerBindingProfiles.containsKey(controller.getGuid()))
|
|
||||||
currentBindingProfile = controllerBindingProfiles.get(controller.getGuid());
|
|
||||||
else currentBindingProfile = Maps.newHashMap(BINDING);
|
|
||||||
InputManager.loadButtonBindings();
|
|
||||||
}
|
|
||||||
public static Map<String, String> getBindingsForController() {
|
|
||||||
return currentBindingProfile;
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* Gets the used controller.
|
* Gets the used controller.
|
||||||
*
|
*
|
||||||
@@ -175,8 +116,6 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (controller.isConnected() && controller.isGamepad() && MidnightControlsConfig.autoSwitchMode && !isEditing) MidnightControlsConfig.controlsMode = ControlsMode.CONTROLLER;
|
if (controller.isConnected() && controller.isGamepad() && MidnightControlsConfig.autoSwitchMode && !isEditing) MidnightControlsConfig.controlsMode = ControlsMode.CONTROLLER;
|
||||||
if (prevController != controller) updateBindingsForController(controller);
|
|
||||||
prevController = controller;
|
|
||||||
return controller;
|
return controller;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -234,21 +173,14 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static double getAxisMaxValue(int axis) {
|
public static double getAxisMaxValue(int axis) {
|
||||||
return switch (axis) {
|
if (axis >= MidnightControlsConfig.maxAnalogValues.length)
|
||||||
case GLFW_GAMEPAD_AXIS_LEFT_X -> MidnightControlsConfig.maxAnalogValueLeftX;
|
return 1;
|
||||||
case GLFW_GAMEPAD_AXIS_LEFT_Y -> MidnightControlsConfig.maxAnalogValueLeftY;
|
return MidnightControlsConfig.maxAnalogValues[axis];
|
||||||
case GLFW_GAMEPAD_AXIS_RIGHT_X -> MidnightControlsConfig.maxAnalogValueRightX;
|
|
||||||
default -> MidnightControlsConfig.maxAnalogValueRightY;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setAxisMaxValue(int axis, double value) {
|
public static void setAxisMaxValue(int axis, double value) {
|
||||||
switch (axis) {
|
if (axis < MidnightControlsConfig.maxAnalogValues.length)
|
||||||
case GLFW_GAMEPAD_AXIS_LEFT_X -> MidnightControlsConfig.maxAnalogValueLeftX = value;
|
MidnightControlsConfig.maxAnalogValues[axis] = value;
|
||||||
case GLFW_GAMEPAD_AXIS_LEFT_Y -> MidnightControlsConfig.maxAnalogValueLeftY = value;
|
|
||||||
case GLFW_GAMEPAD_AXIS_RIGHT_X -> MidnightControlsConfig.maxAnalogValueRightX = value;
|
|
||||||
default -> MidnightControlsConfig.maxAnalogValueRightY = value;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -258,7 +190,7 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
*/
|
*/
|
||||||
public static void loadButtonBinding(@NotNull ButtonBinding button) {
|
public static void loadButtonBinding(@NotNull ButtonBinding button) {
|
||||||
button.setButton(button.getDefaultButton());
|
button.setButton(button.getDefaultButton());
|
||||||
var code = getBindingsForController().getOrDefault("controller.controls." + button.getName(), button.getButtonCode());
|
var code = MidnightControlsConfig.BINDINGS.getOrDefault("controller.controls." + button.getName(), button.getButtonCode());
|
||||||
|
|
||||||
var matcher = BUTTON_BINDING_PATTERN.matcher(code);
|
var matcher = BUTTON_BINDING_PATTERN.matcher(code);
|
||||||
|
|
||||||
@@ -282,14 +214,14 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
button.setButton(buttons);
|
button.setButton(buttons);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
MidnightControlsClient.get().warn("Malformed config value \"" + code + "\" for binding \"" + button.getName() + "\".");
|
MidnightControlsClient.get().warn("Malformed config value \"" + code + "\" for binding \"" + button.getName() + "\".");
|
||||||
setButtonBinding(button, button.getButton());
|
MidnightControlsConfig.BINDINGS.put("controller.controls." + button.getName(), button.getButtonCode());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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() + "\".");
|
MidnightControlsClient.get().warn("Malformed config value \"" + input + "\" for binding \"" + binding.getName() + "\".");
|
||||||
setButtonBinding(binding, binding.getButton());
|
MidnightControlsConfig.BINDINGS.put("controller.controls." + binding.getName(), binding.getButtonCode());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -303,9 +235,7 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
*/
|
*/
|
||||||
public static void setButtonBinding(@NotNull ButtonBinding binding, int[] button) {
|
public static void setButtonBinding(@NotNull ButtonBinding binding, int[] button) {
|
||||||
binding.setButton(button);
|
binding.setButton(button);
|
||||||
getBindingsForController().put("controller.controls." + binding.getName(), binding.getButtonCode());
|
MidnightControlsConfig.BINDINGS.put("controller.controls." + binding.getName(), binding.getButtonCode());
|
||||||
if (controllerBindingProfiles.containsKey(getController().getGuid())) controllerBindingProfiles.get(getController().getGuid()).put("controller.controls." + binding.getName(), binding.getButtonCode());
|
|
||||||
else BINDING.put("controller.controls." + binding.getName(), binding.getButtonCode());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isBackButton(int btn, boolean isBtn, int state) {
|
public static boolean isBackButton(int btn, boolean isBtn, int state) {
|
||||||
@@ -350,16 +280,13 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
hudSide = HudSide.LEFT;
|
hudSide = HudSide.LEFT;
|
||||||
analogMovement = true;
|
analogMovement = true;
|
||||||
doubleTapToSprint = true;
|
doubleTapToSprint = true;
|
||||||
controllerToggleSneak = MinecraftClient.getInstance().options.getSneakToggled().getValue();
|
|
||||||
controllerToggleSprint = MinecraftClient.getInstance().options.getSprintToggled().getValue();
|
|
||||||
fastBlockPlacing = false;
|
fastBlockPlacing = false;
|
||||||
flyDrifting = true;
|
flyDrifting = true;
|
||||||
verticalFlyDrifting = true;
|
verticalFlyDrifting = true;
|
||||||
horizontalReacharound = false;
|
horizontalReacharound = false;
|
||||||
verticalReacharound = false;
|
verticalReacharound = false;
|
||||||
shouldRenderReacharoundOutline = true;
|
shouldRenderReacharoundOutline = true;
|
||||||
reacharoundOutlineColorHex = "#ffffff";
|
reacharoundOutlineColor = new int[]{255, 255, 255, 102};
|
||||||
reacharoundOutlineColorAlpha = 102;
|
|
||||||
rightDeadZone = 0.25;
|
rightDeadZone = 0.25;
|
||||||
leftDeadZone = 0.25;
|
leftDeadZone = 0.25;
|
||||||
invertRightYAxis = false;
|
invertRightYAxis = false;
|
||||||
@@ -373,18 +300,9 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
controllerID = 0;
|
controllerID = 0;
|
||||||
secondControllerID = -1;
|
secondControllerID = -1;
|
||||||
controllerType = ControllerType.DEFAULT;
|
controllerType = ControllerType.DEFAULT;
|
||||||
mouseScreens = Lists.newArrayList("net.minecraft.client.gui.screen.advancement", "net.minecraft.class_457", "net.minecraft.class_408", "net.minecraft.class_3872", "me.flashyreese.mods.reeses_sodium_options.client.gui", "dev.emi.emi.screen", "me.shedaniel.clothconfig2.gui.ClothConfigScreen", "com.mamiyaotaru.voxelmap.gui.GuiWaypoints", "com.mamiyaotaru.voxelmap.gui.GuiPersistentMap");
|
mouseScreens = Lists.newArrayList("me.jellysquid.mods.sodium.client.gui", "net.coderbot.iris.gui", "net.minecraft.client.gui.screen.advancement", "net.minecraft.client.gui.screen.pack.PackScreen", "net.minecraft.class_5375", "net.minecraft.class_457", "net.minecraft.class_408", "me.flashyreese.mods.reeses_sodium_options.client.gui", "dev.emi.emi.screen");
|
||||||
BINDING = new HashMap<>();
|
BINDINGS = new HashMap<>();
|
||||||
maxAnalogValueLeftX = 1;
|
maxAnalogValues = new double[]{1, 1, 1, 1};
|
||||||
maxAnalogValueLeftY = 1;
|
|
||||||
maxAnalogValueRightX = 1;
|
|
||||||
maxAnalogValueRightY = 1;
|
|
||||||
triggerFix = true;
|
|
||||||
enableHints = true;
|
|
||||||
shortcutInControls = true;
|
|
||||||
ringBindings = new ArrayList<>();
|
|
||||||
ignoredUnboundKeys = Lists.newArrayList("inventorytabs.key.next_tab");
|
|
||||||
controllerBindingProfiles = new HashMap<>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -396,15 +314,12 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
String controller = getController().getName().toLowerCase();
|
String controller = getController().getName().toLowerCase();
|
||||||
if (controller.contains("xbox 360")) return ControllerType.XBOX_360;
|
if (controller.contains("xbox 360")) return ControllerType.XBOX_360;
|
||||||
else if (controller.contains("xbox") || controller.contains("afterglow")) return ControllerType.XBOX;
|
else if (controller.contains("xbox") || controller.contains("afterglow")) return ControllerType.XBOX;
|
||||||
else if (controller.contains("steam") && GlDebugInfo.getCpuInfo().contains("AMD Custom APU")) return ControllerType.STEAM_DECK;
|
else if (controller.contains("steam deck")) return ControllerType.STEAM_DECK;
|
||||||
else if (controller.contains("steam")) return ControllerType.STEAM_CONTROLLER;
|
else if (controller.contains("steam")) return ControllerType.STEAM_CONTROLLER;
|
||||||
else if (controller.contains("dualsense") || controller.contains("ps5")) return ControllerType.DUALSENSE;
|
else if (controller.contains("dualsense")) return ControllerType.DUALSENSE;
|
||||||
else if (controller.contains("dualshock") || controller.contains("ps4") || controller.contains("sony")) return ControllerType.DUALSHOCK;
|
else if (controller.contains("dualshock") || controller.contains("ps4")) return ControllerType.DUALSHOCK;
|
||||||
else if (controller.contains("switch") || controller.contains("joy-con") || controller.contains("wii") || controller.contains("nintendo")) return ControllerType.SWITCH;
|
else if (controller.contains("switch") || controller.contains("joy-con")) return ControllerType.SWITCH;
|
||||||
else if (controller.contains("ouya")) return ControllerType.OUYA;
|
else if (controller.contains("ouya")) return ControllerType.OUYA;
|
||||||
else return ControllerType.DEFAULT;
|
else return ControllerType.DEFAULT;
|
||||||
}
|
}
|
||||||
public static boolean doMixedInput() {
|
|
||||||
return touchInControllerMode && controlsMode == ControlsMode.CONTROLLER;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,45 +10,42 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client;
|
package eu.midnightdust.midnightcontrols.client;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import org.thinkingstudio.obsidianui.widget.AbstractSpruceWidget;
|
import dev.lambdaurora.spruceui.widget.AbstractSpruceWidget;
|
||||||
import org.thinkingstudio.obsidianui.widget.container.SpruceEntryListWidget;
|
import dev.lambdaurora.spruceui.widget.container.SpruceEntryListWidget;
|
||||||
import eu.midnightdust.midnightcontrols.MidnightControls;
|
import eu.midnightdust.midnightcontrols.MidnightControls;
|
||||||
import eu.midnightdust.midnightcontrols.client.compat.*;
|
import eu.midnightdust.midnightcontrols.client.compat.LibGuiCompat;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.compat.SodiumCompat;
|
||||||
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;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.CameraMode;
|
|
||||||
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.gui.widget.ControllerControlsWidget;
|
import eu.midnightdust.midnightcontrols.client.gui.widget.ControllerControlsWidget;
|
||||||
import eu.midnightdust.midnightcontrols.client.mixin.*;
|
import eu.midnightdust.midnightcontrols.client.mixin.*;
|
||||||
import eu.midnightdust.midnightcontrols.client.ring.RingPage;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor;
|
import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor;
|
||||||
import eu.midnightdust.midnightcontrols.client.util.MathUtil;
|
import eu.midnightdust.midnightcontrols.client.util.MouseAccessor;
|
||||||
import org.thinkingstudio.obsidianui.navigation.NavigationDirection;
|
import dev.lambdaurora.spruceui.navigation.NavigationDirection;
|
||||||
import org.thinkingstudio.obsidianui.screen.SpruceScreen;
|
import dev.lambdaurora.spruceui.screen.SpruceScreen;
|
||||||
import org.thinkingstudio.obsidianui.widget.AbstractSprucePressableButtonWidget;
|
import dev.lambdaurora.spruceui.widget.AbstractSprucePressableButtonWidget;
|
||||||
import org.thinkingstudio.obsidianui.widget.SpruceElement;
|
import dev.lambdaurora.spruceui.widget.SpruceElement;
|
||||||
import org.thinkingstudio.obsidianui.widget.SpruceLabelWidget;
|
import dev.lambdaurora.spruceui.widget.SpruceLabelWidget;
|
||||||
import org.thinkingstudio.obsidianui.widget.container.SpruceParentWidget;
|
import dev.lambdaurora.spruceui.widget.container.SpruceParentWidget;
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.ButtonState;
|
|
||||||
import net.fabricmc.loader.api.FabricLoader;
|
import net.fabricmc.loader.api.FabricLoader;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.gui.Element;
|
import net.minecraft.client.gui.Element;
|
||||||
import net.minecraft.client.gui.ParentElement;
|
import net.minecraft.client.gui.ParentElement;
|
||||||
import net.minecraft.client.gui.screen.Screen;
|
import net.minecraft.client.gui.screen.Screen;
|
||||||
|
import net.minecraft.client.gui.screen.TitleScreen;
|
||||||
import net.minecraft.client.gui.screen.advancement.AdvancementTab;
|
import net.minecraft.client.gui.screen.advancement.AdvancementTab;
|
||||||
import net.minecraft.client.gui.screen.advancement.AdvancementsScreen;
|
import net.minecraft.client.gui.screen.advancement.AdvancementsScreen;
|
||||||
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;
|
||||||
import net.minecraft.client.gui.screen.ingame.MerchantScreen;
|
import net.minecraft.client.gui.screen.ingame.MerchantScreen;
|
||||||
import net.minecraft.client.gui.screen.ingame.StonecutterScreen;
|
|
||||||
import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen;
|
import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen;
|
||||||
import net.minecraft.client.gui.screen.multiplayer.MultiplayerServerListWidget;
|
import net.minecraft.client.gui.screen.multiplayer.MultiplayerServerListWidget;
|
||||||
import net.minecraft.client.gui.screen.world.WorldListWidget;
|
import net.minecraft.client.gui.screen.world.WorldListWidget;
|
||||||
import net.minecraft.client.gui.widget.*;
|
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.util.math.MathHelper;
|
import net.minecraft.util.math.MathHelper;
|
||||||
import org.aperlambda.lambdacommon.utils.Pair;
|
import org.aperlambda.lambdacommon.utils.Pair;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -71,9 +68,7 @@ public class MidnightInput {
|
|||||||
private static final Map<Integer, Integer> BUTTON_COOLDOWNS = new HashMap<>();
|
private static final Map<Integer, Integer> BUTTON_COOLDOWNS = new HashMap<>();
|
||||||
// Cooldowns
|
// Cooldowns
|
||||||
public int actionGuiCooldown = 0;
|
public int actionGuiCooldown = 0;
|
||||||
public int joystickCooldown = 0;
|
|
||||||
public boolean ignoreNextARelease = false;
|
public boolean ignoreNextARelease = false;
|
||||||
public boolean ignoreNextXRelease = false;
|
|
||||||
private double targetYaw = 0.0;
|
private double targetYaw = 0.0;
|
||||||
private double targetPitch = 0.0;
|
private double targetPitch = 0.0;
|
||||||
private float prevXAxis = 0.f;
|
private float prevXAxis = 0.f;
|
||||||
@@ -126,8 +121,6 @@ public class MidnightInput {
|
|||||||
--this.actionGuiCooldown;
|
--this.actionGuiCooldown;
|
||||||
if (this.screenCloseCooldown > 0)
|
if (this.screenCloseCooldown > 0)
|
||||||
--this.screenCloseCooldown;
|
--this.screenCloseCooldown;
|
||||||
if (this.joystickCooldown > 0)
|
|
||||||
--this.joystickCooldown;
|
|
||||||
|
|
||||||
InputManager.updateStates();
|
InputManager.updateStates();
|
||||||
|
|
||||||
@@ -150,13 +143,8 @@ public class MidnightInput {
|
|||||||
if (allowInput)
|
if (allowInput)
|
||||||
InputManager.updateBindings(client);
|
InputManager.updateBindings(client);
|
||||||
|
|
||||||
if (this.controlsInput != null) {
|
if (this.controlsInput != null
|
||||||
InputManager.STATES.forEach((num, button) -> {
|
&& InputManager.STATES.int2ObjectEntrySet().parallelStream().map(Map.Entry::getValue).allMatch(ButtonState::isUnpressed)) {
|
||||||
if (button.isPressed()) System.out.println(num);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (this.controlsInput != null && InputManager.STATES.int2ObjectEntrySet().parallelStream().map(Map.Entry::getValue).allMatch(ButtonState::isUnpressed)) {
|
|
||||||
System.out.println("finished");
|
|
||||||
if (this.controlsInput.focusedBinding != null && !this.controlsInput.waiting) {
|
if (this.controlsInput.focusedBinding != null && !this.controlsInput.waiting) {
|
||||||
int[] buttons = new int[this.controlsInput.currentButtons.size()];
|
int[] buttons = new int[this.controlsInput.currentButtons.size()];
|
||||||
for (int i = 0; i < this.controlsInput.currentButtons.size(); i++)
|
for (int i = 0; i < this.controlsInput.currentButtons.size(); i++)
|
||||||
@@ -183,11 +171,11 @@ public class MidnightInput {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method is called to update the camera
|
* This method is called when Minecraft renders.
|
||||||
*
|
*
|
||||||
* @param client the client instance
|
* @param client the client instance
|
||||||
*/
|
*/
|
||||||
public void updateCamera(@NotNull MinecraftClient client) {
|
public void onRender(@NotNull MinecraftClient client) {
|
||||||
if (!(client.currentScreen == null || client.currentScreen instanceof TouchscreenOverlay))
|
if (!(client.currentScreen == null || client.currentScreen instanceof TouchscreenOverlay))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -196,17 +184,14 @@ public class MidnightInput {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (this.targetYaw != 0.f || this.targetPitch != 0.f) {
|
if (this.targetYaw != 0.f || this.targetPitch != 0.f) {
|
||||||
float rotationYaw = (float) (client.player.prevYaw + (this.targetYaw * 0.175));
|
float rotationYaw = (float) (player.prevYaw + (this.targetYaw / 0.10) * client.getTickDelta());
|
||||||
float rotationPitch = (float) (client.player.prevPitch + (this.targetPitch * 0.175));
|
float rotationPitch = (float) (player.prevPitch + (this.targetPitch / 0.10) * client.getTickDelta());
|
||||||
client.player.prevYaw = rotationYaw;
|
|
||||||
client.player.prevPitch = MathHelper.clamp(rotationPitch, -90.f, 90.f);
|
|
||||||
client.player.setYaw(rotationYaw);
|
client.player.setYaw(rotationYaw);
|
||||||
client.player.setPitch(MathHelper.clamp(rotationPitch, -90.f, 90.f));
|
client.player.setPitch(MathHelper.clamp(rotationPitch, -90.f, 90.f));
|
||||||
if (client.player.isRiding() && client.player.getVehicle() != null) {
|
if (client.player.isRiding() && client.player.getVehicle() != null) {
|
||||||
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));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -260,65 +245,19 @@ public class MidnightInput {
|
|||||||
InputManager.STATES.put(btn, state);
|
InputManager.STATES.put(btn, state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MathUtil.PolarUtil polarLeft = new MathUtil.PolarUtil();
|
|
||||||
MathUtil.PolarUtil polarRight = new MathUtil.PolarUtil();
|
|
||||||
|
|
||||||
private void fetchAxeInput(@NotNull MinecraftClient client, @NotNull GLFWGamepadState gamepadState, boolean leftJoycon) {
|
private void fetchAxeInput(@NotNull MinecraftClient client, @NotNull GLFWGamepadState gamepadState, boolean leftJoycon) {
|
||||||
var buffer = gamepadState.axes();
|
var buffer = gamepadState.axes();
|
||||||
|
|
||||||
polarLeft.calculate(buffer.get(GLFW_GAMEPAD_AXIS_LEFT_X), buffer.get(GLFW_GAMEPAD_AXIS_LEFT_Y), 1, MidnightControlsConfig.leftDeadZone);
|
|
||||||
float leftX = polarLeft.polarX;
|
|
||||||
float leftY = polarLeft.polarY;
|
|
||||||
polarRight.calculate(buffer.get(GLFW_GAMEPAD_AXIS_RIGHT_X), buffer.get(GLFW_GAMEPAD_AXIS_RIGHT_Y), 1, MidnightControlsConfig.rightDeadZone);
|
|
||||||
float rightX = polarRight.polarX;
|
|
||||||
float rightY = polarRight.polarY;
|
|
||||||
|
|
||||||
for (int i = 0; i < buffer.limit(); i++) {
|
for (int i = 0; i < buffer.limit(); i++) {
|
||||||
int axis = leftJoycon ? ButtonBinding.controller2Button(i) : i;
|
int axis = leftJoycon ? ButtonBinding.controller2Button(i) : i;
|
||||||
float value = buffer.get();
|
float value = buffer.get();
|
||||||
|
|
||||||
if (MidnightControlsConfig.analogMovement) {
|
|
||||||
switch (i) {
|
|
||||||
case GLFW_GAMEPAD_AXIS_LEFT_X -> value = leftX;
|
|
||||||
case GLFW_GAMEPAD_AXIS_LEFT_Y -> value = leftY;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch (i) {
|
|
||||||
case GLFW_GAMEPAD_AXIS_RIGHT_X -> value = rightX;
|
|
||||||
case GLFW_GAMEPAD_AXIS_RIGHT_Y -> value = rightY;
|
|
||||||
}
|
|
||||||
float absValue = Math.abs(value);
|
float absValue = Math.abs(value);
|
||||||
|
|
||||||
if (i == GLFW.GLFW_GAMEPAD_AXIS_LEFT_Y)
|
if (i == GLFW.GLFW_GAMEPAD_AXIS_LEFT_Y)
|
||||||
value *= -1.0F;
|
value *= -1.0F;
|
||||||
|
|
||||||
int state = value > MidnightControlsConfig.rightDeadZone ? 1 : (value < -MidnightControlsConfig.rightDeadZone ? 2 : 0);
|
int state = value > MidnightControlsConfig.rightDeadZone ? 1 : (value < -MidnightControlsConfig.rightDeadZone ? 2 : 0);
|
||||||
if (!(client.currentScreen instanceof RingScreen || (MidnightControlsCompat.isEmotecraftPresent() && EmotecraftCompat.isEmotecraftScreen(client.currentScreen)))) this.handleAxe(client, axis, value, absValue, state);
|
this.handleAxe(client, axis, value, absValue, state);
|
||||||
}
|
|
||||||
if (client.currentScreen instanceof RingScreen || (MidnightControlsCompat.isEmotecraftPresent() && EmotecraftCompat.isEmotecraftScreen(client.currentScreen))) {
|
|
||||||
float x = leftX;
|
|
||||||
float y = leftY;
|
|
||||||
|
|
||||||
if (x == 0 && y == 0) {
|
|
||||||
x = rightX;
|
|
||||||
y = rightY;
|
|
||||||
}
|
|
||||||
int index = -1;
|
|
||||||
float border = 0.3f;
|
|
||||||
if (x < -border) {
|
|
||||||
index = 3;
|
|
||||||
if (y < -border) index = 0;
|
|
||||||
else if (y > border) index = 5;
|
|
||||||
} else if (x > border) {
|
|
||||||
index = 4;
|
|
||||||
if (y < -border) index = 2;
|
|
||||||
else if (y > border) index = 7;
|
|
||||||
} else {
|
|
||||||
if (y < -border) index = 1;
|
|
||||||
else if (y > border) index = 6;
|
|
||||||
}
|
|
||||||
if (client.currentScreen instanceof RingScreen && index > -1) RingPage.selected = index;
|
|
||||||
if (MidnightControlsCompat.isEmotecraftPresent() && EmotecraftCompat.isEmotecraftScreen(client.currentScreen)) EmotecraftCompat.handleEmoteSelector(index);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -337,30 +276,16 @@ public class MidnightInput {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (client.currentScreen != null && (action == 0 || action == 2) && button == GLFW_GAMEPAD_BUTTON_Y &&
|
if (action == 0 || action == 2) {
|
||||||
MidnightControlsConfig.arrowScreens.contains(client.currentScreen.getClass().getCanonicalName())) {
|
|
||||||
pressKeyboardKey(client, GLFW.GLFW_KEY_ENTER);
|
|
||||||
this.screenCloseCooldown = 5;
|
|
||||||
}
|
|
||||||
else if (action == 0 || action == 2) {
|
|
||||||
if (client.currentScreen != null
|
if (client.currentScreen != null
|
||||||
&& (button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP || button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN
|
&& (button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP || button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN
|
||||||
|| button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_LEFT || button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_RIGHT)) {
|
|| button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_LEFT || button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_RIGHT)) {
|
||||||
if (this.actionGuiCooldown == 0) {
|
if (this.actionGuiCooldown == 0) {
|
||||||
switch (button) {
|
if (button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP) {
|
||||||
case GLFW_GAMEPAD_BUTTON_DPAD_UP -> this.changeFocus(client.currentScreen, NavigationDirection.UP);
|
this.changeFocus(client.currentScreen, NavigationDirection.UP);
|
||||||
case GLFW_GAMEPAD_BUTTON_DPAD_DOWN -> this.changeFocus(client.currentScreen, NavigationDirection.DOWN);
|
} else if (button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN) {
|
||||||
case GLFW_GAMEPAD_BUTTON_DPAD_LEFT -> this.handleLeftRight(client.currentScreen, false);
|
this.changeFocus(client.currentScreen, NavigationDirection.DOWN);
|
||||||
case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT -> this.handleLeftRight(client.currentScreen, true);
|
} else this.handleLeftRight(client.currentScreen, button != GLFW.GLFW_GAMEPAD_BUTTON_DPAD_LEFT);
|
||||||
}
|
|
||||||
if (MidnightControlsConfig.wasdScreens.contains(client.currentScreen.getClass().getCanonicalName())) {
|
|
||||||
switch (button) {
|
|
||||||
case GLFW_GAMEPAD_BUTTON_DPAD_UP -> pressKeyboardKey(client, GLFW.GLFW_KEY_W);
|
|
||||||
case GLFW_GAMEPAD_BUTTON_DPAD_DOWN -> pressKeyboardKey(client, GLFW.GLFW_KEY_S);
|
|
||||||
case GLFW_GAMEPAD_BUTTON_DPAD_LEFT -> pressKeyboardKey(client, GLFW.GLFW_KEY_A);
|
|
||||||
case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT -> pressKeyboardKey(client, GLFW.GLFW_KEY_D);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -379,6 +304,15 @@ public class MidnightInput {
|
|||||||
else if (FabricLoader.getInstance().isModLoaded("libgui")) LibGuiCompat.handlePress(client.currentScreen);
|
else if (FabricLoader.getInstance().isModLoaded("libgui")) LibGuiCompat.handlePress(client.currentScreen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (button == GLFW.GLFW_GAMEPAD_BUTTON_B) {
|
||||||
|
if (client.currentScreen != null && client.currentScreen.getClass() != TitleScreen.class) {
|
||||||
|
if (!MidnightControlsCompat.handleMenuBack(client, client.currentScreen))
|
||||||
|
if (!this.tryGoBack(client.currentScreen))
|
||||||
|
client.currentScreen.close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (button == GLFW.GLFW_GAMEPAD_BUTTON_A && client.currentScreen != null && !isScreenInteractive(client.currentScreen)
|
if (button == GLFW.GLFW_GAMEPAD_BUTTON_A && client.currentScreen != null && !isScreenInteractive(client.currentScreen)
|
||||||
@@ -390,57 +324,17 @@ public class MidnightInput {
|
|||||||
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) {
|
||||||
Screen.wrapScreenError(() -> {
|
Screen.wrapScreenError(() -> client.currentScreen.mouseClicked(mouseX, mouseY, GLFW.GLFW_MOUSE_BUTTON_1),
|
||||||
((MouseAccessor) client.mouse).setLeftButtonClicked(false);
|
|
||||||
client.currentScreen.mouseClicked(mouseX, mouseY, GLFW.GLFW_MOUSE_BUTTON_1);
|
|
||||||
},
|
|
||||||
"mouseClicked event handler", client.currentScreen.getClass().getCanonicalName());
|
"mouseClicked event handler", client.currentScreen.getClass().getCanonicalName());
|
||||||
} else if (action == 1) {
|
} else if (action == 1) {
|
||||||
Screen.wrapScreenError(() -> {
|
Screen.wrapScreenError(() -> client.currentScreen.mouseReleased(mouseX, mouseY, GLFW.GLFW_MOUSE_BUTTON_1),
|
||||||
((MouseAccessor) client.mouse).setLeftButtonClicked(false);
|
|
||||||
client.currentScreen.mouseReleased(mouseX, mouseY, GLFW.GLFW_MOUSE_BUTTON_1);
|
|
||||||
},
|
|
||||||
"mouseReleased event handler", client.currentScreen.getClass().getCanonicalName());
|
"mouseReleased event handler", client.currentScreen.getClass().getCanonicalName());
|
||||||
} else if (action == 2) {
|
|
||||||
Screen.wrapScreenError(() -> {
|
|
||||||
client.currentScreen.setDragging(true);
|
|
||||||
((MouseAccessor) client.mouse).setLeftButtonClicked(true);
|
|
||||||
((MouseAccessor) client.mouse).midnightcontrols$onCursorPos(client.getWindow().getHandle(), client.mouse.getX(), client.mouse.getY());
|
|
||||||
client.currentScreen.setDragging(false);
|
|
||||||
},
|
|
||||||
"mouseClicked event handler", client.currentScreen.getClass().getCanonicalName());
|
|
||||||
}
|
}
|
||||||
this.screenCloseCooldown = 5;
|
this.screenCloseCooldown = 5;
|
||||||
} else {
|
} else {
|
||||||
this.ignoreNextARelease = false;
|
this.ignoreNextARelease = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (button == GLFW.GLFW_GAMEPAD_BUTTON_X && client.currentScreen != null && !isScreenInteractive(client.currentScreen)
|
|
||||||
&& this.actionGuiCooldown == 0) {
|
|
||||||
if (client.currentScreen instanceof HandledScreen<?> handledScreen && ((HandledScreenAccessor) handledScreen).midnightcontrols$getSlotAt(
|
|
||||||
client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth(),
|
|
||||||
client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight()) != null) return;
|
|
||||||
if (!this.ignoreNextXRelease) {
|
|
||||||
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();
|
|
||||||
if (action == 0) {
|
|
||||||
Screen.wrapScreenError(() -> client.currentScreen.mouseClicked(mouseX, mouseY, GLFW.GLFW_MOUSE_BUTTON_2),
|
|
||||||
"mouseClicked event handler", client.currentScreen.getClass().getCanonicalName());
|
|
||||||
} else if (action == 1) {
|
|
||||||
Screen.wrapScreenError(() -> client.currentScreen.mouseReleased(mouseX, mouseY, GLFW.GLFW_MOUSE_BUTTON_2),
|
|
||||||
"mouseReleased event handler", client.currentScreen.getClass().getCanonicalName());
|
|
||||||
}
|
|
||||||
this.screenCloseCooldown = 5;
|
|
||||||
} else {
|
|
||||||
this.ignoreNextXRelease = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public void pressKeyboardKey(MinecraftClient client, int key) {
|
|
||||||
client.keyboard.onKey(client.getWindow().getHandle(), key, 0, 1, 0);
|
|
||||||
}
|
|
||||||
public void pressKeyboardKey(Screen screen, int key) {
|
|
||||||
screen.keyPressed(key, 0, 1);
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
|
||||||
@@ -452,16 +346,13 @@ public class MidnightInput {
|
|||||||
*/
|
*/
|
||||||
public boolean tryGoBack(@NotNull Screen screen) {
|
public boolean tryGoBack(@NotNull Screen screen) {
|
||||||
var set = ImmutableSet.of("gui.back", "gui.done", "gui.cancel", "gui.toTitle", "gui.toMenu");
|
var set = ImmutableSet.of("gui.back", "gui.done", "gui.cancel", "gui.toTitle", "gui.toMenu");
|
||||||
|
|
||||||
return screen.children().stream().filter(element -> element instanceof PressableWidget)
|
return screen.children().stream().filter(element -> element instanceof PressableWidget)
|
||||||
.map(element -> (PressableWidget) element)
|
.map(element -> (PressableWidget) element)
|
||||||
.filter(element -> element.getMessage() != null && element.getMessage().getContent() != null)
|
.filter(element -> element.getMessage() != null)
|
||||||
.anyMatch(element -> {
|
.anyMatch(element -> {
|
||||||
if (element.getMessage().getContent() instanceof TranslatableTextContent translatableText) {
|
if (set.stream().anyMatch(key -> element.getMessage().toString().equals(key))) {
|
||||||
if (set.stream().anyMatch(key -> translatableText.getKey().equals(key))) {
|
element.onPress();
|
||||||
element.onPress();
|
return true;
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
@@ -475,6 +366,7 @@ public class MidnightInput {
|
|||||||
private void handleAxe(@NotNull MinecraftClient client, int axis, float value, float absValue, int state) {
|
private void handleAxe(@NotNull MinecraftClient client, int axis, float value, float absValue, int state) {
|
||||||
int asButtonState = value > .5f ? 1 : (value < -.5f ? 2 : 0);
|
int asButtonState = value > .5f ? 1 : (value < -.5f ? 2 : 0);
|
||||||
|
|
||||||
|
|
||||||
if (axis == GLFW_GAMEPAD_AXIS_LEFT_TRIGGER || axis == GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER
|
if (axis == GLFW_GAMEPAD_AXIS_LEFT_TRIGGER || axis == GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER
|
||||||
|| axis == ButtonBinding.controller2Button(GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER)
|
|| axis == ButtonBinding.controller2Button(GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER)
|
||||||
|| axis == ButtonBinding.controller2Button(GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER)) {
|
|| axis == ButtonBinding.controller2Button(GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER)) {
|
||||||
@@ -489,18 +381,13 @@ public class MidnightInput {
|
|||||||
state = 1;
|
state = 1;
|
||||||
asButtonState = 1;
|
asButtonState = 1;
|
||||||
}
|
}
|
||||||
//if (MidnightControlsConfig.debug) System.out.println(axis + " "+ value + " " + absValue + " " + state);
|
if (MidnightControlsConfig.debug) System.out.println(axis + " "+ value + " " + absValue + " " + state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean currentPlusState = value > getDeadZoneValue(axis);
|
boolean currentPlusState = asButtonState == 1;
|
||||||
boolean currentMinusState = value < -getDeadZoneValue(axis);
|
boolean currentMinusState = asButtonState == 2;
|
||||||
if (axis == GLFW_GAMEPAD_AXIS_LEFT_TRIGGER || axis == GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER) currentMinusState = false;
|
|
||||||
if (!MidnightControlsConfig.analogMovement && (axis == GLFW_GAMEPAD_AXIS_LEFT_X || axis == GLFW_GAMEPAD_AXIS_LEFT_Y)) {
|
|
||||||
currentPlusState = asButtonState == 1;
|
|
||||||
currentMinusState = asButtonState == 2;
|
|
||||||
}
|
|
||||||
var previousPlusState = InputManager.STATES.getOrDefault(ButtonBinding.axisAsButton(axis, true), ButtonState.NONE);
|
var previousPlusState = InputManager.STATES.getOrDefault(ButtonBinding.axisAsButton(axis, true), ButtonState.NONE);
|
||||||
var previousMinusState = InputManager.STATES.getOrDefault(ButtonBinding.axisAsButton(axis, false), ButtonState.NONE);
|
var previousMinusState = InputManager.STATES.getOrDefault(ButtonBinding.axisAsButton(axis, false), ButtonState.NONE);
|
||||||
|
|
||||||
@@ -526,13 +413,9 @@ public class MidnightInput {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
float axisValue = absValue;
|
double deadZone = this.getDeadZoneValue(axis);
|
||||||
if (!MidnightControlsConfig.analogMovement) {
|
float axisValue = absValue < deadZone ? 0.f : (float) (absValue - deadZone);
|
||||||
double deadZone = this.getDeadZoneValue(axis);
|
axisValue /= (1.0 - deadZone);
|
||||||
axisValue = (float) (absValue - deadZone);
|
|
||||||
axisValue /= (1.0 - deadZone);
|
|
||||||
axisValue *= deadZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
axisValue = (float) Math.min(axisValue / MidnightControlsConfig.getAxisMaxValue(axis), 1);
|
axisValue = (float) Math.min(axisValue / MidnightControlsConfig.getAxisMaxValue(axis), 1);
|
||||||
if (currentPlusState)
|
if (currentPlusState)
|
||||||
@@ -565,7 +448,7 @@ public class MidnightInput {
|
|||||||
var accessor = (CreativeInventoryScreenAccessor) creativeInventoryScreen;
|
var accessor = (CreativeInventoryScreenAccessor) creativeInventoryScreen;
|
||||||
// @TODO allow rebinding to left stick
|
// @TODO allow rebinding to left stick
|
||||||
if (accessor.midnightcontrols$hasScrollbar() && absValue >= deadZone) {
|
if (accessor.midnightcontrols$hasScrollbar() && absValue >= deadZone) {
|
||||||
creativeInventoryScreen.mouseScrolled(0.0, 0.0, 0, -value);
|
creativeInventoryScreen.mouseScrolled(0.0, 0.0, -value);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -573,15 +456,7 @@ public class MidnightInput {
|
|||||||
if (axis == GLFW_GAMEPAD_AXIS_RIGHT_Y) {
|
if (axis == GLFW_GAMEPAD_AXIS_RIGHT_Y) {
|
||||||
// @TODO allow rebinding to left stick
|
// @TODO allow rebinding to left stick
|
||||||
if (absValue >= deadZone) {
|
if (absValue >= deadZone) {
|
||||||
merchantScreen.mouseScrolled(0.0, 0.0, 0, -(value * 1.5f));
|
merchantScreen.mouseScrolled(0.0, 0.0, -(value * 1.5f));
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else if (client.currentScreen instanceof StonecutterScreen stonecutterScreen) {
|
|
||||||
if (axis == GLFW_GAMEPAD_AXIS_RIGHT_Y) {
|
|
||||||
// @TODO allow rebinding to left stick
|
|
||||||
if (absValue >= deadZone) {
|
|
||||||
stonecutterScreen.mouseScrolled(0.0, 0.0, 0, -(value * 1.5f));
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -595,43 +470,29 @@ public class MidnightInput {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if (client.currentScreen != null) {
|
} else if (client.currentScreen != null) {
|
||||||
float finalValue = value;
|
if (axis == GLFW_GAMEPAD_AXIS_RIGHT_Y && absValue >= deadZone) {
|
||||||
if (axis == GLFW_GAMEPAD_AXIS_RIGHT_Y && absValue >= deadZone && client.currentScreen.children().stream().filter(element -> element instanceof SpruceEntryListWidget)
|
float finalValue = value;
|
||||||
|
client.currentScreen.children().stream().filter(element -> element instanceof SpruceEntryListWidget)
|
||||||
.map(element -> (SpruceEntryListWidget<?>) element)
|
.map(element -> (SpruceEntryListWidget<?>) element)
|
||||||
.filter(AbstractSpruceWidget::isFocusedOrHovered)
|
.filter(AbstractSpruceWidget::isFocusedOrHovered)
|
||||||
.noneMatch(element -> {
|
.anyMatch(element -> {
|
||||||
element.mouseScrolled(0.0, 0.0, 0, -finalValue);
|
MidnightControls.get().log(String.valueOf(finalValue));
|
||||||
|
element.mouseScrolled(0.0, 0.0, -finalValue);
|
||||||
return true;
|
return true;
|
||||||
})
|
});
|
||||||
&&
|
client.currentScreen.children().stream().filter(element -> element instanceof EntryListWidget)
|
||||||
client.currentScreen.children().stream().filter(element -> element instanceof EntryListWidget)
|
|
||||||
.map(element -> (EntryListWidget<?>) element)
|
.map(element -> (EntryListWidget<?>) element)
|
||||||
.filter(element -> element.getType().isFocused())
|
.filter(element -> element.getType().isFocused())
|
||||||
.noneMatch(element -> {
|
.anyMatch(element -> {
|
||||||
element.mouseScrolled(0.0, 0.0, 0, -finalValue);
|
element.mouseScrolled(0.0, 0.0, -finalValue);
|
||||||
return true;
|
return true;
|
||||||
}))
|
});
|
||||||
{
|
|
||||||
client.currentScreen.mouseScrolled(0.0, 0.0, 0, -(value * 1.5f));
|
|
||||||
}
|
|
||||||
else if (isScreenInteractive(client.currentScreen) && absValue >= deadZone) {
|
|
||||||
if (value > 0 && joystickCooldown == 0) {
|
|
||||||
switch (axis) {
|
|
||||||
case GLFW_GAMEPAD_AXIS_LEFT_Y -> this.changeFocus(client.currentScreen, NavigationDirection.UP);
|
|
||||||
case GLFW_GAMEPAD_AXIS_LEFT_X -> this.handleLeftRight(client.currentScreen, true);
|
|
||||||
}
|
|
||||||
if (axis == GLFW_GAMEPAD_AXIS_LEFT_Y || axis == GLFW_GAMEPAD_AXIS_LEFT_X) joystickCooldown = 4;
|
|
||||||
} else if (value < 0 && joystickCooldown == 0) {
|
|
||||||
switch (axis) {
|
|
||||||
case GLFW_GAMEPAD_AXIS_LEFT_Y -> this.changeFocus(client.currentScreen, NavigationDirection.DOWN);
|
|
||||||
case GLFW_GAMEPAD_AXIS_LEFT_X -> this.handleLeftRight(client.currentScreen, false);
|
|
||||||
}
|
|
||||||
if (axis == GLFW_GAMEPAD_AXIS_LEFT_Y || axis == GLFW_GAMEPAD_AXIS_LEFT_X) joystickCooldown = 4;
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
absValue -= deadZone;
|
||||||
|
absValue /= (1.0 - deadZone);
|
||||||
absValue = (float) MathHelper.clamp(absValue / MidnightControlsConfig.getAxisMaxValue(axis), 0.f, 1.f);
|
absValue = (float) MathHelper.clamp(absValue / MidnightControlsConfig.getAxisMaxValue(axis), 0.f, 1.f);
|
||||||
if (client.currentScreen == null) {
|
if (client.currentScreen == null) {
|
||||||
// Handles the look direction.
|
// Handles the look direction.
|
||||||
@@ -710,7 +571,7 @@ public class MidnightInput {
|
|||||||
labelWidget.onPress();
|
labelWidget.onPress();
|
||||||
return true;
|
return true;
|
||||||
} else if (focused instanceof WorldListWidget list) {
|
} else if (focused instanceof WorldListWidget list) {
|
||||||
list.getSelectedAsOptional().ifPresent(WorldListWidget.WorldEntry::play);
|
list.getSelectedAsOptional().ifPresent(WorldListWidget.Entry::play);
|
||||||
return true;
|
return true;
|
||||||
} else if (focused instanceof MultiplayerServerListWidget list) {
|
} else if (focused instanceof MultiplayerServerListWidget list) {
|
||||||
var entry = list.getSelectedOrNull();
|
var entry = list.getSelectedOrNull();
|
||||||
@@ -726,10 +587,7 @@ public class MidnightInput {
|
|||||||
var childFocused = widget.getFocused();
|
var childFocused = widget.getFocused();
|
||||||
if (childFocused != null)
|
if (childFocused != null)
|
||||||
return this.handleAButton(screen, childFocused);
|
return this.handleAButton(screen, childFocused);
|
||||||
} else if (FabricLoader.getInstance().isModLoaded("yet-another-config-lib") && YACLCompat.handleAButton(screen, focused)) {
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
else pressKeyboardKey(screen, GLFW_KEY_ENTER);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -745,10 +603,6 @@ public class MidnightInput {
|
|||||||
this.actionGuiCooldown = 5;
|
this.actionGuiCooldown = 5;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (FabricLoader.getInstance().isModLoaded("yet-another-config-lib") && YACLCompat.handleLeftRight(screen, right)) {
|
|
||||||
this.actionGuiCooldown = 5;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
var focused = screen.getFocused();
|
var focused = screen.getFocused();
|
||||||
if (focused != null)
|
if (focused != null)
|
||||||
if (this.handleRightLeftElement(focused, right))
|
if (this.handleRightLeftElement(focused, right))
|
||||||
@@ -763,13 +617,11 @@ public class MidnightInput {
|
|||||||
return !spruceElement.onNavigation(right ? NavigationDirection.RIGHT : NavigationDirection.LEFT, false);
|
return !spruceElement.onNavigation(right ? NavigationDirection.RIGHT : NavigationDirection.LEFT, false);
|
||||||
}
|
}
|
||||||
if (element instanceof SliderWidget slider) {
|
if (element instanceof SliderWidget slider) {
|
||||||
if (slider.active) {
|
slider.keyPressed(right ? 262 : 263, 0, 0);
|
||||||
slider.keyPressed(right ? 262 : 263, 0, 0);
|
this.actionGuiCooldown = 2; // Prevent to press too quickly the focused element, so we have to skip 5 ticks.
|
||||||
this.actionGuiCooldown = 2; // Prevent to press too quickly the focused element, so we have to skip 5 ticks.
|
return false;
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} else if (element instanceof AlwaysSelectedEntryListWidget) {
|
} else if (element instanceof AlwaysSelectedEntryListWidget) {
|
||||||
//TODO((EntryListWidgetAccessor) element).midnightcontrols$moveSelection(right ? EntryListWidget.MoveDirection.DOWN : EntryListWidget.MoveDirection.UP);
|
((EntryListWidgetAccessor) element).midnightcontrols$moveSelection(right ? EntryListWidget.MoveDirection.DOWN : EntryListWidget.MoveDirection.UP);
|
||||||
return false;
|
return false;
|
||||||
} else if (element instanceof ParentElement entryList) {
|
} else if (element instanceof ParentElement entryList) {
|
||||||
var focused = entryList.getFocused();
|
var focused = entryList.getFocused();
|
||||||
@@ -779,10 +631,6 @@ public class MidnightInput {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
private double prevX = 0;
|
|
||||||
private double prevY = 0;
|
|
||||||
private double xValue;
|
|
||||||
private int xState;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles the look direction input.
|
* Handles the look direction input.
|
||||||
@@ -793,9 +641,8 @@ public class MidnightInput {
|
|||||||
* @param state the state
|
* @param state the state
|
||||||
*/
|
*/
|
||||||
public void handleLook(@NotNull MinecraftClient client, int axis, float value, int state) {
|
public void handleLook(@NotNull MinecraftClient client, int axis, float value, int state) {
|
||||||
if (client.player == null) return;
|
|
||||||
// Handles the look direction.
|
// Handles the look direction.
|
||||||
if (MidnightControlsConfig.cameraMode == CameraMode.FLAT) {
|
if (client.player != null) {
|
||||||
double powValue = Math.pow(value, 2.0);
|
double powValue = Math.pow(value, 2.0);
|
||||||
if (axis == GLFW_GAMEPAD_AXIS_RIGHT_Y) {
|
if (axis == GLFW_GAMEPAD_AXIS_RIGHT_Y) {
|
||||||
if (state == 2) {
|
if (state == 2) {
|
||||||
@@ -811,43 +658,6 @@ public class MidnightInput {
|
|||||||
this.targetYaw = MidnightControlsConfig.getRightXAxisSign() * (MidnightControlsConfig.rotationSpeed * powValue) * 0.11D;
|
this.targetYaw = MidnightControlsConfig.getRightXAxisSign() * (MidnightControlsConfig.rotationSpeed * powValue) * 0.11D;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Code below runs for adaptive camera mode
|
|
||||||
|
|
||||||
// Handles the look direction.
|
|
||||||
if (axis == GLFW_GAMEPAD_AXIS_RIGHT_X) {
|
|
||||||
xValue = value;
|
|
||||||
xState = state;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (axis == GLFW_GAMEPAD_AXIS_RIGHT_Y && client.player != null) {
|
|
||||||
double yStep = (MidnightControlsConfig.yAxisRotationSpeed / 100) * 0.6000000238418579 + 0.20000000298023224;
|
|
||||||
double xStep = (MidnightControlsConfig.rotationSpeed / 100) * 0.6000000238418579 + 0.20000000298023224;
|
|
||||||
|
|
||||||
double cursorDeltaX = 2 * xValue - this.prevX;
|
|
||||||
double cursorDeltaY = 2 * value - this.prevY;
|
|
||||||
boolean slowdown = client.options.getPerspective().isFirstPerson() && client.player.isUsingSpyglass();
|
|
||||||
double x = cursorDeltaX * xStep * (slowdown ? xStep : 1);
|
|
||||||
double y = cursorDeltaY * yStep * (slowdown ? yStep : 1);
|
|
||||||
|
|
||||||
double powXValue = Math.pow(x, 2.0);
|
|
||||||
double powYValue = Math.pow(y, 2.0);
|
|
||||||
|
|
||||||
if (state == 2) {
|
|
||||||
this.targetPitch = -MidnightControlsConfig.getRightYAxisSign() * (MidnightControlsConfig.yAxisRotationSpeed * powYValue) * 0.11D;
|
|
||||||
} else if (state == 1) {
|
|
||||||
this.targetPitch = MidnightControlsConfig.getRightYAxisSign() * (MidnightControlsConfig.yAxisRotationSpeed * powYValue) * 0.11D;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (xState == 2) {
|
|
||||||
this.targetYaw = -MidnightControlsConfig.getRightXAxisSign() * (MidnightControlsConfig.rotationSpeed * powXValue) * 0.11D;
|
|
||||||
} else if (xState == 1) {
|
|
||||||
this.targetYaw = MidnightControlsConfig.getRightXAxisSign() * (MidnightControlsConfig.rotationSpeed * powXValue) * 0.11D;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.prevY = value;
|
|
||||||
this.prevX = xValue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -860,20 +670,87 @@ public class MidnightInput {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
switch (direction) {
|
if (FabricLoader.getInstance().isModLoaded("sodium"))
|
||||||
case UP -> pressKeyboardKey(screen, GLFW.GLFW_KEY_UP);
|
SodiumCompat.handleInput(screen, direction.isLookingForward());
|
||||||
case DOWN -> pressKeyboardKey(screen, GLFW.GLFW_KEY_DOWN);
|
// This still needs some work
|
||||||
case LEFT -> pressKeyboardKey(screen, GLFW.GLFW_KEY_LEFT);
|
// ScreenAccessor accessor = (ScreenAccessor) screen;
|
||||||
case RIGHT -> pressKeyboardKey(screen, GLFW.GLFW_KEY_RIGHT);
|
// if (accessor.getSelected() != null && accessor.getSelected() instanceof ClickableWidget selected && accessor.getSelectables() != null) {
|
||||||
|
// //System.out.println(direction);
|
||||||
|
// if (accessor.getSelectables().size() >= 2) {
|
||||||
|
// //System.out.println(direction + " 2");
|
||||||
|
// int xDifference = Integer.MAX_VALUE;
|
||||||
|
// int yDifference = Integer.MAX_VALUE;
|
||||||
|
// ClickableWidget newWidget = null;
|
||||||
|
// for (int i = 0; i < accessor.getSelectables().size(); ++i) {
|
||||||
|
// if (accessor.getSelectables().get(i) instanceof ClickableWidget candidate) {
|
||||||
|
// if (!(candidate.x == selected.x && candidate.y == selected.y)) {
|
||||||
|
// int canXDifference = Math.abs(candidate.x - selected.x);
|
||||||
|
// int canYDifference = Math.abs(candidate.y - selected.y);
|
||||||
|
// if (direction.isHorizontal()) {
|
||||||
|
// if (direction.isLookingForward()) {
|
||||||
|
// if (candidate.x >= selected.x && canYDifference <= yDifference && canXDifference <= xDifference) {
|
||||||
|
// System.out.println(direction + " forward horizontal " + candidate);
|
||||||
|
// newWidget = candidate;
|
||||||
|
// xDifference = canXDifference;
|
||||||
|
// yDifference = canYDifference;
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// if (candidate.x <= selected.x && canYDifference <= yDifference && canXDifference >= xDifference) {
|
||||||
|
// System.out.println(direction + " backward horizontal " + candidate);
|
||||||
|
// newWidget = candidate;
|
||||||
|
// xDifference = canXDifference;
|
||||||
|
// yDifference = canYDifference;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// if (direction.isLookingForward()) {
|
||||||
|
// if (candidate.y >= selected.y && canYDifference <= yDifference && canXDifference <= xDifference) {
|
||||||
|
// System.out.println(direction + " forward vertical " + candidate);
|
||||||
|
// newWidget = candidate;
|
||||||
|
// xDifference = canXDifference;
|
||||||
|
// yDifference = canYDifference;
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// if (candidate.y <= selected.y && canYDifference >= yDifference && canXDifference <= xDifference) {
|
||||||
|
// System.out.println(direction + " backward vertical " + candidate);
|
||||||
|
// newWidget = candidate;
|
||||||
|
// xDifference = canXDifference;
|
||||||
|
// yDifference = canYDifference;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if (newWidget != null) {
|
||||||
|
// //selected.changeFocus(true);
|
||||||
|
// ((ClickableWidgetAccessor) selected).setFocused(false);
|
||||||
|
// ((ClickableWidgetAccessor) newWidget).setFocused(true);
|
||||||
|
// screen.setFocused(newWidget);
|
||||||
|
// screen.changeFocus(false);
|
||||||
|
// screen.changeFocus(true);
|
||||||
|
// this.actionGuiCooldown = 5;
|
||||||
|
// return true;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
if (!screen.changeFocus(direction.isLookingForward())) {
|
||||||
|
if (screen.changeFocus(direction.isLookingForward())) {
|
||||||
|
this.actionGuiCooldown = 5;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
this.actionGuiCooldown = 5;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
this.actionGuiCooldown = 5;
|
|
||||||
return false;
|
|
||||||
} catch (Exception exception) {MidnightControls.get().warn("Unknown exception encountered while trying to change focus: "+exception);}
|
} catch (Exception exception) {MidnightControls.get().warn("Unknown exception encountered while trying to change focus: "+exception);}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isScreenInteractive(@NotNull Screen screen) {
|
public static boolean isScreenInteractive(@NotNull Screen screen) {
|
||||||
return !(screen instanceof HandledScreen || MidnightControlsConfig.joystickAsMouse || MidnightControlsConfig.mouseScreens.stream().anyMatch(a -> screen.getClass().toString().contains(a))
|
return !(screen instanceof HandledScreen || MidnightControlsConfig.mouseScreens.stream().anyMatch(a -> screen.getClass().toString().contains(a))
|
||||||
|| (screen instanceof SpruceScreen && ((SpruceScreen) screen).requiresCursor())
|
|| (screen instanceof SpruceScreen && ((SpruceScreen) screen).requiresCursor())
|
||||||
|| MidnightControlsCompat.requireMouseOnScreen(screen));
|
|| MidnightControlsCompat.requireMouseOnScreen(screen));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ import net.minecraft.block.BlockState;
|
|||||||
import net.minecraft.block.FluidBlock;
|
import net.minecraft.block.FluidBlock;
|
||||||
import net.minecraft.block.SlabBlock;
|
import net.minecraft.block.SlabBlock;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.entity.attribute.EntityAttributes;
|
|
||||||
import net.minecraft.item.BlockItem;
|
import net.minecraft.item.BlockItem;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.util.hit.BlockHitResult;
|
import net.minecraft.util.hit.BlockHitResult;
|
||||||
@@ -74,8 +73,8 @@ public class MidnightReacharound {
|
|||||||
return MidnightControlsFeature.HORIZONTAL_REACHAROUND.isAvailable() || MidnightControlsFeature.VERTICAL_REACHAROUND.isAvailable();
|
return MidnightControlsFeature.HORIZONTAL_REACHAROUND.isAvailable() || MidnightControlsFeature.VERTICAL_REACHAROUND.isAvailable();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static float getPlayerRange(@NotNull MinecraftClient client) {
|
private float getPlayerRange(@NotNull MinecraftClient client) {
|
||||||
return client.player != null ? Double.valueOf(client.player.getAttributeValue(EntityAttributes.PLAYER_BLOCK_INTERACTION_RANGE)).floatValue() : 0.f;
|
return client.interactionManager != null ? client.interactionManager.getReachDistance() : 0.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -102,7 +101,7 @@ public class MidnightReacharound {
|
|||||||
BlockPos blockPos = result.getBlockPos().down();
|
BlockPos blockPos = result.getBlockPos().down();
|
||||||
BlockState state = client.world.getBlockState(blockPos);
|
BlockState state = client.world.getBlockState(blockPos);
|
||||||
|
|
||||||
if (client.player.getBlockPos().getY() - blockPos.getY() > 1 && (client.world.isAir(blockPos) || state.isReplaceable())) {
|
if (client.player.getBlockPos().getY() - blockPos.getY() > 1 && (client.world.isAir(blockPos) || state.getMaterial().isReplaceable())) {
|
||||||
return new BlockHitResult(result.getPos(), Direction.DOWN, blockPos, false);
|
return new BlockHitResult(result.getPos(), Direction.DOWN, blockPos, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -121,39 +120,31 @@ public class MidnightReacharound {
|
|||||||
return null;
|
return null;
|
||||||
|
|
||||||
if (client.player != null && client.crosshairTarget != null && client.crosshairTarget.getType() == HitResult.Type.MISS
|
if (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;
|
||||||
// Temporary pos, do not use
|
var playerPos = client.player.getBlockPos().down();
|
||||||
Vec3d playerPosi = client.player.getPos();
|
|
||||||
|
|
||||||
// Imitates var playerPos = client.player.getBlockPos().down();
|
|
||||||
Vec3d playerPos = new Vec3d(playerPosi.getX(), playerPosi.getY() - 1.0, playerPosi.getZ());
|
|
||||||
if (client.player.getY() - playerPos.getY() - 1.0 >= 0.25) {
|
if (client.player.getY() - playerPos.getY() - 1.0 >= 0.25) {
|
||||||
// Imitates playerPos = playerPos.up();
|
playerPos = playerPos.up();
|
||||||
playerPos = playerPosi;
|
|
||||||
this.onSlab = true;
|
this.onSlab = true;
|
||||||
} else {
|
} else {
|
||||||
this.onSlab = false;
|
this.onSlab = false;
|
||||||
}
|
}
|
||||||
var targetPos = new Vec3d(client.crosshairTarget.getPos().getX(), client.crosshairTarget.getPos().getY(), client.crosshairTarget.getPos().getZ()).subtract(playerPos);
|
var targetPos = new BlockPos(client.crosshairTarget.getPos()).subtract(playerPos);
|
||||||
var vector = new Vec3d(MathHelper.clamp(targetPos.getX(), -1, 1), 0, MathHelper.clamp(targetPos.getZ(), -1, 1));
|
var vector = new BlockPos.Mutable(MathHelper.clamp(targetPos.getX(), -1, 1), 0, MathHelper.clamp(targetPos.getZ(), -1, 1));
|
||||||
var blockPos = playerPos.add(vector);
|
var blockPos = playerPos.add(vector);
|
||||||
|
|
||||||
// Some functions still need BlockPos, so this is here to let that happen
|
|
||||||
var blockyPos = BlockPos.ofFloored(blockPos);
|
|
||||||
|
|
||||||
var direction = client.player.getHorizontalFacing();
|
var direction = client.player.getHorizontalFacing();
|
||||||
|
|
||||||
var state = client.world.getBlockState(blockyPos);
|
var state = client.world.getBlockState(blockPos);
|
||||||
if (!state.isAir())
|
if (!state.isAir())
|
||||||
return null;
|
return null;
|
||||||
var adjacentBlockState = client.world.getBlockState(blockyPos.offset(direction.getOpposite()));
|
var adjacentBlockState = client.world.getBlockState(blockPos.offset(direction.getOpposite()));
|
||||||
if (adjacentBlockState.isAir() || adjacentBlockState.getBlock() instanceof FluidBlock || (vector.getX() == 0 && vector.getZ() == 0)) {
|
if (adjacentBlockState.isAir() || adjacentBlockState.getBlock() instanceof FluidBlock || (vector.getX() == 0 && vector.getZ() == 0)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new BlockHitResult(blockPos, direction, blockyPos, false);
|
return new BlockHitResult(new Vec3d(blockPos.getX(),blockPos.getY(),blockPos.getZ()), direction, blockPos, false);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,9 +7,10 @@
|
|||||||
* see the LICENSE file.
|
* see the LICENSE file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.enums;
|
package eu.midnightdust.midnightcontrols.client;
|
||||||
|
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableText;
|
||||||
import org.aperlambda.lambdacommon.utils.Nameable;
|
import org.aperlambda.lambdacommon.utils.Nameable;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
@@ -33,7 +34,7 @@ public enum VirtualMouseSkin implements Nameable {
|
|||||||
|
|
||||||
VirtualMouseSkin(String name) {
|
VirtualMouseSkin(String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.text = Text.translatable(this.getTranslationKey());
|
this.text = new TranslatableText(this.getTranslationKey());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2022 Motschen <motschen@midnightdust.eu>
|
|
||||||
*
|
|
||||||
* This file is part of midnightcontrols.
|
|
||||||
*
|
|
||||||
* Licensed under the MIT license. For more information,
|
|
||||||
* see the LICENSE file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.compat;
|
|
||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
|
||||||
import me.juancarloscp52.bedrockify.client.BedrockifyClient;
|
|
||||||
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.
|
|
||||||
*
|
|
||||||
* @author Motschen
|
|
||||||
* @version 1.7.0
|
|
||||||
* @since 1.7.0
|
|
||||||
*/
|
|
||||||
public class BedrockifyCompat implements CompatHandler {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void handle(@NotNull MidnightControlsClient mod) {
|
|
||||||
BedrockifyClient.getInstance().settings.disableFlyingMomentum = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -33,13 +33,6 @@ public interface CompatHandler {
|
|||||||
*/
|
*/
|
||||||
void handle(@NotNull MidnightControlsClient mod);
|
void handle(@NotNull MidnightControlsClient mod);
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles custom camera updates
|
|
||||||
*
|
|
||||||
* @param client the Minecraft client instance
|
|
||||||
*/
|
|
||||||
default void handleCamera(@NotNull MinecraftClient client, double targetYaw, double targetPitch) {};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether the mouse is required on the specified screen.
|
* Returns whether the mouse is required on the specified screen.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.compat;
|
package eu.midnightdust.midnightcontrols.client.compat;
|
||||||
|
|
||||||
import dev.emi.emi.api.EmiApi;
|
import dev.emi.emi.screen.EmiScreen;
|
||||||
import dev.emi.emi.config.EmiConfig;
|
|
||||||
import dev.emi.emi.screen.EmiScreenManager;
|
import dev.emi.emi.screen.EmiScreenManager;
|
||||||
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 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 net.minecraft.client.gui.screen.ingame.HandledScreen;
|
||||||
import org.aperlambda.lambdacommon.Identifier;
|
import org.aperlambda.lambdacommon.Identifier;
|
||||||
import org.jetbrains.annotations.NotNull;
|
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 handleTabs(boolean direction) {
|
||||||
if (isEMIEnabled() && MidnightControlsClient.get().input.actionGuiCooldown == 0 && EmiScreenManager.getSearchPanel() != null && EmiScreenManager.getSearchPanel().pageLeft != null && EmiScreenManager.getSearchPanel().pageRight != null) {
|
if (MidnightControlsClient.get().input.actionGuiCooldown == 0 &&EmiScreenManager.searchLeft != null && EmiScreenManager.searchRight != null) {
|
||||||
if (direction) EmiScreenManager.getSearchPanel().pageRight.onPress();
|
if (direction) EmiScreenManager.searchRight.onPress();
|
||||||
else EmiScreenManager.getSearchPanel().pageLeft.onPress();
|
else EmiScreenManager.searchLeft.onPress();
|
||||||
MidnightControlsClient.get().input.actionGuiCooldown = 5;
|
MidnightControlsClient.get().input.actionGuiCooldown = 5;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -29,19 +29,13 @@ public class EMICompat implements CompatHandler {
|
|||||||
.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)->handleTabs(false)).cooldown()
|
||||||
.filter(((client, buttonBinding) -> EmiApi.getHandledScreen() != null))
|
.filter(((client, buttonBinding) -> client.currentScreen instanceof HandledScreen<?> || client.currentScreen instanceof EmiScreen))
|
||||||
.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)->handleTabs(true)).cooldown()
|
||||||
.filter(((client, buttonBinding) -> EmiApi.getHandledScreen() != null))
|
.filter(((client, buttonBinding) -> client.currentScreen instanceof HandledScreen<?> || client.currentScreen instanceof EmiScreen))
|
||||||
.register();
|
.register();
|
||||||
}
|
}
|
||||||
public static boolean isEMIEnabled() {
|
|
||||||
return EmiConfig.enabled;
|
|
||||||
}
|
|
||||||
public static boolean isSearchBarCentered() {
|
|
||||||
return EmiConfig.centerSearchBar;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.compat;
|
|
||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
|
||||||
import io.github.kosmx.emotes.arch.gui.EmoteMenuImpl;
|
|
||||||
import io.github.kosmx.emotes.arch.gui.screen.ingame.FastChosseScreen;
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
|
||||||
import net.minecraft.client.gui.screen.Screen;
|
|
||||||
|
|
||||||
public class EmotecraftCompat {
|
|
||||||
private static final MinecraftClient client = MinecraftClient.getInstance();
|
|
||||||
public static void openEmotecraftScreen(Screen parent) {
|
|
||||||
client.setScreen(new EmoteMenuImpl(parent));
|
|
||||||
}
|
|
||||||
public static boolean isEmotecraftScreen(Screen screen) {
|
|
||||||
return screen instanceof FastChosseScreen;
|
|
||||||
}
|
|
||||||
public static void handleEmoteSelector(int index) {
|
|
||||||
|
|
||||||
if (client.currentScreen instanceof FastChosseScreen) {
|
|
||||||
int x = client.getWindow().getWidth() / 2;
|
|
||||||
int y = client.getWindow().getHeight() / 2;
|
|
||||||
if (index == 0) InputManager.queueMousePosition(x-200, y-200);
|
|
||||||
if (index == 1) InputManager.queueMousePosition(x, y-200);
|
|
||||||
if (index == 2) InputManager.queueMousePosition(x+200, y-200);
|
|
||||||
if (index == 3) InputManager.queueMousePosition(x-200, y);
|
|
||||||
if (index == 4) InputManager.queueMousePosition(x+200, y);
|
|
||||||
if (index == 5) InputManager.queueMousePosition(x-200, y+200);
|
|
||||||
if (index == 6) InputManager.queueMousePosition(x, y+200);
|
|
||||||
if (index == 7) InputManager.queueMousePosition(x+200, y+200);
|
|
||||||
|
|
||||||
InputManager.INPUT_MANAGER.updateMousePosition(client);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.compat;
|
|
||||||
|
|
||||||
import com.kqp.inventorytabs.tabs.TabManager;
|
|
||||||
import net.minecraft.client.gui.screen.Screen;
|
|
||||||
import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
|
|
||||||
import net.minecraft.client.gui.screen.ingame.HandledScreen;
|
|
||||||
|
|
||||||
public class InventoryTabsCompat {
|
|
||||||
|
|
||||||
public static void handleInventoryTabs(Screen screen, boolean next) {
|
|
||||||
if (screen instanceof HandledScreen<?> && !(screen instanceof CreativeInventoryScreen)) {
|
|
||||||
TabManager tabManager = TabManager.getInstance();
|
|
||||||
int tabIndex = tabManager.tabs.indexOf(tabManager.currentTab);
|
|
||||||
if (next) {
|
|
||||||
if (tabIndex < tabManager.tabs.size() - 1) tabManager.onTabClick(tabManager.tabs.get(tabIndex + 1));
|
|
||||||
else tabManager.onTabClick(tabManager.tabs.get(0));
|
|
||||||
} else {
|
|
||||||
if (tabIndex > 0) tabManager.onTabClick(tabManager.tabs.get(tabIndex - 1));
|
|
||||||
else tabManager.onTabClick(tabManager.tabs.get(tabManager.tabs.size() - 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static void handleInventoryPage(Screen screen, boolean next) {
|
|
||||||
if (screen instanceof HandledScreen<?> && !(screen instanceof CreativeInventoryScreen)) {
|
|
||||||
TabManager tabManager = TabManager.getInstance();
|
|
||||||
if (next) {
|
|
||||||
if (tabManager.canGoForwardAPage()) tabManager.setCurrentPage(tabManager.currentPage + 1);
|
|
||||||
} else {
|
|
||||||
if (tabManager.canGoBackAPage()) tabManager.setCurrentPage(tabManager.currentPage - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -53,10 +53,6 @@ public class MidnightControlsCompat {
|
|||||||
mod.log("Adding HQM compatibility...");
|
mod.log("Adding HQM compatibility...");
|
||||||
HANDLERS.add(new HQMCompat());
|
HANDLERS.add(new HQMCompat());
|
||||||
}
|
}
|
||||||
if (FabricLoader.getInstance().isModLoaded("bedrockify")) {
|
|
||||||
mod.log("Adding Bedrockify compatibility...");
|
|
||||||
HANDLERS.add(new BedrockifyCompat());
|
|
||||||
}
|
|
||||||
HANDLERS.forEach(handler -> handler.handle(mod));
|
HANDLERS.forEach(handler -> handler.handle(mod));
|
||||||
InputManager.loadButtonBindings();
|
InputManager.loadButtonBindings();
|
||||||
}
|
}
|
||||||
@@ -171,20 +167,4 @@ public class MidnightControlsCompat {
|
|||||||
public static boolean isEMIPresent() {
|
public static boolean isEMIPresent() {
|
||||||
return FabricLoader.getInstance().isModLoaded("emi");
|
return FabricLoader.getInstance().isModLoaded("emi");
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
* Returns whether InventoryTabs is present.
|
|
||||||
*
|
|
||||||
* @return true if InventoryTabs is present, else false
|
|
||||||
*/
|
|
||||||
public static boolean isInventoryTabsPresent() {
|
|
||||||
return FabricLoader.getInstance().isModLoaded("inventorytabs");
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns whether Emotecraft is present.
|
|
||||||
*
|
|
||||||
* @return true if Emotecraft is present, else false
|
|
||||||
*/
|
|
||||||
public static boolean isEmotecraftPresent() {
|
|
||||||
return FabricLoader.getInstance().isModLoaded("emotecraft");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.compat;
|
package eu.midnightdust.midnightcontrols.client.compat;
|
||||||
|
|
||||||
import eu.midnightdust.lib.util.PlatformFunctions;
|
|
||||||
import net.fabricmc.loader.api.FabricLoader;
|
import net.fabricmc.loader.api.FabricLoader;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.objectweb.asm.tree.ClassNode;
|
import org.objectweb.asm.tree.ClassNode;
|
||||||
@@ -23,16 +22,23 @@ import java.util.Set;
|
|||||||
/**
|
/**
|
||||||
* This plugin is only present for the conditional mixins.
|
* This plugin is only present for the conditional mixins.
|
||||||
*
|
*
|
||||||
* @author LambdAurora & Motschen
|
* @author LambdAurora
|
||||||
* @version 1.6.0
|
* @version 1.5.0
|
||||||
* @since 1.2.0
|
* @since 1.2.0
|
||||||
*/
|
*/
|
||||||
public class MidnightControlsMixinPlugin implements IMixinConfigPlugin {
|
public class MidnightControlsMixinPlugin implements IMixinConfigPlugin {
|
||||||
private String mixinPackage;
|
private final HashMap<String, Boolean> conditionalMixins = new HashMap<>();
|
||||||
|
|
||||||
|
public MidnightControlsMixinPlugin() {
|
||||||
|
this.putConditionalMixin("SodiumOptionsGUIAccessor", FabricLoader.getInstance().isModLoaded("sodium"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void putConditionalMixin(@NotNull String path, boolean condition) {
|
||||||
|
this.conditionalMixins.put("eu.midnightdust.midnightcontrols.client.compat.mixin." + path, condition);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onLoad(String mixinPackage) {
|
public void onLoad(String mixinPackage) {
|
||||||
this.mixinPackage = mixinPackage + ".";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -42,13 +48,7 @@ public class MidnightControlsMixinPlugin implements IMixinConfigPlugin {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
|
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
|
||||||
final String mixinName = mixinClassName.substring(this.mixinPackage.length());
|
return this.conditionalMixins.getOrDefault(mixinClassName, Boolean.TRUE);
|
||||||
final String packageName = mixinName.substring(0, mixinName.lastIndexOf('.'));
|
|
||||||
|
|
||||||
if (packageName.startsWith("sodium") && !PlatformFunctions.isModLoaded("sodium"))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,12 +1,35 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.compat;
|
package eu.midnightdust.midnightcontrols.client.compat;
|
||||||
|
|
||||||
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.compat.mixin.sodium.SodiumOptionsGUIAccessor;
|
import eu.midnightdust.midnightcontrols.client.compat.mixin.SodiumOptionsGUIAccessor;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
||||||
import me.jellysquid.mods.sodium.client.gui.SodiumOptionsGUI;
|
import me.jellysquid.mods.sodium.client.gui.SodiumOptionsGUI;
|
||||||
|
import me.jellysquid.mods.sodium.client.gui.options.control.ControlElement;
|
||||||
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.gui.screen.Screen;
|
import net.minecraft.client.gui.screen.Screen;
|
||||||
|
|
||||||
public class SodiumCompat {
|
public class SodiumCompat {
|
||||||
|
private static final MinecraftClient client = MinecraftClient.getInstance();
|
||||||
|
public static void handleInput(Screen screen, boolean direction) {
|
||||||
|
if (screen instanceof SodiumOptionsGUI optionsGUI) {
|
||||||
|
SodiumOptionsGUIAccessor accessor = (SodiumOptionsGUIAccessor) optionsGUI;
|
||||||
|
final int max = accessor.getControls().size()-1;
|
||||||
|
|
||||||
|
var option = accessor.getControls().stream().filter(ControlElement::isHovered).findFirst().orElse(accessor.getControls().get(0));
|
||||||
|
int i = accessor.getControls().indexOf(option);
|
||||||
|
i = (direction ? ((max > i) ? ++i : 0) : (i > 0 ? --i : max));
|
||||||
|
|
||||||
|
var dimensions = accessor.getControls().get(i).getDimensions();
|
||||||
|
int x = (int) (client.getWindow().getScaleFactor() * dimensions.getCenterX());
|
||||||
|
int y = (int) (client.getWindow().getScaleFactor() * dimensions.getCenterY());
|
||||||
|
InputManager.queueMousePosition(x,y);
|
||||||
|
InputManager.INPUT_MANAGER.updateMousePosition(client);
|
||||||
|
MidnightControlsClient.get().input.actionGuiCooldown = 5;
|
||||||
|
if (MidnightControlsConfig.debug) MidnightControls.get().log(i+" "+accessor.getControls().size()+" | " + dimensions.getCenterX() + " " + dimensions.getCenterY());
|
||||||
|
}
|
||||||
|
}
|
||||||
public static void handleTabs(Screen screen, boolean direction) {
|
public static void handleTabs(Screen screen, boolean direction) {
|
||||||
if (screen instanceof SodiumOptionsGUI optionsGUI) {
|
if (screen instanceof SodiumOptionsGUI optionsGUI) {
|
||||||
SodiumOptionsGUIAccessor accessor = (SodiumOptionsGUIAccessor) optionsGUI;
|
SodiumOptionsGUIAccessor accessor = (SodiumOptionsGUIAccessor) optionsGUI;
|
||||||
|
|||||||
@@ -1,56 +0,0 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.compat;
|
|
||||||
|
|
||||||
import dev.isxander.yacl.gui.AbstractWidget;
|
|
||||||
import dev.isxander.yacl.gui.OptionListWidget;
|
|
||||||
import dev.isxander.yacl.gui.YACLScreen;
|
|
||||||
import dev.isxander.yacl.gui.controllers.ControllerWidget;
|
|
||||||
import dev.isxander.yacl.gui.controllers.slider.SliderControllerElement;
|
|
||||||
import net.minecraft.client.gui.Element;
|
|
||||||
import net.minecraft.client.gui.screen.Screen;
|
|
||||||
import org.lwjgl.glfw.GLFW;
|
|
||||||
|
|
||||||
public class YACLCompat {
|
|
||||||
public static boolean handleAButton(Screen screen, Element element) {
|
|
||||||
if (element instanceof AbstractWidget abstractWidget) {
|
|
||||||
// imitate ender key press
|
|
||||||
return abstractWidget.keyPressed(GLFW.GLFW_KEY_ENTER, 0, 0);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean handleLeftRight(Screen screen, boolean direction) {
|
|
||||||
if (screen instanceof YACLScreen yaclScreen) {
|
|
||||||
SliderControllerElement focusedSlider = yaclScreen.optionList.children().stream()
|
|
||||||
.filter(OptionListWidget.OptionEntry.class::isInstance)
|
|
||||||
.map(entry -> ((OptionListWidget.OptionEntry) entry).widget)
|
|
||||||
.filter(ControllerWidget.class::isInstance)
|
|
||||||
.map(ControllerWidget.class::cast)
|
|
||||||
.filter(SliderControllerElement.class::isInstance)
|
|
||||||
.map(SliderControllerElement.class::cast)
|
|
||||||
.filter(ControllerWidget::isHovered)
|
|
||||||
.findFirst()
|
|
||||||
.orElse(null);
|
|
||||||
|
|
||||||
if (focusedSlider == null)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
focusedSlider.incrementValue(direction ? 1 : -1);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean handleCategories(Screen screen, boolean direction) {
|
|
||||||
if (screen instanceof YACLScreen yaclScreen) {
|
|
||||||
int categoryIdx = yaclScreen.getCurrentCategoryIdx();
|
|
||||||
if (direction) categoryIdx++; else categoryIdx--;
|
|
||||||
if (categoryIdx < 0) categoryIdx = yaclScreen.config.categories().size() - 1;
|
|
||||||
if (categoryIdx >= yaclScreen.config.categories().size()) categoryIdx = 0;
|
|
||||||
|
|
||||||
yaclScreen.changeCategory(categoryIdx);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.compat.mixin.sodium;
|
package eu.midnightdust.midnightcontrols.client.compat.mixin;
|
||||||
|
|
||||||
import me.jellysquid.mods.sodium.client.gui.SodiumOptionsGUI;
|
import me.jellysquid.mods.sodium.client.gui.SodiumOptionsGUI;
|
||||||
import me.jellysquid.mods.sodium.client.gui.options.OptionPage;
|
import me.jellysquid.mods.sodium.client.gui.options.OptionPage;
|
||||||
@@ -9,14 +9,13 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.controller;
|
package eu.midnightdust.midnightcontrols.client.controller;
|
||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.ButtonState;
|
import eu.midnightdust.midnightcontrols.client.ButtonState;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.RingScreen;
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.option.GameOptions;
|
import net.minecraft.client.option.GameOptions;
|
||||||
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.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableText;
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
import org.aperlambda.lambdacommon.utils.function.PairPredicate;
|
import org.aperlambda.lambdacommon.utils.function.PairPredicate;
|
||||||
import org.aperlambda.lambdacommon.utils.function.Predicates;
|
import org.aperlambda.lambdacommon.utils.function.Predicates;
|
||||||
@@ -46,15 +45,6 @@ public class ButtonBinding {
|
|||||||
public static final ButtonBinding BACK = new Builder("back").buttons(axisAsButton(GLFW_GAMEPAD_AXIS_LEFT_Y, false))
|
public static final ButtonBinding BACK = new Builder("back").buttons(axisAsButton(GLFW_GAMEPAD_AXIS_LEFT_Y, false))
|
||||||
.action(MovementHandler.HANDLER).onlyInGame().register();
|
.action(MovementHandler.HANDLER).onlyInGame().register();
|
||||||
public static final ButtonBinding CHAT = new Builder("chat").buttons(GLFW_GAMEPAD_BUTTON_DPAD_RIGHT).onlyInGame().cooldown().register();
|
public static final ButtonBinding CHAT = new Builder("chat").buttons(GLFW_GAMEPAD_BUTTON_DPAD_RIGHT).onlyInGame().cooldown().register();
|
||||||
public static final ButtonBinding CONTROLS_RING = new Builder("controls_ring").buttons(GLFW_GAMEPAD_BUTTON_GUIDE).onlyInGame().cooldown()
|
|
||||||
.action((client, button1, value, action) -> {
|
|
||||||
if (action.isPressed()) {
|
|
||||||
MidnightControlsClient.get().ring.loadFromUnbound();
|
|
||||||
client.setScreen(new RingScreen());
|
|
||||||
}
|
|
||||||
if (action.isUnpressed() && client.currentScreen != null) client.currentScreen.close();
|
|
||||||
return true;
|
|
||||||
}).register();
|
|
||||||
public static final ButtonBinding DROP_ITEM = new Builder("drop_item").buttons(GLFW_GAMEPAD_BUTTON_B).onlyInGame().cooldown().register();
|
public static final ButtonBinding DROP_ITEM = new Builder("drop_item").buttons(GLFW_GAMEPAD_BUTTON_B).onlyInGame().cooldown().register();
|
||||||
public static final ButtonBinding FORWARD = new Builder("forward").buttons(axisAsButton(GLFW_GAMEPAD_AXIS_LEFT_Y, true))
|
public static final ButtonBinding FORWARD = new Builder("forward").buttons(axisAsButton(GLFW_GAMEPAD_AXIS_LEFT_Y, true))
|
||||||
.action(MovementHandler.HANDLER).onlyInGame().register();
|
.action(MovementHandler.HANDLER).onlyInGame().register();
|
||||||
@@ -63,8 +53,6 @@ public class ButtonBinding {
|
|||||||
public static final ButtonBinding HOTBAR_RIGHT = new Builder("hotbar_right").buttons(GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER)
|
public static final ButtonBinding HOTBAR_RIGHT = new Builder("hotbar_right").buttons(GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER)
|
||||||
.action(InputHandlers.handleHotbar(true)).onlyInGame().cooldown().register();
|
.action(InputHandlers.handleHotbar(true)).onlyInGame().cooldown().register();
|
||||||
public static final ButtonBinding INVENTORY = new Builder("inventory").buttons(GLFW_GAMEPAD_BUTTON_Y).onlyInGame().cooldown().register();
|
public static final ButtonBinding INVENTORY = new Builder("inventory").buttons(GLFW_GAMEPAD_BUTTON_Y).onlyInGame().cooldown().register();
|
||||||
public static final ButtonBinding EXIT = new Builder("exit").buttons(GLFW_GAMEPAD_BUTTON_B).filter((client, buttonBinding) -> client.currentScreen != null && buttonBinding.cooldown == 0 && INVENTORY.cooldown == 0)
|
|
||||||
.action(InputHandlers.handleExit()).cooldown().register();
|
|
||||||
public static final ButtonBinding JUMP = new Builder("jump").buttons(GLFW_GAMEPAD_BUTTON_A).onlyInGame().register();
|
public static final ButtonBinding JUMP = new Builder("jump").buttons(GLFW_GAMEPAD_BUTTON_A).onlyInGame().register();
|
||||||
public static final ButtonBinding LEFT = new Builder("left").buttons(axisAsButton(GLFW_GAMEPAD_AXIS_LEFT_X, false))
|
public static final ButtonBinding LEFT = new Builder("left").buttons(axisAsButton(GLFW_GAMEPAD_AXIS_LEFT_X, false))
|
||||||
.action(MovementHandler.HANDLER).onlyInGame().register();
|
.action(MovementHandler.HANDLER).onlyInGame().register();
|
||||||
@@ -75,8 +63,9 @@ public class ButtonBinding {
|
|||||||
.action(MovementHandler.HANDLER).onlyInGame().register();
|
.action(MovementHandler.HANDLER).onlyInGame().register();
|
||||||
public static final ButtonBinding SCREENSHOT = new Builder("screenshot").buttons(GLFW_GAMEPAD_BUTTON_DPAD_UP, GLFW_GAMEPAD_BUTTON_A)
|
public static final ButtonBinding SCREENSHOT = new Builder("screenshot").buttons(GLFW_GAMEPAD_BUTTON_DPAD_UP, GLFW_GAMEPAD_BUTTON_A)
|
||||||
.action(InputHandlers::handleScreenshot).cooldown().register();
|
.action(InputHandlers::handleScreenshot).cooldown().register();
|
||||||
|
|
||||||
public static final ButtonBinding DEBUG_SCREEN = new Builder("debug_screen").buttons(GLFW_GAMEPAD_BUTTON_DPAD_UP, GLFW_GAMEPAD_BUTTON_B)
|
public static final ButtonBinding DEBUG_SCREEN = new Builder("debug_screen").buttons(GLFW_GAMEPAD_BUTTON_DPAD_UP, GLFW_GAMEPAD_BUTTON_B)
|
||||||
.action((client,binding,value,action) -> {if (action == ButtonState.PRESS) client.inGameHud.getDebugHud().toggleDebugHud(); return true;}).cooldown().register();
|
.action((client,binding,value,action) -> {if (action == ButtonState.PRESS) client.options.debugEnabled = !client.options.debugEnabled; return true;}).cooldown().register();
|
||||||
public static final ButtonBinding SLOT_DOWN = new Builder("slot_down").buttons(GLFW_GAMEPAD_BUTTON_DPAD_DOWN)
|
public static final ButtonBinding SLOT_DOWN = new Builder("slot_down").buttons(GLFW_GAMEPAD_BUTTON_DPAD_DOWN)
|
||||||
.action(InputHandlers.handleInventorySlotPad(1)).onlyInInventory().cooldown().register();
|
.action(InputHandlers.handleInventorySlotPad(1)).onlyInInventory().cooldown().register();
|
||||||
public static final ButtonBinding SLOT_LEFT = new Builder("slot_left").buttons(GLFW_GAMEPAD_BUTTON_DPAD_LEFT)
|
public static final ButtonBinding SLOT_LEFT = new Builder("slot_left").buttons(GLFW_GAMEPAD_BUTTON_DPAD_LEFT)
|
||||||
@@ -85,19 +74,19 @@ public class ButtonBinding {
|
|||||||
.action(InputHandlers.handleInventorySlotPad(2)).onlyInInventory().cooldown().register();
|
.action(InputHandlers.handleInventorySlotPad(2)).onlyInInventory().cooldown().register();
|
||||||
public static final ButtonBinding SLOT_UP = new Builder("slot_up").buttons(GLFW_GAMEPAD_BUTTON_DPAD_UP)
|
public static final ButtonBinding SLOT_UP = new Builder("slot_up").buttons(GLFW_GAMEPAD_BUTTON_DPAD_UP)
|
||||||
.action(InputHandlers.handleInventorySlotPad(0)).onlyInInventory().cooldown().register();
|
.action(InputHandlers.handleInventorySlotPad(0)).onlyInInventory().cooldown().register();
|
||||||
|
public static final ButtonBinding SMOOTH_CAMERA = new Builder("toggle_smooth_camera").onlyInGame().cooldown().register();
|
||||||
public static final ButtonBinding SNEAK = new Builder("sneak").buttons(GLFW_GAMEPAD_BUTTON_RIGHT_THUMB)
|
public static final ButtonBinding SNEAK = new Builder("sneak").buttons(GLFW_GAMEPAD_BUTTON_RIGHT_THUMB)
|
||||||
.actions(InputHandlers::handleToggleSneak).onlyInGame().cooldown().register();
|
.actions(InputHandlers::handleToggleSneak).onlyInGame().cooldown().register();
|
||||||
public static final ButtonBinding SPRINT = new Builder("sprint").buttons(GLFW_GAMEPAD_BUTTON_LEFT_THUMB)
|
public static final ButtonBinding SPRINT = new Builder("sprint").buttons(GLFW_GAMEPAD_BUTTON_LEFT_THUMB).onlyInGame().register();
|
||||||
.actions(InputHandlers::handleToggleSprint).onlyInGame().cooldown().register();
|
|
||||||
public static final ButtonBinding SWAP_HANDS = new Builder("swap_hands").buttons(GLFW_GAMEPAD_BUTTON_X).onlyInGame().cooldown().register();
|
public static final ButtonBinding SWAP_HANDS = new Builder("swap_hands").buttons(GLFW_GAMEPAD_BUTTON_X).onlyInGame().cooldown().register();
|
||||||
public static final ButtonBinding TAB_LEFT = new Builder("tab_back").buttons(GLFW_GAMEPAD_BUTTON_LEFT_BUMPER)
|
public static final ButtonBinding TAB_LEFT = new Builder("tab_back").buttons(GLFW_GAMEPAD_BUTTON_LEFT_BUMPER)
|
||||||
.action(InputHandlers.handleHotbar(false)).filter(Predicates.or(InputHandlers::inInventory, InputHandlers::inAdvancements).or((client, binding) -> client.currentScreen != null)).cooldown().register();
|
.action(InputHandlers.handleHotbar(false)).filter(Predicates.or(InputHandlers::inInventory, InputHandlers::inAdvancements).or((client, binding) -> client.currentScreen != null && client.currentScreen.getClass().toString().contains("sodium"))).cooldown().register();
|
||||||
public static final ButtonBinding TAB_RIGHT = new Builder("tab_next").buttons(GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER)
|
public static final ButtonBinding TAB_RIGHT = new Builder("tab_next").buttons(GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER)
|
||||||
.action(InputHandlers.handleHotbar(true)).filter(Predicates.or(InputHandlers::inInventory, InputHandlers::inAdvancements).or((client, binding) -> client.currentScreen != null)).cooldown().register();
|
.action(InputHandlers.handleHotbar(true)).filter(Predicates.or(InputHandlers::inInventory, InputHandlers::inAdvancements).or((client, binding) -> client.currentScreen != null && client.currentScreen.getClass().toString().contains("sodium"))).cooldown().register();
|
||||||
public static final ButtonBinding PAGE_LEFT = new Builder("page_back").buttons(axisAsButton(GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, true))
|
public static final ButtonBinding PAGE_LEFT = new Builder("page_back").buttons(axisAsButton(GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, true))
|
||||||
.action(InputHandlers.handlePage(false)).filter(InputHandlers::inInventory).cooldown(30).register();
|
.action(InputHandlers.handlePage(false)).filter(InputHandlers::inInventory).cooldown().register();
|
||||||
public static final ButtonBinding PAGE_RIGHT = new Builder("page_next").buttons(axisAsButton(GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER, true))
|
public static final ButtonBinding PAGE_RIGHT = new Builder("page_next").buttons(axisAsButton(GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER, true))
|
||||||
.action(InputHandlers.handlePage(true)).filter(InputHandlers::inInventory).cooldown(30).register();
|
.action(InputHandlers.handlePage(true)).filter(InputHandlers::inInventory).cooldown().register();
|
||||||
public static final ButtonBinding TAKE = new Builder("take").buttons(GLFW_GAMEPAD_BUTTON_X)
|
public static final ButtonBinding TAKE = new Builder("take").buttons(GLFW_GAMEPAD_BUTTON_X)
|
||||||
.action(InputHandlers.handleActions()).filter(InputHandlers::inInventory).cooldown().register();
|
.action(InputHandlers.handleActions()).filter(InputHandlers::inInventory).cooldown().register();
|
||||||
public static final ButtonBinding TAKE_ALL = new Builder("take_all").buttons(GLFW_GAMEPAD_BUTTON_A)
|
public static final ButtonBinding TAKE_ALL = new Builder("take_all").buttons(GLFW_GAMEPAD_BUTTON_A)
|
||||||
@@ -115,34 +104,21 @@ public class ButtonBinding {
|
|||||||
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 boolean hasCooldown;
|
||||||
private int cooldownLength = 5;
|
|
||||||
private int cooldown = 0;
|
private int cooldown = 0;
|
||||||
boolean pressed = false;
|
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);
|
||||||
this.key = key;
|
this.key = key;
|
||||||
this.text = Text.translatable(this.key);
|
this.text = new TranslatableText(this.key);
|
||||||
this.filter = filter;
|
this.filter = filter;
|
||||||
this.actions.addAll(actions);
|
this.actions.addAll(actions);
|
||||||
this.hasCooldown = hasCooldown;
|
this.hasCooldown = hasCooldown;
|
||||||
}
|
}
|
||||||
public ButtonBinding(String key, int[] defaultButton, List<PressAction> actions, PairPredicate<MinecraftClient, ButtonBinding> filter, boolean hasCooldown, int cooldownLength) {
|
|
||||||
this.setButton(this.defaultButton = defaultButton);
|
|
||||||
this.key = key;
|
|
||||||
this.text = Text.translatable(this.key);
|
|
||||||
this.filter = filter;
|
|
||||||
this.actions.addAll(actions);
|
|
||||||
this.hasCooldown = hasCooldown;
|
|
||||||
this.cooldownLength = cooldownLength;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ButtonBinding(String key, int[] defaultButton, boolean hasCooldown) {
|
public ButtonBinding(String key, int[] defaultButton, boolean hasCooldown) {
|
||||||
this(key, defaultButton, Collections.emptyList(), Predicates.pairAlwaysTrue(), hasCooldown);
|
this(key, defaultButton, Collections.emptyList(), Predicates.pairAlwaysTrue(), hasCooldown);
|
||||||
}
|
}
|
||||||
public ButtonBinding(String key, int[] defaultButton, boolean hasCooldown, int cooldownLength) {
|
|
||||||
this(key, defaultButton, Collections.emptyList(), Predicates.pairAlwaysTrue(), hasCooldown, cooldownLength);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the button bound.
|
* Returns the button bound.
|
||||||
@@ -259,7 +235,7 @@ public class ButtonBinding {
|
|||||||
if (state == ButtonState.REPEAT && this.hasCooldown && this.cooldown != 0)
|
if (state == ButtonState.REPEAT && this.hasCooldown && this.cooldown != 0)
|
||||||
return;
|
return;
|
||||||
if (this.hasCooldown && state.isPressed()) {
|
if (this.hasCooldown && state.isPressed()) {
|
||||||
this.cooldown = cooldownLength;
|
this.cooldown = 5;
|
||||||
}
|
}
|
||||||
for (int i = this.actions.size() - 1; i >= 0; i--) {
|
for (int i = this.actions.size() - 1; i >= 0; i--) {
|
||||||
if (this.actions.get(i).press(client, this, value, state))
|
if (this.actions.get(i).press(client, this, value, state))
|
||||||
@@ -345,6 +321,7 @@ public class ButtonBinding {
|
|||||||
PLAYER_LIST.mcKeyBinding = options.playerListKey;
|
PLAYER_LIST.mcKeyBinding = options.playerListKey;
|
||||||
RIGHT.mcKeyBinding = options.rightKey;
|
RIGHT.mcKeyBinding = options.rightKey;
|
||||||
SCREENSHOT.mcKeyBinding = options.screenshotKey;
|
SCREENSHOT.mcKeyBinding = options.screenshotKey;
|
||||||
|
SMOOTH_CAMERA.mcKeyBinding = options.smoothCameraKey;
|
||||||
SNEAK.mcKeyBinding = options.sneakKey;
|
SNEAK.mcKeyBinding = options.sneakKey;
|
||||||
SPRINT.mcKeyBinding = options.sprintKey;
|
SPRINT.mcKeyBinding = options.sprintKey;
|
||||||
SWAP_HANDS.mcKeyBinding = options.swapHandsKey;
|
SWAP_HANDS.mcKeyBinding = options.swapHandsKey;
|
||||||
@@ -360,37 +337,37 @@ public class ButtonBinding {
|
|||||||
*/
|
*/
|
||||||
public static @NotNull Text getLocalizedButtonName(int button) {
|
public static @NotNull Text getLocalizedButtonName(int button) {
|
||||||
return switch (button % 500) {
|
return switch (button % 500) {
|
||||||
case -1 -> Text.translatable("key.keyboard.unknown");
|
case -1 -> new TranslatableText("key.keyboard.unknown");
|
||||||
case GLFW_GAMEPAD_BUTTON_A -> Text.translatable("midnightcontrols.button.a");
|
case GLFW_GAMEPAD_BUTTON_A -> new TranslatableText("midnightcontrols.button.a");
|
||||||
case GLFW_GAMEPAD_BUTTON_B -> Text.translatable("midnightcontrols.button.b");
|
case GLFW_GAMEPAD_BUTTON_B -> new TranslatableText("midnightcontrols.button.b");
|
||||||
case GLFW_GAMEPAD_BUTTON_X -> Text.translatable("midnightcontrols.button.x");
|
case GLFW_GAMEPAD_BUTTON_X -> new TranslatableText("midnightcontrols.button.x");
|
||||||
case GLFW_GAMEPAD_BUTTON_Y -> Text.translatable("midnightcontrols.button.y");
|
case GLFW_GAMEPAD_BUTTON_Y -> new TranslatableText("midnightcontrols.button.y");
|
||||||
case GLFW_GAMEPAD_BUTTON_LEFT_BUMPER -> Text.translatable("midnightcontrols.button.left_bumper");
|
case GLFW_GAMEPAD_BUTTON_LEFT_BUMPER -> new TranslatableText("midnightcontrols.button.left_bumper");
|
||||||
case GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER -> Text.translatable("midnightcontrols.button.right_bumper");
|
case GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER -> new TranslatableText("midnightcontrols.button.right_bumper");
|
||||||
case GLFW_GAMEPAD_BUTTON_BACK -> Text.translatable("midnightcontrols.button.back");
|
case GLFW_GAMEPAD_BUTTON_BACK -> new TranslatableText("midnightcontrols.button.back");
|
||||||
case GLFW_GAMEPAD_BUTTON_START -> Text.translatable("midnightcontrols.button.start");
|
case GLFW_GAMEPAD_BUTTON_START -> new TranslatableText("midnightcontrols.button.start");
|
||||||
case GLFW_GAMEPAD_BUTTON_GUIDE -> Text.translatable("midnightcontrols.button.guide");
|
case GLFW_GAMEPAD_BUTTON_GUIDE -> new TranslatableText("midnightcontrols.button.guide");
|
||||||
case GLFW_GAMEPAD_BUTTON_LEFT_THUMB -> Text.translatable("midnightcontrols.button.left_thumb");
|
case GLFW_GAMEPAD_BUTTON_LEFT_THUMB -> new TranslatableText("midnightcontrols.button.left_thumb");
|
||||||
case GLFW_GAMEPAD_BUTTON_RIGHT_THUMB -> Text.translatable("midnightcontrols.button.right_thumb");
|
case GLFW_GAMEPAD_BUTTON_RIGHT_THUMB -> new TranslatableText("midnightcontrols.button.right_thumb");
|
||||||
case GLFW_GAMEPAD_BUTTON_DPAD_UP -> Text.translatable("midnightcontrols.button.dpad_up");
|
case GLFW_GAMEPAD_BUTTON_DPAD_UP -> new TranslatableText("midnightcontrols.button.dpad_up");
|
||||||
case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT -> Text.translatable("midnightcontrols.button.dpad_right");
|
case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT -> new TranslatableText("midnightcontrols.button.dpad_right");
|
||||||
case GLFW_GAMEPAD_BUTTON_DPAD_DOWN -> Text.translatable("midnightcontrols.button.dpad_down");
|
case GLFW_GAMEPAD_BUTTON_DPAD_DOWN -> new TranslatableText("midnightcontrols.button.dpad_down");
|
||||||
case GLFW_GAMEPAD_BUTTON_DPAD_LEFT -> Text.translatable("midnightcontrols.button.dpad_left");
|
case GLFW_GAMEPAD_BUTTON_DPAD_LEFT -> new TranslatableText("midnightcontrols.button.dpad_left");
|
||||||
case 100 -> Text.translatable("midnightcontrols.axis.left_x+");
|
case 100 -> new TranslatableText("midnightcontrols.axis.left_x+");
|
||||||
case 101 -> Text.translatable("midnightcontrols.axis.left_y+");
|
case 101 -> new TranslatableText("midnightcontrols.axis.left_y+");
|
||||||
case 102 -> Text.translatable("midnightcontrols.axis.right_x+");
|
case 102 -> new TranslatableText("midnightcontrols.axis.right_x+");
|
||||||
case 103 -> Text.translatable("midnightcontrols.axis.right_y+");
|
case 103 -> new TranslatableText("midnightcontrols.axis.right_y+");
|
||||||
case 104 -> Text.translatable("midnightcontrols.axis.left_trigger");
|
case 104 -> new TranslatableText("midnightcontrols.axis.left_trigger");
|
||||||
case 105 -> Text.translatable("midnightcontrols.axis.right_trigger");
|
case 105 -> new TranslatableText("midnightcontrols.axis.right_trigger");
|
||||||
case 200 -> Text.translatable("midnightcontrols.axis.left_x-");
|
case 200 -> new TranslatableText("midnightcontrols.axis.left_x-");
|
||||||
case 201 -> Text.translatable("midnightcontrols.axis.left_y-");
|
case 201 -> new TranslatableText("midnightcontrols.axis.left_y-");
|
||||||
case 202 -> Text.translatable("midnightcontrols.axis.right_x-");
|
case 202 -> new TranslatableText("midnightcontrols.axis.right_x-");
|
||||||
case 203 -> Text.translatable("midnightcontrols.axis.right_y-");
|
case 203 -> new TranslatableText("midnightcontrols.axis.right_y-");
|
||||||
case 15 -> Text.translatable("midnightcontrols.button.l4");
|
case 15 -> new TranslatableText("midnightcontrols.button.l4");
|
||||||
case 16 -> Text.translatable("midnightcontrols.button.l5");
|
case 16 -> new TranslatableText("midnightcontrols.button.l5");
|
||||||
case 17 -> Text.translatable("midnightcontrols.button.r4");
|
case 17 -> new TranslatableText("midnightcontrols.button.r4");
|
||||||
case 18 -> Text.translatable("midnightcontrols.button.r5");
|
case 18 -> new TranslatableText("midnightcontrols.button.r5");
|
||||||
default -> Text.translatable("midnightcontrols.button.unknown", button);
|
default -> new TranslatableText("midnightcontrols.button.unknown", button);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -409,7 +386,6 @@ public class ButtonBinding {
|
|||||||
ButtonBinding.USE
|
ButtonBinding.USE
|
||||||
));
|
));
|
||||||
INVENTORY_CATEGORY = InputManager.registerDefaultCategory("key.categories.inventory", category -> category.registerAllBindings(
|
INVENTORY_CATEGORY = InputManager.registerDefaultCategory("key.categories.inventory", category -> category.registerAllBindings(
|
||||||
ButtonBinding.EXIT,
|
|
||||||
ButtonBinding.DROP_ITEM,
|
ButtonBinding.DROP_ITEM,
|
||||||
ButtonBinding.HOTBAR_LEFT,
|
ButtonBinding.HOTBAR_LEFT,
|
||||||
ButtonBinding.HOTBAR_RIGHT,
|
ButtonBinding.HOTBAR_RIGHT,
|
||||||
@@ -434,8 +410,7 @@ public class ButtonBinding {
|
|||||||
ButtonBinding.TOGGLE_PERSPECTIVE,
|
ButtonBinding.TOGGLE_PERSPECTIVE,
|
||||||
ButtonBinding.PAUSE_GAME,
|
ButtonBinding.PAUSE_GAME,
|
||||||
//SMOOTH_CAMERA,
|
//SMOOTH_CAMERA,
|
||||||
ButtonBinding.DEBUG_SCREEN,
|
ButtonBinding.DEBUG_SCREEN
|
||||||
ButtonBinding.CONTROLS_RING
|
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -464,7 +439,6 @@ public class ButtonBinding {
|
|||||||
private final List<PressAction> actions = new ArrayList<>();
|
private final List<PressAction> actions = new ArrayList<>();
|
||||||
private PairPredicate<MinecraftClient, ButtonBinding> filter = Predicates.pairAlwaysTrue();
|
private PairPredicate<MinecraftClient, ButtonBinding> filter = Predicates.pairAlwaysTrue();
|
||||||
private boolean cooldown = false;
|
private boolean cooldown = false;
|
||||||
private int cooldownLength = 5;
|
|
||||||
private ButtonCategory category = null;
|
private ButtonCategory category = null;
|
||||||
private KeyBinding mcBinding = null;
|
private KeyBinding mcBinding = null;
|
||||||
|
|
||||||
@@ -567,17 +541,6 @@ public class ButtonBinding {
|
|||||||
this.cooldown = cooldown;
|
this.cooldown = cooldown;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
* Sets the cooldown enabled with a custom duration for {@link ButtonBinding}.
|
|
||||||
*
|
|
||||||
* @param cooldownLength duration of {@link ButtonBinding} cooldown
|
|
||||||
* @return the builder instance
|
|
||||||
*/
|
|
||||||
public Builder cooldown(int cooldownLength) {
|
|
||||||
this.cooldownLength = cooldownLength;
|
|
||||||
this.cooldown = true;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Puts a cooldown on the {@link ButtonBinding}.
|
* Puts a cooldown on the {@link ButtonBinding}.
|
||||||
@@ -617,7 +580,7 @@ public class ButtonBinding {
|
|||||||
* @return the built {@link ButtonBinding}
|
* @return the built {@link ButtonBinding}
|
||||||
*/
|
*/
|
||||||
public ButtonBinding build() {
|
public ButtonBinding build() {
|
||||||
var binding = new ButtonBinding(this.key, this.buttons, this.actions, this.filter, this.cooldown, this.cooldownLength);
|
var binding = new ButtonBinding(this.key, this.buttons, this.actions, this.filter, this.cooldown);
|
||||||
if (this.category != null)
|
if (this.category != null)
|
||||||
this.category.registerBinding(binding);
|
this.category.registerBinding(binding);
|
||||||
if (this.mcBinding != null)
|
if (this.mcBinding != null)
|
||||||
|
|||||||
@@ -15,7 +15,9 @@ import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
|||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.resource.language.I18n;
|
import net.minecraft.client.resource.language.I18n;
|
||||||
import net.minecraft.client.toast.SystemToast;
|
import net.minecraft.client.toast.SystemToast;
|
||||||
|
import net.minecraft.text.LiteralText;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableText;
|
||||||
import org.aperlambda.lambdacommon.utils.Nameable;
|
import org.aperlambda.lambdacommon.utils.Nameable;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
@@ -32,7 +34,6 @@ import java.util.Comparator;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.concurrent.CompletableFuture;
|
|
||||||
|
|
||||||
import static org.lwjgl.BufferUtils.createByteBuffer;
|
import static org.lwjgl.BufferUtils.createByteBuffer;
|
||||||
|
|
||||||
@@ -80,7 +81,7 @@ public record Controller(int id) implements Nameable {
|
|||||||
* @return the controller's name
|
* @return the controller's name
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public @NotNull String getName() {
|
public String getName() {
|
||||||
var name = this.isGamepad() ? GLFW.glfwGetGamepadName(this.id) : GLFW.glfwGetJoystickName(this.id);
|
var name = this.isGamepad() ? GLFW.glfwGetGamepadName(this.id) : GLFW.glfwGetJoystickName(this.id);
|
||||||
return name == null ? String.valueOf(this.id()) : name;
|
return name == null ? String.valueOf(this.id()) : name;
|
||||||
}
|
}
|
||||||
@@ -146,22 +147,27 @@ public record Controller(int id) implements Nameable {
|
|||||||
* Updates the controller mappings.
|
* Updates the controller mappings.
|
||||||
*/
|
*/
|
||||||
public static void updateMappings() {
|
public static void updateMappings() {
|
||||||
CompletableFuture.supplyAsync(Controller::updateMappingsSync);
|
|
||||||
}
|
|
||||||
private static boolean updateMappingsSync() {
|
|
||||||
try {
|
try {
|
||||||
MidnightControlsClient.get().log("Updating controller mappings...");
|
MidnightControlsClient.get().log("Updating controller mappings...");
|
||||||
Optional<File> databaseFile = getDatabaseFile();
|
File databaseFile = new File("config/gamecontrollerdatabase.txt");
|
||||||
if (databaseFile.isPresent()) {
|
try {
|
||||||
var database = ioResourceToBuffer(databaseFile.get().getPath(), 1024);
|
BufferedInputStream in = new BufferedInputStream(new URL("https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt").openStream());
|
||||||
if (database != null) GLFW.glfwUpdateGamepadMappings(database);
|
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(databaseFile));
|
||||||
}
|
byte[] dataBuffer = new byte[1024];
|
||||||
|
int bytesRead;
|
||||||
|
while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) {
|
||||||
|
out.write(dataBuffer, 0, bytesRead);
|
||||||
|
}
|
||||||
|
out.close();
|
||||||
|
} catch (Exception ignored) {/* Just continue when internet connection is not available */}
|
||||||
|
var database = ioResourceToBuffer(databaseFile.getPath(), 1024);
|
||||||
|
if (database != null) GLFW.glfwUpdateGamepadMappings(database);
|
||||||
if (!MidnightControlsClient.MAPPINGS_FILE.exists())
|
if (!MidnightControlsClient.MAPPINGS_FILE.exists())
|
||||||
return false;
|
return;
|
||||||
var buffer = ioResourceToBuffer(MidnightControlsClient.MAPPINGS_FILE.getPath(), 1024);
|
var buffer = ioResourceToBuffer(MidnightControlsClient.MAPPINGS_FILE.getPath(), 1024);
|
||||||
if (buffer != null) GLFW.glfwUpdateGamepadMappings(buffer);
|
if (buffer != null) GLFW.glfwUpdateGamepadMappings(buffer);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.fillInStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
try (var memoryStack = MemoryStack.stackPush()) {
|
try (var memoryStack = MemoryStack.stackPush()) {
|
||||||
@@ -172,10 +178,10 @@ public record Controller(int id) implements Nameable {
|
|||||||
var string = l == 0L ? "" : MemoryUtil.memUTF8(l);
|
var string = l == 0L ? "" : MemoryUtil.memUTF8(l);
|
||||||
var client = MinecraftClient.getInstance();
|
var client = MinecraftClient.getInstance();
|
||||||
if (client != null) {
|
if (client != null) {
|
||||||
client.getToastManager().add(SystemToast.create(client, SystemToast.Type.PERIODIC_NOTIFICATION,
|
client.getToastManager().add(SystemToast.create(client, SystemToast.Type.TUTORIAL_HINT,
|
||||||
Text.translatable("midnightcontrols.controller.mappings.error"), Text.literal(string)));
|
new TranslatableText("midnightcontrols.controller.mappings.error"), new LiteralText(string)));
|
||||||
|
MidnightControls.get().log(I18n.translate("midnightcontrols.controller.mappings.error")+string);
|
||||||
}
|
}
|
||||||
MidnightControls.get().log(I18n.translate("midnightcontrols.controller.mappings.error")+string);
|
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
/* Ignored :concern: */
|
/* Ignored :concern: */
|
||||||
@@ -195,21 +201,5 @@ public record Controller(int id) implements Nameable {
|
|||||||
controller.isGamepad()));
|
controller.isGamepad()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Optional<File> getDatabaseFile() {
|
|
||||||
File databaseFile = new File("config/gamecontrollerdatabase.txt");
|
|
||||||
try {
|
|
||||||
BufferedInputStream in = new BufferedInputStream(new URL("https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt").openStream());
|
|
||||||
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(databaseFile));
|
|
||||||
byte[] dataBuffer = new byte[1024];
|
|
||||||
int bytesRead;
|
|
||||||
while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) {
|
|
||||||
out.write(dataBuffer, 0, bytesRead);
|
|
||||||
}
|
|
||||||
out.close();
|
|
||||||
} catch (Exception e) {return Optional.empty();}
|
|
||||||
return Optional.of(databaseFile);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,42 +9,41 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.controller;
|
package eu.midnightdust.midnightcontrols.client.controller;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import eu.midnightdust.lib.util.PlatformFunctions;
|
import eu.midnightdust.midnightcontrols.client.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.EMICompat;
|
||||||
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.SodiumCompat;
|
||||||
import eu.midnightdust.midnightcontrols.client.compat.YACLCompat;
|
import eu.midnightdust.midnightcontrols.client.mixin.AdvancementsScreenAccessor;
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.RingScreen;
|
import eu.midnightdust.midnightcontrols.client.mixin.CreativeInventoryScreenAccessor;
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay;
|
import eu.midnightdust.midnightcontrols.client.mixin.RecipeBookWidgetAccessor;
|
||||||
import eu.midnightdust.midnightcontrols.client.mixin.*;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor;
|
import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.util.MouseAccessor;
|
||||||
|
import net.fabricmc.fabric.impl.item.group.CreativeGuiExtensions;
|
||||||
import net.fabricmc.loader.api.FabricLoader;
|
import net.fabricmc.loader.api.FabricLoader;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.gui.screen.TitleScreen;
|
import net.minecraft.client.gl.Framebuffer;
|
||||||
|
import net.minecraft.client.gui.hud.DebugHud;
|
||||||
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.CreativeInventoryScreen;
|
||||||
import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget;
|
import net.minecraft.client.gui.screen.ingame.HandledScreen;
|
||||||
|
import net.minecraft.client.gui.screen.ingame.InventoryScreen;
|
||||||
import net.minecraft.client.gui.widget.PressableWidget;
|
import net.minecraft.client.gui.widget.PressableWidget;
|
||||||
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.ItemGroup;
|
||||||
import net.minecraft.item.ItemGroups;
|
import net.minecraft.item.Items;
|
||||||
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 org.aperlambda.lambdacommon.utils.Pair;
|
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.Comparator;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
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,90 +55,49 @@ 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) -> {
|
||||||
if (action == ButtonState.RELEASE)
|
if (action == ButtonState.RELEASE)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// When in-game
|
// When ingame
|
||||||
if (client.currentScreen == null && client.player != null) {
|
if (client.currentScreen == null && client.player != null) {
|
||||||
if (!client.player.isSpectator()) {
|
if (next)
|
||||||
if (next)
|
client.player.getInventory().selectedSlot = client.player.getInventory().selectedSlot == 8 ? 0 : client.player.getInventory().selectedSlot + 1;
|
||||||
client.player.getInventory().scrollInHotbar(-1.0);
|
else
|
||||||
else
|
client.player.getInventory().selectedSlot = client.player.getInventory().selectedSlot == 0 ? 8 : client.player.getInventory().selectedSlot - 1;
|
||||||
client.player.getInventory().scrollInHotbar(1.0);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (client.inGameHud.getSpectatorHud().isOpen()) {
|
|
||||||
client.inGameHud.getSpectatorHud().cycleSlot(next ? -1 : 1);
|
|
||||||
} else {
|
|
||||||
float g = MathHelper.clamp(client.player.getAbilities().getFlySpeed() + (next ? 1 : -1) * 0.005F, 0.0F, 0.2F);
|
|
||||||
client.player.getAbilities().setFlySpeed(g);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
} else if (client.currentScreen instanceof RingScreen) {
|
|
||||||
MidnightControlsClient.get().ring.cyclePage(next);
|
|
||||||
} else if (client.currentScreen instanceof CreativeInventoryScreenAccessor inventory) {
|
} else if (client.currentScreen instanceof CreativeInventoryScreenAccessor inventory) {
|
||||||
if (PlatformFunctions.isModLoaded("connectormod")) return true;
|
int currentTab = CreativeInventoryScreenAccessor.getSelectedTab();
|
||||||
ItemGroup currentTab = CreativeInventoryScreenAccessor.getSelectedTab();
|
int nextTab = currentTab + (next ? 1 : -1);
|
||||||
int currentColumn = currentTab.getColumn();
|
if (nextTab < 0)
|
||||||
ItemGroup.Row currentRow = currentTab.getRow();
|
nextTab = ItemGroup.GROUPS.length - 1;
|
||||||
ItemGroup newTab = null;
|
else if (nextTab >= ItemGroup.GROUPS.length)
|
||||||
List<ItemGroup> visibleTabs = getVisibleGroups((CreativeInventoryScreen) client.currentScreen);
|
nextTab = 0;
|
||||||
for (ItemGroup tab : visibleTabs) {
|
inventory.midnightcontrols$setSelectedTab(ItemGroup.GROUPS[nextTab]);
|
||||||
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 inventoryScreen) {
|
||||||
RecipeBookWidget recipeBook;
|
var recipeBook = (RecipeBookWidgetAccessor) inventoryScreen.getRecipeBookWidget();
|
||||||
if (client.currentScreen instanceof InventoryScreen inventoryScreen) recipeBook = inventoryScreen.getRecipeBookWidget();
|
var tabs = recipeBook.getTabButtons();
|
||||||
else if (client.currentScreen instanceof CraftingScreen craftingScreen) recipeBook = craftingScreen.getRecipeBookWidget();
|
var currentTab = recipeBook.getCurrentTab();
|
||||||
else recipeBook = ((AbstractFurnaceScreen<?>)client.currentScreen).getRecipeBookWidget();
|
if (currentTab == null)
|
||||||
var recipeBookAccessor = (RecipeBookWidgetAccessor) recipeBook;
|
|
||||||
var tabs = recipeBookAccessor.getTabButtons();
|
|
||||||
var currentTab = recipeBookAccessor.getCurrentTab();
|
|
||||||
if (currentTab == null || !recipeBook.isOpen()) {
|
|
||||||
if (MidnightControlsCompat.isInventoryTabsPresent()) InventoryTabsCompat.handleInventoryTabs(client.currentScreen, next);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
int nextTab = tabs.indexOf(currentTab) + (next ? 1 : -1);
|
int nextTab = tabs.indexOf(currentTab) + (next ? 1 : -1);
|
||||||
if (nextTab < 0)
|
if (nextTab < 0)
|
||||||
nextTab = tabs.size() - 1;
|
nextTab = tabs.size() - 1;
|
||||||
else if (nextTab >= tabs.size())
|
else if (nextTab >= tabs.size())
|
||||||
nextTab = 0;
|
nextTab = 0;
|
||||||
currentTab.setToggled(false);
|
currentTab.setToggled(false);
|
||||||
recipeBookAccessor.setCurrentTab(currentTab = tabs.get(nextTab));
|
recipeBook.setCurrentTab(currentTab = tabs.get(nextTab));
|
||||||
currentTab.setToggled(true);
|
currentTab.setToggled(true);
|
||||||
recipeBookAccessor.midnightcontrols$refreshResults(true);
|
recipeBook.midnightcontrols$refreshResults(true);
|
||||||
return true;
|
return true;
|
||||||
} else if (client.currentScreen instanceof AdvancementsScreenAccessor screen) {
|
} else if (client.currentScreen instanceof AdvancementsScreenAccessor screen) {
|
||||||
var tabs = screen.getTabs().values().stream().distinct().toList();
|
var tabs = screen.getTabs().values().stream().distinct().collect(Collectors.toList());
|
||||||
var tab = screen.getSelectedTab();
|
var tab = screen.getSelectedTab();
|
||||||
if (tab == null)
|
if (tab == null)
|
||||||
return false;
|
return false;
|
||||||
@@ -150,68 +108,45 @@ public class InputHandlers {
|
|||||||
nextTab = tabs.size() - 1;
|
nextTab = tabs.size() - 1;
|
||||||
else if (nextTab >= tabs.size())
|
else if (nextTab >= tabs.size())
|
||||||
nextTab = 0;
|
nextTab = 0;
|
||||||
screen.getAdvancementManager().selectTab(tabs.get(nextTab).getRoot().getAdvancementEntry(), true);
|
screen.getAdvancementManager().selectTab(tabs.get(nextTab).getRoot(), true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} else if (client.currentScreen != null && client.currentScreen.children().stream().anyMatch(e -> e instanceof TabNavigationWidget)) {
|
} else if (FabricLoader.getInstance().isModLoaded("sodium")) SodiumCompat.handleTabs(client.currentScreen, next);
|
||||||
return Lists.newCopyOnWriteArrayList(client.currentScreen.children()).stream().anyMatch(e -> {
|
|
||||||
if (e instanceof TabNavigationWidget tabs) {
|
|
||||||
TabNavigationWidgetAccessor accessor = (TabNavigationWidgetAccessor) tabs;
|
|
||||||
int tabIndex = accessor.getTabs().indexOf(accessor.getTabManager().getCurrentTab());
|
|
||||||
if (next ? tabIndex+1 < accessor.getTabs().size() : tabIndex > 0) {
|
|
||||||
if (next) tabs.selectTab(tabIndex + 1, true);
|
|
||||||
else tabs.selectTab(tabIndex - 1, true);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
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)
|
|
||||||
return false;
|
|
||||||
if (client.currentScreen instanceof CreativeInventoryScreen) {
|
if (client.currentScreen instanceof CreativeInventoryScreen) {
|
||||||
|
var screen = (HandledScreenAccessor) client.currentScreen;
|
||||||
try {
|
try {
|
||||||
return client.currentScreen.children().stream().filter(element -> element instanceof PressableWidget)
|
if (next) {
|
||||||
.map(element -> (PressableWidget) element)
|
return client.currentScreen.children().stream().filter(element -> element instanceof PressableWidget)
|
||||||
.filter(element -> element.getMessage() != null && element.getMessage().getContent() != null)
|
.map(element -> (PressableWidget) element)
|
||||||
.anyMatch(element -> {
|
.filter(element -> element.getMessage() != null)
|
||||||
if (next && element.getMessage().getString().equals(">")) {
|
.anyMatch(element -> {
|
||||||
element.onPress();
|
if (element.getMessage().getString().equals(">")) {
|
||||||
return true;
|
element.onPress();
|
||||||
} else if (element.getMessage().getString().equals("<")) {
|
return true;
|
||||||
element.onPress();
|
}
|
||||||
return true;
|
return false;
|
||||||
}
|
});
|
||||||
return false;
|
} else {
|
||||||
});
|
return client.currentScreen.children().stream().filter(element -> element instanceof PressableWidget)
|
||||||
|
.map(element -> (PressableWidget) element)
|
||||||
|
.filter(element -> element.getMessage() != null)
|
||||||
|
.anyMatch(element -> {
|
||||||
|
if (element.getMessage().getString().equals("<")) {
|
||||||
|
element.onPress();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
} catch (Exception ignored) {}
|
} catch (Exception ignored) {}
|
||||||
}
|
}
|
||||||
if (MidnightControlsCompat.isInventoryTabsPresent()) InventoryTabsCompat.handleInventoryPage(client.currentScreen, next);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
public static PressAction handleExit() {
|
|
||||||
return (client, button, value, action) -> {
|
|
||||||
if (client.currentScreen != null && client.currentScreen.getClass() != TitleScreen.class) {
|
|
||||||
if (!MidnightControlsCompat.handleMenuBack(client, client.currentScreen))
|
|
||||||
if (!MidnightControlsClient.get().input.tryGoBack(client.currentScreen))
|
|
||||||
client.currentScreen.close();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -244,21 +179,23 @@ public class InputHandlers {
|
|||||||
|
|
||||||
MidnightControlsClient.get().input.inventoryInteractionCooldown = 5;
|
MidnightControlsClient.get().input.inventoryInteractionCooldown = 5;
|
||||||
switch (button.getName()) {
|
switch (button.getName()) {
|
||||||
case "take_all" -> {
|
case "take_all": {
|
||||||
if (screen instanceof CreativeInventoryScreen) {
|
if (screen instanceof CreativeInventoryScreen) {
|
||||||
if (slot != null && (((CreativeInventoryScreenAccessor) accessor).midnightcontrols$isCreativeInventorySlot(slot) || MidnightControlsCompat.streamCompatHandlers().anyMatch(handler -> handler.isCreativeSlot(screen, slot))))
|
if (slot != null && (((CreativeInventoryScreenAccessor) accessor).midnightcontrols$isCreativeInventorySlot(slot) || MidnightControlsCompat.streamCompatHandlers().anyMatch(handler -> handler.isCreativeSlot(screen, slot))))
|
||||||
actionType = SlotActionType.CLONE;
|
actionType = SlotActionType.CLONE;
|
||||||
}
|
|
||||||
}
|
|
||||||
case "take" -> {
|
|
||||||
clickData = GLFW_MOUSE_BUTTON_2;
|
|
||||||
}
|
|
||||||
case "quick_move" -> {
|
|
||||||
actionType = SlotActionType.QUICK_MOVE;
|
|
||||||
}
|
|
||||||
default -> {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "take": {
|
||||||
|
clickData = GLFW_MOUSE_BUTTON_2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "quick_move": {
|
||||||
|
actionType = SlotActionType.QUICK_MOVE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
accessor.midnightcontrols$onMouseClick(slot, slotId, clickData, actionType);
|
accessor.midnightcontrols$onMouseClick(slot, slotId, clickData, actionType);
|
||||||
return true;
|
return true;
|
||||||
@@ -268,8 +205,8 @@ public class InputHandlers {
|
|||||||
public static boolean handlePauseGame(@NotNull MinecraftClient client, @NotNull ButtonBinding binding, float value, @NotNull ButtonState action) {
|
public static boolean handlePauseGame(@NotNull MinecraftClient client, @NotNull ButtonBinding binding, float value, @NotNull ButtonState action) {
|
||||||
if (action == ButtonState.PRESS) {
|
if (action == ButtonState.PRESS) {
|
||||||
// If in game, then pause the game.
|
// If in game, then pause the game.
|
||||||
if (client.currentScreen == null || client.currentScreen instanceof RingScreen)
|
if (client.currentScreen == null)
|
||||||
client.openGameMenu(false);
|
client.openPauseMenu(false);
|
||||||
else if (client.currentScreen instanceof HandledScreen && client.player != null) // If the current screen is a container then close it.
|
else if (client.currentScreen instanceof HandledScreen && client.player != null) // If the current screen is a container then close it.
|
||||||
client.player.closeHandledScreen();
|
client.player.closeHandledScreen();
|
||||||
else // Else just close the current screen.
|
else // Else just close the current screen.
|
||||||
@@ -295,31 +232,12 @@ 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 -> {
|
button.asKeyBinding().ifPresent(binding -> {
|
||||||
boolean sneakToggled = client.options.getSneakToggled().getValue();
|
boolean sneakToggled = client.options.sneakToggled;
|
||||||
if (client.player.getAbilities().flying && sneakToggled)
|
if (client.player.getAbilities().flying && sneakToggled)
|
||||||
client.options.getSneakToggled().setValue(false);
|
client.options.sneakToggled = false;
|
||||||
else if (MidnightControlsConfig.controllerToggleSneak != sneakToggled)
|
|
||||||
client.options.getSneakToggled().setValue(!sneakToggled);
|
|
||||||
binding.setPressed(button.pressed);
|
binding.setPressed(button.pressed);
|
||||||
if (client.player.getAbilities().flying && sneakToggled)
|
if (client.player.getAbilities().flying && sneakToggled)
|
||||||
client.options.getSneakToggled().setValue(true);
|
client.options.sneakToggled = 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) {
|
|
||||||
button.asKeyBinding().ifPresent(binding -> {
|
|
||||||
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;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -410,7 +328,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.get().input.screenCloseCooldown <= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -10,14 +10,13 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.controller;
|
package eu.midnightdust.midnightcontrols.client.controller;
|
||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.ControlsMode;
|
import eu.midnightdust.midnightcontrols.ControlsMode;
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.ButtonState;
|
import eu.midnightdust.midnightcontrols.client.ButtonState;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
import eu.midnightdust.midnightcontrols.client.mixin.MouseAccessor;
|
import eu.midnightdust.midnightcontrols.client.util.MouseAccessor;
|
||||||
import it.unimi.dsi.fastutil.ints.*;
|
import it.unimi.dsi.fastutil.ints.*;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
||||||
import net.minecraft.client.MinecraftClient;
|
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.util.InputUtil;
|
import net.minecraft.client.util.InputUtil;
|
||||||
import net.minecraft.util.math.MathHelper;
|
import net.minecraft.util.math.MathHelper;
|
||||||
import org.aperlambda.lambdacommon.Identifier;
|
import org.aperlambda.lambdacommon.Identifier;
|
||||||
@@ -27,6 +26,7 @@ import org.lwjgl.glfw.GLFW;
|
|||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -73,8 +73,8 @@ public class InputManager {
|
|||||||
public void updateMousePosition(@NotNull MinecraftClient client) {
|
public void updateMousePosition(@NotNull MinecraftClient client) {
|
||||||
Objects.requireNonNull(client, "Client instance cannot be null.");
|
Objects.requireNonNull(client, "Client instance cannot be null.");
|
||||||
if (this.prevTargetMouseX != this.targetMouseX || this.prevTargetMouseY != this.targetMouseY) {
|
if (this.prevTargetMouseX != this.targetMouseX || this.prevTargetMouseY != this.targetMouseY) {
|
||||||
double mouseX = this.prevTargetMouseX + (this.targetMouseX - this.prevTargetMouseX) * client.getRenderTickCounter().getTickDelta(true) + 0.5;
|
double mouseX = this.prevTargetMouseX + (this.targetMouseX - this.prevTargetMouseX) * client.getTickDelta() + 0.5;
|
||||||
double mouseY = this.prevTargetMouseY + (this.targetMouseY - this.prevTargetMouseY) * client.getRenderTickCounter().getTickDelta(true) + 0.5;
|
double mouseY = this.prevTargetMouseY + (this.targetMouseY - this.prevTargetMouseY) * client.getTickDelta() + 0.5;
|
||||||
if (!MidnightControlsConfig.virtualMouse)
|
if (!MidnightControlsConfig.virtualMouse)
|
||||||
GLFW.glfwSetCursorPos(client.getWindow().getHandle(), mouseX, mouseY);
|
GLFW.glfwSetCursorPos(client.getWindow().getHandle(), mouseX, mouseY);
|
||||||
((MouseAccessor) client.mouse).midnightcontrols$onCursorPos(client.getWindow().getHandle(), mouseX, mouseY);
|
((MouseAccessor) client.mouse).midnightcontrols$onCursorPos(client.getWindow().getHandle(), mouseX, mouseY);
|
||||||
@@ -128,29 +128,6 @@ public class InputManager {
|
|||||||
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.getName());
|
||||||
}
|
}
|
||||||
private static ButtonBinding tempBinding;
|
|
||||||
/**
|
|
||||||
* Returns the binding matching the given string.
|
|
||||||
*
|
|
||||||
* @param name the name of the binding to get
|
|
||||||
* @return true if the binding is registered, else false
|
|
||||||
*/
|
|
||||||
public static ButtonBinding getBinding(@NotNull String name) {
|
|
||||||
if (BINDINGS.parallelStream().map(ButtonBinding::getName).anyMatch(binding -> binding.equalsIgnoreCase(name)))
|
|
||||||
BINDINGS.forEach(binding -> {
|
|
||||||
if (binding.getName().equalsIgnoreCase(name)) InputManager.tempBinding = binding;
|
|
||||||
});
|
|
||||||
return tempBinding;
|
|
||||||
}
|
|
||||||
private static List<ButtonBinding> unboundBindings;
|
|
||||||
public static List<ButtonBinding> getUnboundBindings() {
|
|
||||||
unboundBindings = new ArrayList<>();
|
|
||||||
BINDINGS.forEach(binding -> {
|
|
||||||
if (binding.isNotBound() && !MidnightControlsConfig.ignoredUnboundKeys.contains(binding.getTranslationKey())) unboundBindings.add(binding);
|
|
||||||
});
|
|
||||||
unboundBindings.sort(Comparator.comparing(s -> I18n.translate(s.getTranslationKey())));
|
|
||||||
return unboundBindings;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers a button binding.
|
* Registers a button binding.
|
||||||
|
|||||||
@@ -9,23 +9,22 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.controller;
|
package eu.midnightdust.midnightcontrols.client.controller;
|
||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.ButtonState;
|
import eu.midnightdust.midnightcontrols.client.ButtonState;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
import eu.midnightdust.midnightcontrols.client.util.MathUtil;
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
|
import net.minecraft.client.input.Input;
|
||||||
import net.minecraft.client.network.ClientPlayerEntity;
|
import net.minecraft.client.network.ClientPlayerEntity;
|
||||||
import net.minecraft.enchantment.Enchantment;
|
import net.minecraft.client.tutorial.MovementTutorialStepHandler;
|
||||||
|
import net.minecraft.client.util.InputUtil;
|
||||||
import net.minecraft.enchantment.EnchantmentHelper;
|
import net.minecraft.enchantment.EnchantmentHelper;
|
||||||
import net.minecraft.entity.LivingEntity;
|
import net.minecraft.enchantment.Enchantments;
|
||||||
import net.minecraft.entity.attribute.EntityAttributes;
|
import net.minecraft.enchantment.SoulSpeedEnchantment;
|
||||||
import net.minecraft.entity.damage.DamageSource;
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.nbt.NbtList;
|
||||||
import net.minecraft.predicate.entity.MovementPredicate;
|
import net.minecraft.nbt.scanner.SimpleNbtScanner;
|
||||||
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.
|
||||||
@@ -41,10 +40,8 @@ public final class MovementHandler implements PressAction {
|
|||||||
private boolean pressingBack = false;
|
private boolean pressingBack = false;
|
||||||
private boolean pressingLeft = false;
|
private boolean pressingLeft = false;
|
||||||
private boolean pressingRight = false;
|
private boolean pressingRight = false;
|
||||||
private float slowdownFactor = 1.f;
|
|
||||||
private float movementForward = 0.f;
|
private float movementForward = 0.f;
|
||||||
private float movementSideways = 0.f;
|
private float movementSideways = 0.f;
|
||||||
private final MathUtil.PolarUtil polarUtil = new MathUtil.PolarUtil();
|
|
||||||
|
|
||||||
private MovementHandler() {
|
private MovementHandler() {
|
||||||
}
|
}
|
||||||
@@ -61,11 +58,8 @@ public final class MovementHandler implements PressAction {
|
|||||||
player.input.pressingBack = this.pressingBack;
|
player.input.pressingBack = this.pressingBack;
|
||||||
player.input.pressingLeft = this.pressingLeft;
|
player.input.pressingLeft = this.pressingLeft;
|
||||||
player.input.pressingRight = this.pressingRight;
|
player.input.pressingRight = this.pressingRight;
|
||||||
|
player.input.movementForward = this.movementForward;
|
||||||
polarUtil.calculate(this.movementSideways, this.movementForward, this.slowdownFactor);
|
player.input.movementSideways = this.movementSideways;
|
||||||
player.input.movementForward = polarUtil.polarY;
|
|
||||||
player.input.movementSideways = polarUtil.polarX;
|
|
||||||
|
|
||||||
this.shouldOverrideMovement = false;
|
this.shouldOverrideMovement = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,26 +79,30 @@ public final class MovementHandler implements PressAction {
|
|||||||
|
|
||||||
this.shouldOverrideMovement = direction != 0;
|
this.shouldOverrideMovement = direction != 0;
|
||||||
|
|
||||||
if (!MidnightControlsConfig.analogMovement) {
|
if (MidnightControlsConfig.analogMovement) {
|
||||||
value = 1.f;
|
value = (float) Math.pow(value, 2);
|
||||||
}
|
} else value = 1.f;
|
||||||
|
|
||||||
this.slowdownFactor = client.player.shouldSlowDown() ? (MathHelper.clamp(
|
|
||||||
0.3F + (float) client.player.getAttributeValue(EntityAttributes.PLAYER_SNEAKING_SPEED),
|
|
||||||
0.0F,
|
|
||||||
1.0F
|
|
||||||
)) : 1.f;
|
|
||||||
|
|
||||||
if (button == ButtonBinding.FORWARD || button == ButtonBinding.BACK) {
|
if (button == ButtonBinding.FORWARD || button == ButtonBinding.BACK) {
|
||||||
// Handle forward movement.
|
// Handle forward movement.
|
||||||
this.pressingForward = direction > 0;
|
this.pressingForward = direction > 0;
|
||||||
this.pressingBack = direction < 0;
|
this.pressingBack = direction < 0;
|
||||||
this.movementForward = direction * value;
|
this.movementForward = direction * value;
|
||||||
|
|
||||||
|
// Slowing down if sneaking or crawling.
|
||||||
|
if (client.player.shouldSlowDown()) {
|
||||||
|
this.movementForward *= MathHelper.clamp(0.3F, 0.0F, 1.0F);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// Handle sideways movement.
|
// Handle sideways movement.
|
||||||
this.pressingLeft = direction > 0;
|
this.pressingLeft = direction > 0;
|
||||||
this.pressingRight = direction < 0;
|
this.pressingRight = direction < 0;
|
||||||
this.movementSideways = direction * value;
|
this.movementSideways = direction * value;
|
||||||
|
|
||||||
|
// Slowing down if sneaking or crawling.
|
||||||
|
if (client.player.shouldSlowDown()) {
|
||||||
|
this.movementSideways *= MathHelper.clamp(0.3F, 0.0F, 1.0F);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.shouldOverrideMovement;
|
return this.shouldOverrideMovement;
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.controller;
|
package eu.midnightdust.midnightcontrols.client.controller;
|
||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.ButtonState;
|
import eu.midnightdust.midnightcontrols.client.ButtonState;
|
||||||
import eu.midnightdust.midnightcontrols.client.util.KeyBindingAccessor;
|
import eu.midnightdust.midnightcontrols.client.util.KeyBindingAccessor;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.option.StickyKeyBinding;
|
import net.minecraft.client.option.StickyKeyBinding;
|
||||||
|
|||||||
@@ -1,17 +0,0 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.enums;
|
|
||||||
|
|
||||||
import net.minecraft.text.Text;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
public enum CameraMode {
|
|
||||||
FLAT, ADAPTIVE;
|
|
||||||
public Text getTranslatedText() {
|
|
||||||
return Text.translatable("midnightcontrols.midnightconfig.enum."+this.getClass().getSimpleName()+"."+this.name());
|
|
||||||
}
|
|
||||||
public @NotNull CameraMode next() {
|
|
||||||
var v = values();
|
|
||||||
if (v.length == this.ordinal() + 1)
|
|
||||||
return v[0];
|
|
||||||
return v[this.ordinal() + 1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.enums;
|
|
||||||
|
|
||||||
import net.minecraft.text.Text;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
public enum TouchMode {
|
|
||||||
CROSSHAIR, FINGER_POS;
|
|
||||||
public Text getTranslatedText() {
|
|
||||||
return Text.translatable("midnightcontrols.midnightconfig.enum."+this.getClass().getSimpleName()+"."+this.name());
|
|
||||||
}
|
|
||||||
public @NotNull TouchMode next() {
|
|
||||||
var v = values();
|
|
||||||
if (v.length == this.ordinal() + 1)
|
|
||||||
return v[0];
|
|
||||||
return v[this.ordinal() + 1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -11,12 +11,14 @@ 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 org.thinkingstudio.obsidianui.Position;
|
import dev.lambdaurora.spruceui.Position;
|
||||||
import org.thinkingstudio.obsidianui.option.SpruceOption;
|
import dev.lambdaurora.spruceui.option.SpruceOption;
|
||||||
import org.thinkingstudio.obsidianui.widget.container.SpruceContainerWidget;
|
import dev.lambdaurora.spruceui.widget.container.SpruceContainerWidget;
|
||||||
import org.thinkingstudio.obsidianui.widget.text.SpruceTextAreaWidget;
|
import dev.lambdaurora.spruceui.widget.text.SpruceTextAreaWidget;
|
||||||
import net.minecraft.client.toast.SystemToast;
|
import net.minecraft.client.toast.SystemToast;
|
||||||
|
import net.minecraft.text.LiteralText;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableText;
|
||||||
|
|
||||||
import java.io.FileWriter;
|
import java.io.FileWriter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -63,8 +65,8 @@ public class MappingsStringInputWidget extends SpruceContainerWidget {
|
|||||||
fw.close();
|
fw.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
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.TUTORIAL_HINT,
|
||||||
Text.translatable("midnightcontrols.controller.mappings.error.write"), Text.empty()));
|
new TranslatableText("midnightcontrols.controller.mappings.error.write"), Text.of("")));
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -89,7 +91,7 @@ public class MappingsStringInputWidget extends SpruceContainerWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int textFieldWidth = (int) (this.width * (5.0 / 6.0));
|
int textFieldWidth = (int) (this.width * (5.0 / 6.0));
|
||||||
this.textArea = new SpruceTextAreaWidget(Position.of(this, this.width / 2 - textFieldWidth / 2, 0), textFieldWidth, this.height - 50, Text.literal(mappings));
|
this.textArea = new SpruceTextAreaWidget(Position.of(this, this.width / 2 - textFieldWidth / 2, 0), textFieldWidth, this.height - 50, new LiteralText(mappings));
|
||||||
this.textArea.setText(mappings);
|
this.textArea.setText(mappings);
|
||||||
// Display as many lines as possible
|
// Display as many lines as possible
|
||||||
this.textArea.setDisplayedLines(this.textArea.getInnerHeight() / this.client.textRenderer.fontHeight);
|
this.textArea.setDisplayedLines(this.textArea.getInnerHeight() / this.client.textRenderer.fontHeight);
|
||||||
|
|||||||
@@ -11,14 +11,14 @@ package eu.midnightdust.midnightcontrols.client.gui;
|
|||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.ControlsMode;
|
import eu.midnightdust.midnightcontrols.ControlsMode;
|
||||||
import eu.midnightdust.midnightcontrols.MidnightControlsConstants;
|
import eu.midnightdust.midnightcontrols.MidnightControlsConstants;
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.HudSide;
|
import eu.midnightdust.midnightcontrols.client.HudSide;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.MidnightInput;
|
||||||
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;
|
||||||
import org.thinkingstudio.obsidianui.hud.Hud;
|
import dev.lambdaurora.spruceui.hud.Hud;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.gui.DrawContext;
|
|
||||||
import net.minecraft.client.resource.language.I18n;
|
import net.minecraft.client.resource.language.I18n;
|
||||||
import net.minecraft.client.util.math.MatrixStack;
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
import net.minecraft.item.BlockItem;
|
import net.minecraft.item.BlockItem;
|
||||||
@@ -38,7 +38,7 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
*/
|
*/
|
||||||
public class MidnightControlsHud extends Hud {
|
public class MidnightControlsHud extends Hud {
|
||||||
private final MidnightControlsClient mod;
|
private final MidnightControlsClient mod;
|
||||||
private final MinecraftClient client = MinecraftClient.getInstance();
|
private MinecraftClient client;
|
||||||
private int attackWidth = 0;
|
private int attackWidth = 0;
|
||||||
private int attackButtonWidth = 0;
|
private int attackButtonWidth = 0;
|
||||||
private int dropItemWidth = 0;
|
private int dropItemWidth = 0;
|
||||||
@@ -47,23 +47,23 @@ public class MidnightControlsHud extends Hud {
|
|||||||
private int inventoryButtonWidth = 0;
|
private int inventoryButtonWidth = 0;
|
||||||
private int swapHandsWidth = 0;
|
private int swapHandsWidth = 0;
|
||||||
private int swapHandsButtonWidth = 0;
|
private int swapHandsButtonWidth = 0;
|
||||||
private boolean showSwapHandsAction = false;
|
|
||||||
private int useWidth = 0;
|
private int useWidth = 0;
|
||||||
private int useButtonWidth = 0;
|
private int useButtonWidth = 0;
|
||||||
private BlockHitResult placeHitResult;
|
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 float scale = 1f;
|
||||||
|
|
||||||
public MidnightControlsHud(@NotNull MidnightControlsClient mod) {
|
public MidnightControlsHud(@NotNull MidnightControlsClient mod) {
|
||||||
super(Identifier.of(MidnightControlsConstants.NAMESPACE, "hud/button_indicator"));
|
super(new Identifier(MidnightControlsConstants.NAMESPACE, "hud/button_indicator"));
|
||||||
this.mod = mod;
|
this.mod = mod;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init(@NotNull MinecraftClient client, int screenWidth, int screenHeight) {
|
public void init(@NotNull MinecraftClient client, int screenWidth, int screenHeight) {
|
||||||
super.init(client, screenWidth, screenHeight);
|
super.init(client, screenWidth, screenHeight);
|
||||||
|
this.client = client;
|
||||||
this.inventoryWidth = this.width(ButtonBinding.INVENTORY);
|
this.inventoryWidth = this.width(ButtonBinding.INVENTORY);
|
||||||
this.inventoryButtonWidth = MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.INVENTORY);
|
this.inventoryButtonWidth = MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.INVENTORY);
|
||||||
this.swapHandsWidth = this.width(ButtonBinding.SWAP_HANDS);
|
this.swapHandsWidth = this.width(ButtonBinding.SWAP_HANDS);
|
||||||
@@ -72,24 +72,26 @@ public class MidnightControlsHud extends Hud {
|
|||||||
this.dropItemButtonWidth = MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.DROP_ITEM);
|
this.dropItemButtonWidth = MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.DROP_ITEM);
|
||||||
this.attackButtonWidth = MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.ATTACK);
|
this.attackButtonWidth = MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.ATTACK);
|
||||||
this.useButtonWidth = MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.USE);
|
this.useButtonWidth = MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.USE);
|
||||||
|
if (client.options.guiScale >= 4) {
|
||||||
|
scale = 0.75f;
|
||||||
|
} else scale = 1f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Renders the MidnightControls HUD.
|
* Renders the midnightcontrols' HUD.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void render(DrawContext context, float tickDelta) {
|
public void render(MatrixStack matrices, float tickDelta) {
|
||||||
if (this.client == null) return;
|
if (this.client == null) return;
|
||||||
if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && this.client.currentScreen == null) {
|
if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && this.client.currentScreen == null) {
|
||||||
isCrammed = client.getWindow().getScaledWidth() < 520;
|
|
||||||
int y = bottom(2);
|
int y = bottom(2);
|
||||||
MatrixStack matrices = context.getMatrices();
|
|
||||||
matrices.push();
|
matrices.push();
|
||||||
this.renderFirstIcons(context, MidnightControlsConfig.hudSide == HudSide.LEFT ? 2 : client.getWindow().getScaledWidth() - 2, y);
|
if (scale != 1f) matrices.scale(scale,scale,scale);
|
||||||
this.renderSecondIcons(context, MidnightControlsConfig.hudSide == HudSide.RIGHT ? 2 : client.getWindow().getScaledWidth() - 2, y);
|
this.renderFirstIcons(matrices, MidnightControlsConfig.hudSide == HudSide.LEFT ? 2 : (int) ((client.getWindow().getScaledWidth() - 2) * (1 / scale)), y);
|
||||||
this.renderFirstSection(context, MidnightControlsConfig.hudSide == HudSide.LEFT ? 2 : client.getWindow().getScaledWidth() - 2, y);
|
this.renderSecondIcons(matrices, MidnightControlsConfig.hudSide == HudSide.RIGHT ? 2 : (int) ((client.getWindow().getScaledWidth() - 2) * (1 / scale)), y);
|
||||||
this.renderSecondSection(context, MidnightControlsConfig.hudSide == HudSide.RIGHT ? 2 : client.getWindow().getScaledWidth() - 2, y);
|
this.renderFirstSection(matrices, MidnightControlsConfig.hudSide == HudSide.LEFT ? 2 : (int) ((client.getWindow().getScaledWidth() - 2) * (1 / scale)), y);
|
||||||
|
this.renderSecondSection(matrices, MidnightControlsConfig.hudSide == HudSide.RIGHT ? 2 : (int) ((client.getWindow().getScaledWidth() - 2) * (1 / scale)), y);
|
||||||
matrices.pop();
|
matrices.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,102 +104,86 @@ public class MidnightControlsHud extends Hud {
|
|||||||
scale *= scale;
|
scale *= scale;
|
||||||
int opacity = ((int) (255 * scale)) << 24;
|
int opacity = ((int) (255 * scale)) << 24;
|
||||||
|
|
||||||
context.drawText(client.textRenderer, text, (int) (window.getScaledWidth() / 2.f - this.client.textRenderer.getWidth(text) / 2.f),
|
this.client.textRenderer.draw(matrices, text, window.getScaledWidth() / 2.f - this.client.textRenderer.getWidth(text) / 2.f,
|
||||||
(int) (window.getScaledHeight() / 2.f - 4), 0xCCCCCC | opacity, false);
|
window.getScaledHeight() / 2.f - 4, 0xCCCCCC | opacity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void renderFirstIcons(DrawContext context, int x, int y) {
|
public void renderFirstIcons(MatrixStack matrices, int x, int y) {
|
||||||
int offset = 2 + this.inventoryWidth + this.inventoryButtonWidth + 4;
|
int offset = 2 + this.inventoryWidth + this.inventoryButtonWidth + 4;
|
||||||
int currentX = MidnightControlsConfig.hudSide == HudSide.LEFT ? x : x - this.inventoryButtonWidth;
|
int currentX = MidnightControlsConfig.hudSide == HudSide.LEFT ? x : x - this.inventoryButtonWidth;
|
||||||
if (!ButtonBinding.INVENTORY.isNotBound()) this.drawButton(context, currentX, y, ButtonBinding.INVENTORY, true);
|
this.drawButton(matrices, currentX, y, ButtonBinding.INVENTORY, true);
|
||||||
if (!ButtonBinding.SWAP_HANDS.isNotBound() && !isCrammed && showSwapHandsAction) this.drawButton(context, currentX += (MidnightControlsConfig.hudSide == HudSide.LEFT ? offset : -offset), y, ButtonBinding.SWAP_HANDS, true);
|
this.drawButton(matrices, currentX += (MidnightControlsConfig.hudSide == HudSide.LEFT ? offset : -offset), y, ButtonBinding.SWAP_HANDS, true);
|
||||||
offset = 2 + this.swapHandsWidth + this.dropItemButtonWidth + 4;
|
offset = 2 + this.swapHandsWidth + this.dropItemButtonWidth + 4;
|
||||||
if (this.client.options.getShowSubtitles().getValue() && MidnightControlsConfig.hudSide == HudSide.RIGHT) {
|
if (this.client.options.showSubtitles && MidnightControlsConfig.hudSide == HudSide.RIGHT) {
|
||||||
currentX += -offset;
|
currentX += -offset;
|
||||||
} else {
|
} else {
|
||||||
currentX = MidnightControlsConfig.hudSide == HudSide.LEFT ? x : x - this.dropItemButtonWidth;
|
currentX = MidnightControlsConfig.hudSide == HudSide.LEFT ? x : x - this.dropItemButtonWidth;
|
||||||
y -= 20;
|
y -= 24;
|
||||||
}
|
}
|
||||||
if (!ButtonBinding.DROP_ITEM.isNotBound()) this.drawButton(context, currentX, y, ButtonBinding.DROP_ITEM, !this.client.player.getMainHandStack().isEmpty());
|
this.drawButton(matrices, currentX, y, ButtonBinding.DROP_ITEM, !this.client.player.getMainHandStack().isEmpty());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void renderSecondIcons(DrawContext context, int x, int y) {
|
public void renderSecondIcons(MatrixStack matrices, int x, int y) {
|
||||||
int offset;
|
int offset;
|
||||||
int currentX = x;
|
int currentX = x;
|
||||||
if (isCrammed && showSwapHandsAction && !this.client.options.getShowSubtitles().getValue() && !ButtonBinding.SWAP_HANDS.isNotBound()) {
|
if (!this.placeAction.isEmpty()) {
|
||||||
if (MidnightControlsConfig.hudSide == HudSide.LEFT)
|
if (MidnightControlsConfig.hudSide == HudSide.LEFT)
|
||||||
currentX -= this.useButtonWidth;
|
currentX -= this.useButtonWidth;
|
||||||
this.drawButton(context, currentX, y, ButtonBinding.SWAP_HANDS, true);
|
this.drawButton(matrices, currentX, y, ButtonBinding.USE, true);
|
||||||
currentX = x;
|
|
||||||
y -= 20;
|
|
||||||
}
|
|
||||||
if (!this.placeAction.isEmpty() && (!ButtonBinding.USE.isNotBound()) ) {
|
|
||||||
if (MidnightControlsConfig.hudSide == HudSide.LEFT)
|
|
||||||
currentX -= this.useButtonWidth;
|
|
||||||
this.drawButton(context, currentX, y, ButtonBinding.USE, true);
|
|
||||||
offset = 2 + this.useWidth + 4;
|
offset = 2 + this.useWidth + 4;
|
||||||
if (this.client.options.getShowSubtitles().getValue() && MidnightControlsConfig.hudSide == HudSide.LEFT) {
|
if (this.client.options.showSubtitles && MidnightControlsConfig.hudSide == HudSide.LEFT) {
|
||||||
currentX -= offset;
|
currentX -= offset;
|
||||||
} else {
|
} else {
|
||||||
currentX = x;
|
currentX = x;
|
||||||
y -= 20;
|
y -= 24;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MidnightControlsConfig.hudSide == HudSide.LEFT)
|
if (MidnightControlsConfig.hudSide == HudSide.LEFT)
|
||||||
currentX -= this.attackButtonWidth;
|
currentX -= this.attackButtonWidth;
|
||||||
|
|
||||||
if (!ButtonBinding.ATTACK.isNotBound()) this.drawButton(context, currentX, y, ButtonBinding.ATTACK, this.attackWidth != 0);
|
this.drawButton(matrices, currentX, y, ButtonBinding.ATTACK, this.attackWidth != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void renderFirstSection(DrawContext context, int x, int y) {
|
public void renderFirstSection(MatrixStack matrices, int x, int y) {
|
||||||
int currentX = MidnightControlsConfig.hudSide == HudSide.LEFT ? x + this.inventoryButtonWidth + 2 : x - this.inventoryButtonWidth - 2 - this.inventoryWidth;
|
int currentX = MidnightControlsConfig.hudSide == HudSide.LEFT ? x + this.inventoryButtonWidth + 2 : x - this.inventoryButtonWidth - 2 - this.inventoryWidth;
|
||||||
if (!ButtonBinding.INVENTORY.isNotBound()) this.drawTip(context, currentX, y, ButtonBinding.INVENTORY, true);
|
this.drawTip(matrices, currentX, y, ButtonBinding.INVENTORY, true);
|
||||||
currentX += MidnightControlsConfig.hudSide == HudSide.LEFT ? this.inventoryWidth + 4 + this.swapHandsButtonWidth + 2
|
currentX += MidnightControlsConfig.hudSide == HudSide.LEFT ? this.inventoryWidth + 4 + this.swapHandsButtonWidth + 2
|
||||||
: -this.swapHandsWidth - 2 - this.swapHandsButtonWidth - 4;
|
: -this.swapHandsWidth - 2 - this.swapHandsButtonWidth - 4;
|
||||||
if (!ButtonBinding.SWAP_HANDS.isNotBound() && !isCrammed && showSwapHandsAction) this.drawTip(context, currentX, y, ButtonBinding.SWAP_HANDS, true);
|
this.drawTip(matrices, currentX, y, ButtonBinding.SWAP_HANDS, true);
|
||||||
if (this.client.options.getShowSubtitles().getValue() && MidnightControlsConfig.hudSide == HudSide.RIGHT) {
|
if (this.client.options.showSubtitles && MidnightControlsConfig.hudSide == HudSide.RIGHT) {
|
||||||
currentX += -this.dropItemWidth - 2 - this.dropItemButtonWidth - 4;
|
currentX += -this.dropItemWidth - 2 - this.dropItemButtonWidth - 4;
|
||||||
} else {
|
} else {
|
||||||
y -= 20;
|
y -= 24;
|
||||||
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());
|
this.drawTip(matrices, currentX, y, ButtonBinding.DROP_ITEM, !this.client.player.getMainHandStack().isEmpty());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void renderSecondSection(DrawContext context, int x, int y) {
|
public void renderSecondSection(MatrixStack matrices, int x, int y) {
|
||||||
int currentX = x;
|
int currentX = x;
|
||||||
|
|
||||||
if (isCrammed && showSwapHandsAction && !this.client.options.getShowSubtitles().getValue() && !ButtonBinding.SWAP_HANDS.isNotBound()) {
|
|
||||||
currentX += MidnightControlsConfig.hudSide == HudSide.RIGHT ? this.swapHandsButtonWidth + 2 : -this.swapHandsButtonWidth - 2 - this.swapHandsWidth;
|
|
||||||
|
|
||||||
this.drawTip(context, currentX, y, ButtonBinding.SWAP_HANDS, true);
|
|
||||||
|
|
||||||
currentX = x;
|
|
||||||
y -= 20;
|
|
||||||
}
|
|
||||||
if (!this.placeAction.isEmpty()) {
|
if (!this.placeAction.isEmpty()) {
|
||||||
currentX += MidnightControlsConfig.hudSide == HudSide.RIGHT ? this.useButtonWidth + 2 : -this.useButtonWidth - 2 - this.useWidth;
|
currentX += MidnightControlsConfig.hudSide == HudSide.RIGHT ? this.useButtonWidth + 2 : -this.useButtonWidth - 2 - this.useWidth;
|
||||||
|
|
||||||
this.drawTip(context, currentX, y, this.placeAction, true);
|
this.drawTip(matrices, currentX, y, this.placeAction, true);
|
||||||
|
|
||||||
if (this.client.options.getShowSubtitles().getValue() && MidnightControlsConfig.hudSide == HudSide.LEFT) {
|
if (this.client.options.showSubtitles && MidnightControlsConfig.hudSide == HudSide.LEFT) {
|
||||||
currentX -= 4;
|
currentX -= 4;
|
||||||
} else {
|
} else {
|
||||||
currentX = x;
|
currentX = x;
|
||||||
y -= 20;
|
y -= 24;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
currentX += MidnightControlsConfig.hudSide == HudSide.RIGHT ? this.attackButtonWidth + 2 : -this.attackButtonWidth - 2 - this.attackWidth;
|
currentX += MidnightControlsConfig.hudSide == HudSide.RIGHT ? this.attackButtonWidth + 2 : -this.attackButtonWidth - 2 - this.attackWidth;
|
||||||
|
|
||||||
if (!ButtonBinding.ATTACK.isNotBound()) this.drawTip(context, currentX, y, this.attackAction, this.attackWidth != 0);
|
this.drawTip(matrices, currentX, y, this.attackAction, this.attackWidth != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void tick() {
|
public void tick() {
|
||||||
if (this.client == null) return;
|
|
||||||
super.tick();
|
super.tick();
|
||||||
if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER) {
|
if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER) {
|
||||||
if (this.client.crosshairTarget == null)
|
if (this.client.crosshairTarget == null)
|
||||||
@@ -254,7 +240,6 @@ public class MidnightControlsHud extends Hud {
|
|||||||
placeAction = customUseAction;
|
placeAction = customUseAction;
|
||||||
|
|
||||||
this.placeAction = placeAction;
|
this.placeAction = placeAction;
|
||||||
this.showSwapHandsAction = !this.client.player.getMainHandStack().isEmpty() || !this.client.player.getOffHandStack().isEmpty();
|
|
||||||
|
|
||||||
// Cache the "Use" tip width.
|
// Cache the "Use" tip width.
|
||||||
if (this.placeAction.isEmpty())
|
if (this.placeAction.isEmpty())
|
||||||
@@ -270,7 +255,7 @@ public class MidnightControlsHud extends Hud {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private int bottom(int y) {
|
private int bottom(int y) {
|
||||||
return (this.client.getWindow().getScaledHeight() - y - MidnightControlsRenderer.ICON_SIZE);
|
return (int) ((this.client.getWindow().getScaledHeight() * (1/scale)) - y - MidnightControlsRenderer.ICON_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private int width(@NotNull ButtonBinding binding) {
|
private int width(@NotNull ButtonBinding binding) {
|
||||||
@@ -283,20 +268,20 @@ public class MidnightControlsHud extends Hud {
|
|||||||
return this.client.textRenderer.getWidth(I18n.translate(text));
|
return this.client.textRenderer.getWidth(I18n.translate(text));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawButton(DrawContext context, int x, int y, @NotNull ButtonBinding button, boolean display) {
|
private void drawButton(MatrixStack matrices, int x, int y, @NotNull ButtonBinding button, boolean display) {
|
||||||
if (display)
|
if (display)
|
||||||
MidnightControlsRenderer.drawButton(context, x, y, button, this.client);
|
MidnightControlsRenderer.drawButton(matrices, x, y, button, this.client);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawTip(DrawContext context, int x, int y, @NotNull ButtonBinding button, boolean display) {
|
private void drawTip(MatrixStack matrices, int x, int y, @NotNull ButtonBinding button, boolean display) {
|
||||||
this.drawTip(context, x, y, button.getTranslationKey(), display);
|
this.drawTip(matrices, x, y, button.getTranslationKey(), display);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawTip(DrawContext context, int x, int y, @NotNull String action, boolean display) {
|
private void drawTip(MatrixStack matrices, int x, int y, @NotNull String action, boolean display) {
|
||||||
if (!display)
|
if (!display)
|
||||||
return;
|
return;
|
||||||
var translatedAction = I18n.translate(action);
|
var translatedAction = I18n.translate(action);
|
||||||
int textY = (MidnightControlsRenderer.ICON_SIZE / 2 - this.client.textRenderer.fontHeight / 2) + 1;
|
int textY = (MidnightControlsRenderer.ICON_SIZE / 2 - this.client.textRenderer.fontHeight / 2) + 1;
|
||||||
context.drawText(this.client.textRenderer, translatedAction, x, (y + textY), 14737632, false);
|
this.client.textRenderer.draw(matrices, translatedAction, (float) x, (float) (y + textY), 14737632);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,8 @@
|
|||||||
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.enums.ControllerType;
|
import eu.midnightdust.midnightcontrols.MidnightControls;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.ControllerType;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightInput;
|
import eu.midnightdust.midnightcontrols.client.MidnightInput;
|
||||||
@@ -19,8 +20,9 @@ import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
|||||||
import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor;
|
import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.font.TextRenderer;
|
import net.minecraft.client.font.TextRenderer;
|
||||||
import net.minecraft.client.gui.DrawContext;
|
import net.minecraft.client.gui.DrawableHelper;
|
||||||
import net.minecraft.client.resource.language.I18n;
|
import net.minecraft.client.resource.language.I18n;
|
||||||
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
import net.minecraft.screen.slot.Slot;
|
import net.minecraft.screen.slot.Slot;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
@@ -75,17 +77,17 @@ public class MidnightControlsRenderer {
|
|||||||
return width;
|
return width;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ButtonSize drawButton(DrawContext context, int x, int y, @NotNull ButtonBinding button, @NotNull MinecraftClient client) {
|
public static ButtonSize drawButton(MatrixStack matrices, int x, int y, @NotNull ButtonBinding button, @NotNull MinecraftClient client) {
|
||||||
return drawButton(context, x, y, button.getButton(), client);
|
return drawButton(matrices, x, y, button.getButton(), client);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ButtonSize drawButton(DrawContext context, int x, int y, int[] buttons, @NotNull MinecraftClient client) {
|
public static ButtonSize drawButton(MatrixStack matrices, int x, int y, int[] buttons, @NotNull MinecraftClient client) {
|
||||||
int height = 0;
|
int height = 0;
|
||||||
int length = 0;
|
int length = 0;
|
||||||
int currentX = x;
|
int currentX = x;
|
||||||
for (int i = 0; i < buttons.length; i++) {
|
for (int i = 0; i < buttons.length; i++) {
|
||||||
int btn = buttons[i];
|
int btn = buttons[i];
|
||||||
int size = drawButton(context, currentX, y, btn, client);
|
int size = drawButton(matrices, currentX, y, btn, client);
|
||||||
if (size > height)
|
if (size > height)
|
||||||
height = size;
|
height = size;
|
||||||
length += size;
|
length += size;
|
||||||
@@ -97,7 +99,7 @@ public class MidnightControlsRenderer {
|
|||||||
return new ButtonSize(length, height);
|
return new ButtonSize(length, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int drawButton(DrawContext context, int x, int y, int button, @NotNull MinecraftClient client) {
|
public static int drawButton(MatrixStack matrices, int x, int y, int button, @NotNull MinecraftClient client) {
|
||||||
boolean second = false;
|
boolean second = false;
|
||||||
if (button == -1)
|
if (button == -1)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -157,13 +159,13 @@ public class MidnightControlsRenderer {
|
|||||||
case GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER + 100, GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER + 200 -> buttonOffset = 10 * 15;
|
case GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER + 100, GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER + 200 -> buttonOffset = 10 * 15;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RenderSystem.setShaderTexture(0, axis ? MidnightControlsClient.CONTROLLER_AXIS : button >= 15 && button <= 19 ? MidnightControlsClient.CONTROLLER_EXPANDED :MidnightControlsClient.CONTROLLER_BUTTONS);
|
||||||
RenderSystem.disableDepthTest();
|
RenderSystem.disableDepthTest();
|
||||||
|
|
||||||
int assetSize = axis || (button >= 15 && button <= 18) ? AXIS_SIZE : BUTTON_SIZE;
|
int assetSize = axis || (button >= 15 && button <= 18) ? AXIS_SIZE : BUTTON_SIZE;
|
||||||
|
|
||||||
RenderSystem.setShaderColor(1.f, second ? 0.f : 1.f, 1.f, 1.f);
|
RenderSystem.setShaderColor(1.f, second ? 0.f : 1.f, 1.f, 1.f);
|
||||||
context.drawTexture(axis ? MidnightControlsClient.CONTROLLER_AXIS : button >= 15 && button <= 19 ? MidnightControlsClient.CONTROLLER_EXPANDED :MidnightControlsClient.CONTROLLER_BUTTONS
|
DrawableHelper.drawTexture(matrices, x + (ICON_SIZE / 2 - assetSize / 2), y + (ICON_SIZE / 2 - assetSize / 2),
|
||||||
, x + (ICON_SIZE / 2 - assetSize / 2), y + (ICON_SIZE / 2 - assetSize / 2),
|
|
||||||
(float) buttonOffset, (float) (controllerType * assetSize),
|
(float) buttonOffset, (float) (controllerType * assetSize),
|
||||||
assetSize, assetSize,
|
assetSize, assetSize,
|
||||||
256, 256);
|
256, 256);
|
||||||
@@ -172,18 +174,18 @@ public class MidnightControlsRenderer {
|
|||||||
return ICON_SIZE;
|
return ICON_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int drawButtonTip(DrawContext context, int x, int y, @NotNull ButtonBinding button, boolean display, @NotNull MinecraftClient client) {
|
public static int drawButtonTip(MatrixStack matrices, int x, int y, @NotNull ButtonBinding button, boolean display, @NotNull MinecraftClient client) {
|
||||||
return drawButtonTip(context, x, y, button.getButton(), button.getTranslationKey(), display, client);
|
return drawButtonTip(matrices, x, y, button.getButton(), button.getTranslationKey(), display, client);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int drawButtonTip(DrawContext context, int x, int y, int[] button, @NotNull String action, boolean display, @NotNull MinecraftClient client) {
|
public static int drawButtonTip(MatrixStack matrices, int x, int y, int[] button, @NotNull String action, boolean display, @NotNull MinecraftClient client) {
|
||||||
if (display) {
|
if (display) {
|
||||||
int buttonWidth = drawButton(context, x, y, button, client).length();
|
int buttonWidth = drawButton(matrices, x, y, button, client).length();
|
||||||
|
|
||||||
var translatedAction = I18n.translate(action);
|
var translatedAction = I18n.translate(action);
|
||||||
int textY = (MidnightControlsRenderer.ICON_SIZE / 2 - client.textRenderer.fontHeight / 2) + 1;
|
int textY = (MidnightControlsRenderer.ICON_SIZE / 2 - client.textRenderer.fontHeight / 2) + 1;
|
||||||
|
|
||||||
return context.drawTextWithShadow(client.textRenderer, translatedAction, (x + buttonWidth + 2), (y + textY), 14737632);
|
return client.textRenderer.drawWithShadow(matrices, translatedAction, (float) (x + buttonWidth + 2), (float) (y + textY), 14737632);
|
||||||
}
|
}
|
||||||
|
|
||||||
return -10;
|
return -10;
|
||||||
@@ -193,7 +195,7 @@ public class MidnightControlsRenderer {
|
|||||||
return 15 + 5 + textRenderer.getWidth(action);
|
return 15 + 5 + textRenderer.getWidth(action);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void renderVirtualCursor(@NotNull DrawContext context, @NotNull MinecraftClient client) {
|
public static void renderVirtualCursor(@NotNull MatrixStack matrices, @NotNull MinecraftClient client) {
|
||||||
if (!MidnightControlsConfig.virtualMouse || (client.currentScreen == null
|
if (!MidnightControlsConfig.virtualMouse || (client.currentScreen == null
|
||||||
|| MidnightInput.isScreenInteractive(client.currentScreen)))
|
|| MidnightInput.isScreenInteractive(client.currentScreen)))
|
||||||
return;
|
return;
|
||||||
@@ -231,32 +233,27 @@ public class MidnightControlsRenderer {
|
|||||||
mouseY -= 8;
|
mouseY -= 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
//context.getMatrices().push();
|
drawCursor(matrices, mouseX, mouseY, hoverSlot, client);
|
||||||
context.getMatrices().translate(0f, 0f, 999f);
|
|
||||||
drawCursor(context, mouseX, mouseY, hoverSlot, client);
|
|
||||||
//context.getMatrices().pop();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draws the virtual cursor.
|
* Draws the virtual cursor.
|
||||||
*
|
*
|
||||||
* @param context the context
|
* @param matrices the matrix stack
|
||||||
* @param x x coordinate
|
* @param x x coordinate
|
||||||
* @param y y coordinate
|
* @param y y coordinate
|
||||||
* @param hoverSlot true if hovering a slot, else false
|
* @param hoverSlot true if hovering a slot, else false
|
||||||
* @param client the client instance
|
* @param client the client instance
|
||||||
*/
|
*/
|
||||||
public static void drawCursor(@NotNull DrawContext context, int x, int y, boolean hoverSlot, @NotNull MinecraftClient client) {
|
public static void drawCursor(@NotNull MatrixStack matrices, int x, int y, boolean hoverSlot, @NotNull MinecraftClient client) {
|
||||||
//RenderSystem.disableDepthTest();
|
RenderSystem.disableDepthTest();
|
||||||
//RenderSystem.setShaderColor(1.f, 1.f, 1.f, 1.f);
|
|
||||||
//RenderSystem.disableBlend();
|
RenderSystem.setShaderColor(1.f, 1.f, 1.f, 1.f);
|
||||||
//RenderSystem.setShaderTexture(0, MidnightControlsClient.CURSOR_TEXTURE);
|
RenderSystem.setShaderTexture(0, MidnightControlsClient.CURSOR_TEXTURE);
|
||||||
context.drawTexture(MidnightControlsClient.CURSOR_TEXTURE, x, y,
|
DrawableHelper.drawTexture(matrices, x, y,
|
||||||
hoverSlot ? 16.f : 0.f, MidnightControlsConfig.virtualMouseSkin.ordinal() * 16.f,
|
hoverSlot ? 16.f : 0.f, MidnightControlsConfig.virtualMouseSkin.ordinal() * 16.f,
|
||||||
16, 16, 32, 64);
|
16, 16, 32, 64);
|
||||||
context.fill(1, 1, x, y, 0xFFFFFF);
|
RenderSystem.enableDepthTest();
|
||||||
context.draw();
|
|
||||||
//RenderSystem.enableDepthTest();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public record ButtonSize(int length, int height) {
|
public record ButtonSize(int length, int height) {
|
||||||
|
|||||||
@@ -10,37 +10,37 @@
|
|||||||
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 org.thinkingstudio.obsidianui.background.Background;
|
import dev.lambdaurora.spruceui.background.Background;
|
||||||
import org.thinkingstudio.obsidianui.widget.SpruceWidget;
|
import dev.lambdaurora.spruceui.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.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;
|
||||||
import org.thinkingstudio.obsidianui.Position;
|
import dev.lambdaurora.spruceui.Position;
|
||||||
import org.thinkingstudio.obsidianui.SpruceTexts;
|
import dev.lambdaurora.spruceui.SpruceTexts;
|
||||||
import org.thinkingstudio.obsidianui.option.*;
|
import dev.lambdaurora.spruceui.option.*;
|
||||||
import org.thinkingstudio.obsidianui.screen.SpruceScreen;
|
import dev.lambdaurora.spruceui.screen.SpruceScreen;
|
||||||
import org.thinkingstudio.obsidianui.widget.AbstractSpruceWidget;
|
import dev.lambdaurora.spruceui.widget.AbstractSpruceWidget;
|
||||||
import org.thinkingstudio.obsidianui.widget.SpruceLabelWidget;
|
import dev.lambdaurora.spruceui.widget.SpruceLabelWidget;
|
||||||
import org.thinkingstudio.obsidianui.widget.container.SpruceContainerWidget;
|
import dev.lambdaurora.spruceui.widget.container.SpruceContainerWidget;
|
||||||
import org.thinkingstudio.obsidianui.widget.container.SpruceOptionListWidget;
|
import dev.lambdaurora.spruceui.widget.container.SpruceOptionListWidget;
|
||||||
import org.thinkingstudio.obsidianui.widget.container.tabbed.SpruceTabbedWidget;
|
import dev.lambdaurora.spruceui.widget.container.tabbed.SpruceTabbedWidget;
|
||||||
import eu.midnightdust.midnightcontrols.packet.ControlsModePacket;
|
|
||||||
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
|
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.screen.Screen;
|
import net.minecraft.client.gui.screen.Screen;
|
||||||
import net.minecraft.client.gui.widget.ButtonWidget;
|
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||||
import net.minecraft.client.render.*;
|
import net.minecraft.client.render.*;
|
||||||
import net.minecraft.client.resource.language.I18n;
|
import net.minecraft.client.resource.language.I18n;
|
||||||
import net.minecraft.client.util.math.MatrixStack;
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
|
import net.minecraft.text.LiteralText;
|
||||||
import net.minecraft.text.MutableText;
|
import net.minecraft.text.MutableText;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableText;
|
||||||
import net.minecraft.util.Formatting;
|
import net.minecraft.util.Formatting;
|
||||||
import net.minecraft.util.Util;
|
import net.minecraft.util.Util;
|
||||||
import org.joml.Matrix4f;
|
import net.minecraft.util.math.Matrix4f;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
@@ -49,7 +49,7 @@ import java.awt.*;
|
|||||||
* Represents the midnightcontrols settings screen.
|
* Represents the midnightcontrols settings screen.
|
||||||
*/
|
*/
|
||||||
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 = new LiteralText("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();
|
final MidnightControlsClient mod = MidnightControlsClient.get();
|
||||||
private final Screen parent;
|
private final Screen parent;
|
||||||
@@ -59,19 +59,12 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
private final SpruceOption rotationSpeedOption;
|
private final SpruceOption rotationSpeedOption;
|
||||||
private final SpruceOption yAxisRotationSpeedOption;
|
private final SpruceOption yAxisRotationSpeedOption;
|
||||||
private final SpruceOption mouseSpeedOption;
|
private final SpruceOption mouseSpeedOption;
|
||||||
private final SpruceOption joystickAsMouseOption;
|
|
||||||
private final SpruceOption eyeTrackingAsMouseOption;
|
|
||||||
private final SpruceOption eyeTrackingDeadzone;
|
|
||||||
private final SpruceOption virtualMouseOption;
|
private final SpruceOption virtualMouseOption;
|
||||||
private final SpruceOption hideCursorOption;
|
|
||||||
private final SpruceOption resetOption;
|
private final SpruceOption resetOption;
|
||||||
private final SpruceOption advancedConfigOption;
|
|
||||||
// Gameplay options
|
// Gameplay options
|
||||||
private final SpruceOption analogMovementOption;
|
private final SpruceOption analogMovementOption;
|
||||||
private final SpruceOption doubleTapToSprintOption;
|
private final SpruceOption doubleTapToSprintOption;
|
||||||
private final SpruceOption autoJumpOption;
|
private final SpruceOption autoJumpOption;
|
||||||
private final SpruceOption controllerToggleSneakOption;
|
|
||||||
private final SpruceOption controllerToggleSprintOption;
|
|
||||||
private final SpruceOption fastBlockPlacingOption;
|
private final SpruceOption fastBlockPlacingOption;
|
||||||
private final SpruceOption frontBlockPlacingOption;
|
private final SpruceOption frontBlockPlacingOption;
|
||||||
private final SpruceOption verticalReacharoundOption;
|
private final SpruceOption verticalReacharoundOption;
|
||||||
@@ -82,7 +75,6 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
private final SpruceOption virtualMouseSkinOption;
|
private final SpruceOption virtualMouseSkinOption;
|
||||||
private final SpruceOption hudEnableOption;
|
private final SpruceOption hudEnableOption;
|
||||||
private final SpruceOption hudSideOption;
|
private final SpruceOption hudSideOption;
|
||||||
private final SpruceOption moveChatOption;
|
|
||||||
// Controller options
|
// Controller options
|
||||||
private final SpruceOption controllerOption =
|
private final SpruceOption controllerOption =
|
||||||
new SpruceCyclingOption("midnightcontrols.menu.controller",
|
new SpruceCyclingOption("midnightcontrols.menu.controller",
|
||||||
@@ -93,17 +85,16 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
id = GLFW.GLFW_JOYSTICK_1;
|
id = GLFW.GLFW_JOYSTICK_1;
|
||||||
id = searchNextAvailableController(id, false);
|
id = searchNextAvailableController(id, false);
|
||||||
MidnightControlsConfig.setController(Controller.byId(id));
|
MidnightControlsConfig.setController(Controller.byId(id));
|
||||||
if (MidnightControlsConfig.debug) System.out.println(Controller.byId(id).getName() + "'s Controller GUID: " + Controller.byId(id).getGuid());
|
|
||||||
},
|
},
|
||||||
option -> {
|
option -> {
|
||||||
var controller = MidnightControlsConfig.getController();
|
var controller = MidnightControlsConfig.getController();
|
||||||
var controllerName = controller.getName();
|
var controllerName = controller.getName();
|
||||||
if (!controller.isConnected())
|
if (!controller.isConnected())
|
||||||
return option.getDisplayText(Text.literal(controllerName).formatted(Formatting.RED));
|
return option.getDisplayText(new LiteralText(controllerName).formatted(Formatting.RED));
|
||||||
else if (!controller.isGamepad())
|
else if (!controller.isGamepad())
|
||||||
return option.getDisplayText(Text.literal(controllerName).formatted(Formatting.GOLD));
|
return option.getDisplayText(new LiteralText(controllerName).formatted(Formatting.GOLD));
|
||||||
else
|
else
|
||||||
return option.getDisplayText(Text.literal(controllerName));
|
return option.getDisplayText(new LiteralText(controllerName));
|
||||||
}, null);
|
}, null);
|
||||||
private final SpruceOption secondControllerOption = new SpruceCyclingOption("midnightcontrols.menu.controller2",
|
private final SpruceOption secondControllerOption = new SpruceCyclingOption("midnightcontrols.menu.controller2",
|
||||||
amount -> {
|
amount -> {
|
||||||
@@ -117,18 +108,16 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
option -> MidnightControlsConfig.getSecondController().map(controller -> {
|
option -> MidnightControlsConfig.getSecondController().map(controller -> {
|
||||||
var controllerName = controller.getName();
|
var controllerName = controller.getName();
|
||||||
if (!controller.isConnected())
|
if (!controller.isConnected())
|
||||||
return option.getDisplayText(Text.literal(controllerName).formatted(Formatting.RED));
|
return option.getDisplayText(new LiteralText(controllerName).formatted(Formatting.RED));
|
||||||
else if (!controller.isGamepad())
|
else if (!controller.isGamepad())
|
||||||
return option.getDisplayText(Text.literal(controllerName).formatted(Formatting.GOLD));
|
return option.getDisplayText(new LiteralText(controllerName).formatted(Formatting.GOLD));
|
||||||
else
|
else
|
||||||
return option.getDisplayText(Text.literal(controllerName));
|
return option.getDisplayText(new LiteralText(controllerName));
|
||||||
}).orElse(option.getDisplayText(SpruceTexts.OPTIONS_OFF.copyContentOnly().formatted(Formatting.RED))),
|
}).orElse(option.getDisplayText(SpruceTexts.OPTIONS_OFF.copy().formatted(Formatting.RED))),
|
||||||
Text.translatable("midnightcontrols.menu.controller2.tooltip"));
|
new TranslatableText("midnightcontrols.tooltip.controller2"));
|
||||||
private final SpruceOption unfocusedInputOption;
|
private final SpruceOption unfocusedInputOption;
|
||||||
private final SpruceOption invertsRightXAxis;
|
private final SpruceOption invertsRightXAxis;
|
||||||
private final SpruceOption invertsRightYAxis;
|
private final SpruceOption invertsRightYAxis;
|
||||||
private final SpruceOption cameraModeOption;
|
|
||||||
private final SpruceOption toggleControllerProfileOption;
|
|
||||||
private final SpruceOption rightDeadZoneOption;
|
private final SpruceOption rightDeadZoneOption;
|
||||||
private final SpruceOption leftDeadZoneOption;
|
private final SpruceOption leftDeadZoneOption;
|
||||||
private final SpruceOption[] maxAnalogValueOptions = new SpruceOption[]{
|
private final SpruceOption[] maxAnalogValueOptions = new SpruceOption[]{
|
||||||
@@ -142,20 +131,13 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
return new SpruceDoubleOption(key, .25f, 1.f, 0.05f,
|
return new SpruceDoubleOption(key, .25f, 1.f, 0.05f,
|
||||||
() -> MidnightControlsConfig.getAxisMaxValue(axis),
|
() -> MidnightControlsConfig.getAxisMaxValue(axis),
|
||||||
newValue -> MidnightControlsConfig.setAxisMaxValue(axis, newValue),
|
newValue -> MidnightControlsConfig.setAxisMaxValue(axis, newValue),
|
||||||
option -> option.getDisplayText(Text.literal(String.format("%.2f", option.get()))),
|
option -> option.getDisplayText(new LiteralText(String.format("%.2f", option.get()))),
|
||||||
Text.translatable(key.concat(".tooltip"))
|
new TranslatableText(key.replace("menu", "tooltip"))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
// Touch options
|
|
||||||
private final SpruceOption touchWithControllerOption;
|
|
||||||
private final SpruceOption touchSpeedOption;
|
|
||||||
private final SpruceOption touchBreakDelayOption;
|
|
||||||
private final SpruceOption invertTouchOption;
|
|
||||||
private final SpruceOption touchTransparencyOption;
|
|
||||||
private final SpruceOption touchModeOption;
|
|
||||||
|
|
||||||
private final MutableText controllerMappingsUrlText = Text.literal("(")
|
private final MutableText controllerMappingsUrlText = new LiteralText("(")
|
||||||
.append(Text.literal(GAMEPAD_TOOL_URL).formatted(Formatting.GOLD))
|
.append(new LiteralText(GAMEPAD_TOOL_URL).formatted(Formatting.GOLD))
|
||||||
.append("),");
|
.append("),");
|
||||||
|
|
||||||
private static int searchNextAvailableController(int newId, boolean allowNone) {
|
private static int searchNextAvailableController(int newId, boolean allowNone) {
|
||||||
@@ -173,7 +155,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public MidnightControlsSettingsScreen(Screen parent, boolean hideControls) {
|
public MidnightControlsSettingsScreen(Screen parent, boolean hideControls) {
|
||||||
super(Text.translatable("midnightcontrols.title.settings"));
|
super(new TranslatableText("midnightcontrols.title.settings"));
|
||||||
MidnightControlsConfig.isEditing = true;
|
MidnightControlsConfig.isEditing = true;
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
// General options
|
// General options
|
||||||
@@ -183,142 +165,88 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
MidnightControlsConfig.controlsMode = next;
|
MidnightControlsConfig.controlsMode = next;
|
||||||
MidnightControlsConfig.save();
|
MidnightControlsConfig.save();
|
||||||
|
|
||||||
if (this.client != null && this.client.player != null) {
|
if (this.client.player != null) {
|
||||||
ClientPlayNetworking.getSender().sendPacket(new ControlsModePacket(next.getName()));
|
ClientPlayNetworking.getSender().sendPacket(MidnightControls.CONTROLS_MODE_CHANNEL, this.mod.makeControlsModeBuffer(next));
|
||||||
}
|
}
|
||||||
}, option -> option.getDisplayText(Text.translatable(MidnightControlsConfig.controlsMode.getTranslationKey())),
|
}, option -> option.getDisplayText(new TranslatableText(MidnightControlsConfig.controlsMode.getTranslationKey())),
|
||||||
Text.translatable("midnightcontrols.menu.controls_mode.tooltip"));
|
new TranslatableText("midnightcontrols.tooltip.controls_mode"));
|
||||||
this.autoSwitchModeOption = new SpruceToggleBooleanOption("midnightcontrols.menu.auto_switch_mode", () -> MidnightControlsConfig.autoSwitchMode,
|
this.autoSwitchModeOption = new SpruceToggleBooleanOption("midnightcontrols.menu.auto_switch_mode", () -> MidnightControlsConfig.autoSwitchMode,
|
||||||
value -> MidnightControlsConfig.autoSwitchMode = value, Text.translatable("midnightcontrols.menu.auto_switch_mode.tooltip"));
|
value -> MidnightControlsConfig.autoSwitchMode = value, new TranslatableText("midnightcontrols.tooltip.auto_switch_mode"));
|
||||||
this.rotationSpeedOption = new SpruceDoubleOption("midnightcontrols.menu.rotation_speed", 0.0, 100.0, .5f,
|
this.rotationSpeedOption = new SpruceDoubleOption("midnightcontrols.menu.rotation_speed", 0.0, 100.0, .5f,
|
||||||
() -> MidnightControlsConfig.rotationSpeed,
|
() -> MidnightControlsConfig.rotationSpeed,
|
||||||
value -> MidnightControlsConfig.rotationSpeed = value, option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))),
|
value -> MidnightControlsConfig.rotationSpeed = value, option -> option.getDisplayText(new LiteralText(String.valueOf(option.get()))),
|
||||||
Text.translatable("midnightcontrols.menu.rotation_speed.tooltip"));
|
new TranslatableText("midnightcontrols.tooltip.rotation_speed"));
|
||||||
this.yAxisRotationSpeedOption = new SpruceDoubleOption("midnightcontrols.menu.y_axis_rotation_speed", 0.0, 100.0, .5f,
|
this.yAxisRotationSpeedOption = new SpruceDoubleOption("midnightcontrols.menu.y_axis_rotation_speed", 0.0, 100.0, .5f,
|
||||||
() -> MidnightControlsConfig.yAxisRotationSpeed,
|
() -> MidnightControlsConfig.yAxisRotationSpeed,
|
||||||
value -> MidnightControlsConfig.yAxisRotationSpeed = value, option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))),
|
value -> MidnightControlsConfig.yAxisRotationSpeed = value, option -> option.getDisplayText(new LiteralText(String.valueOf(option.get()))),
|
||||||
Text.translatable("midnightcontrols.menu.y_axis_rotation_speed.tooltip"));
|
new TranslatableText("midnightcontrols.tooltip.y_axis_rotation_speed"));
|
||||||
this.mouseSpeedOption = new SpruceDoubleOption("midnightcontrols.menu.mouse_speed", 0.0, 150.0, .5f,
|
this.mouseSpeedOption = new SpruceDoubleOption("midnightcontrols.menu.mouse_speed", 0.0, 150.0, .5f,
|
||||||
() -> MidnightControlsConfig.mouseSpeed,
|
() -> MidnightControlsConfig.mouseSpeed,
|
||||||
value -> MidnightControlsConfig.mouseSpeed = value, option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))),
|
value -> MidnightControlsConfig.mouseSpeed = value, option -> option.getDisplayText(new LiteralText(String.valueOf(option.get()))),
|
||||||
Text.translatable("midnightcontrols.menu.mouse_speed.tooltip"));
|
new TranslatableText("midnightcontrols.tooltip.mouse_speed"));
|
||||||
this.joystickAsMouseOption = new SpruceToggleBooleanOption("midnightcontrols.menu.joystick_as_mouse",
|
|
||||||
() -> MidnightControlsConfig.joystickAsMouse, value -> MidnightControlsConfig.joystickAsMouse = value,
|
|
||||||
Text.translatable("midnightcontrols.menu.joystick_as_mouse.tooltip"));
|
|
||||||
this.eyeTrackingAsMouseOption = new SpruceToggleBooleanOption("midnightcontrols.menu.eye_tracker_as_mouse",
|
|
||||||
() -> MidnightControlsConfig.eyeTrackerAsMouse, value -> MidnightControlsConfig.eyeTrackerAsMouse = value,
|
|
||||||
Text.translatable("midnightcontrols.menu.eye_tracker_as_mouse.tooltip"));
|
|
||||||
this.eyeTrackingDeadzone = new SpruceDoubleInputOption("midnightcontrols.menu.eye_tracker_deadzone",
|
|
||||||
() -> MidnightControlsConfig.eyeTrackerDeadzone, value -> MidnightControlsConfig.eyeTrackerDeadzone = value,
|
|
||||||
Text.translatable("midnightcontrols.menu.eye_tracker_deadzone.tooltip"));
|
|
||||||
this.resetOption = SpruceSimpleActionOption.reset(btn -> {
|
this.resetOption = SpruceSimpleActionOption.reset(btn -> {
|
||||||
|
// TODO
|
||||||
MidnightControlsConfig.reset();
|
MidnightControlsConfig.reset();
|
||||||
var client = MinecraftClient.getInstance();
|
var client = MinecraftClient.getInstance();
|
||||||
this.init(client, client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight());
|
this.init(client, client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight());
|
||||||
});
|
});
|
||||||
this.advancedConfigOption = SpruceSimpleActionOption.of("midnightcontrols.midnightconfig.title", button -> client.setScreen(MidnightControlsConfig.getScreen(this, "midnightcontrols")));
|
|
||||||
// Gameplay options
|
// Gameplay options
|
||||||
this.analogMovementOption = new SpruceToggleBooleanOption("midnightcontrols.menu.analog_movement",
|
this.analogMovementOption = new SpruceToggleBooleanOption("midnightcontrols.menu.analog_movement",
|
||||||
() -> MidnightControlsConfig.analogMovement, value -> MidnightControlsConfig.analogMovement = value,
|
() -> MidnightControlsConfig.analogMovement, value -> MidnightControlsConfig.analogMovement = value,
|
||||||
Text.translatable("midnightcontrols.menu.analog_movement.tooltip"));
|
new TranslatableText("midnightcontrols.tooltip.analog_movement"));
|
||||||
this.doubleTapToSprintOption = new SpruceToggleBooleanOption("midnightcontrols.menu.double_tap_to_sprint",
|
this.doubleTapToSprintOption = new SpruceToggleBooleanOption("midnightcontrols.menu.double_tap_to_sprint",
|
||||||
() -> MidnightControlsConfig.doubleTapToSprint, value -> MidnightControlsConfig.doubleTapToSprint = value,
|
() -> MidnightControlsConfig.doubleTapToSprint, value -> MidnightControlsConfig.doubleTapToSprint = value,
|
||||||
Text.translatable("midnightcontrols.menu.double_tap_to_sprint.tooltip"));
|
new TranslatableText("midnightcontrols.tooltip.double_tap_to_sprint"));
|
||||||
this.autoJumpOption = new SpruceToggleBooleanOption("options.autoJump",
|
this.autoJumpOption = new SpruceToggleBooleanOption("options.autoJump",
|
||||||
() -> this.client.options.getAutoJump().getValue(),
|
() -> this.client.options.autoJump,
|
||||||
newValue -> this.client.options.getAutoJump().setValue(newValue),
|
newValue -> this.client.options.autoJump = newValue,
|
||||||
null);
|
|
||||||
this.controllerToggleSneakOption = new SpruceToggleBooleanOption("midnightcontrols.menu.controller_toggle_sneak",
|
|
||||||
() -> MidnightControlsConfig.controllerToggleSneak, value -> MidnightControlsConfig.controllerToggleSneak = value,
|
|
||||||
null);
|
|
||||||
this.controllerToggleSprintOption = new SpruceToggleBooleanOption("midnightcontrols.menu.controller_toggle_sprint",
|
|
||||||
() -> MidnightControlsConfig.controllerToggleSprint, value -> MidnightControlsConfig.controllerToggleSprint = value,
|
|
||||||
null);
|
null);
|
||||||
this.fastBlockPlacingOption = new SpruceToggleBooleanOption("midnightcontrols.menu.fast_block_placing", () -> MidnightControlsConfig.fastBlockPlacing,
|
this.fastBlockPlacingOption = new SpruceToggleBooleanOption("midnightcontrols.menu.fast_block_placing", () -> MidnightControlsConfig.fastBlockPlacing,
|
||||||
value -> MidnightControlsConfig.fastBlockPlacing = value, Text.translatable("midnightcontrols.menu.fast_block_placing.tooltip"));
|
value -> MidnightControlsConfig.fastBlockPlacing = value, new TranslatableText("midnightcontrols.tooltip.fast_block_placing"));
|
||||||
this.frontBlockPlacingOption = new SpruceToggleBooleanOption("midnightcontrols.menu.reacharound.horizontal", () -> MidnightControlsConfig.horizontalReacharound,
|
this.frontBlockPlacingOption = new SpruceToggleBooleanOption("midnightcontrols.menu.reacharound.horizontal", () -> MidnightControlsConfig.horizontalReacharound,
|
||||||
value -> MidnightControlsConfig.horizontalReacharound = value, Text.translatable("midnightcontrols.menu.reacharound.horizontal.tooltip"));
|
value -> MidnightControlsConfig.horizontalReacharound = value, new TranslatableText("midnightcontrols.tooltip.reacharound.horizontal"));
|
||||||
this.verticalReacharoundOption = new SpruceToggleBooleanOption("midnightcontrols.menu.reacharound.vertical", () -> MidnightControlsConfig.verticalReacharound,
|
this.verticalReacharoundOption = new SpruceToggleBooleanOption("midnightcontrols.menu.reacharound.vertical", () -> MidnightControlsConfig.verticalReacharound,
|
||||||
value -> MidnightControlsConfig.verticalReacharound = value, Text.translatable("midnightcontrols.menu.reacharound.vertical.tooltip"));
|
value -> MidnightControlsConfig.verticalReacharound = value, new TranslatableText("midnightcontrols.tooltip.reacharound.vertical"));
|
||||||
this.flyDriftingOption = new SpruceToggleBooleanOption("midnightcontrols.menu.fly_drifting", () -> MidnightControlsConfig.flyDrifting,
|
this.flyDriftingOption = new SpruceToggleBooleanOption("midnightcontrols.menu.fly_drifting", () -> MidnightControlsConfig.flyDrifting,
|
||||||
value -> MidnightControlsConfig.flyDrifting = value, Text.translatable("midnightcontrols.menu.fly_drifting.tooltip"));
|
value -> MidnightControlsConfig.flyDrifting = value, new TranslatableText("midnightcontrols.tooltip.fly_drifting"));
|
||||||
this.flyVerticalDriftingOption = new SpruceToggleBooleanOption("midnightcontrols.menu.fly_drifting_vertical", () -> MidnightControlsConfig.verticalFlyDrifting,
|
this.flyVerticalDriftingOption = new SpruceToggleBooleanOption("midnightcontrols.menu.fly_drifting_vertical", () -> MidnightControlsConfig.verticalFlyDrifting,
|
||||||
value -> MidnightControlsConfig.verticalFlyDrifting = value, Text.translatable("midnightcontrols.menu.fly_drifting_vertical.tooltip"));
|
value -> MidnightControlsConfig.verticalFlyDrifting = value, new TranslatableText("midnightcontrols.tooltip.fly_drifting_vertical"));
|
||||||
// Appearance options
|
// Appearance options
|
||||||
this.controllerTypeOption = new SpruceCyclingOption("midnightcontrols.menu.controller_type",
|
this.controllerTypeOption = new SpruceCyclingOption("midnightcontrols.menu.controller_type",
|
||||||
amount -> MidnightControlsConfig.controllerType = MidnightControlsConfig.controllerType.next(),
|
amount -> MidnightControlsConfig.controllerType = MidnightControlsConfig.controllerType.next(),
|
||||||
option -> option.getDisplayText(MidnightControlsConfig.controllerType.getTranslatedText()),
|
option -> option.getDisplayText(MidnightControlsConfig.controllerType.getTranslatedText()),
|
||||||
Text.translatable("midnightcontrols.menu.controller_type.tooltip"));
|
new TranslatableText("midnightcontrols.tooltip.controller_type"));
|
||||||
this.virtualMouseSkinOption = new SpruceCyclingOption("midnightcontrols.menu.virtual_mouse.skin",
|
this.virtualMouseSkinOption = new SpruceCyclingOption("midnightcontrols.menu.virtual_mouse.skin",
|
||||||
amount -> MidnightControlsConfig.virtualMouseSkin = MidnightControlsConfig.virtualMouseSkin.next(),
|
amount -> MidnightControlsConfig.virtualMouseSkin = MidnightControlsConfig.virtualMouseSkin.next(),
|
||||||
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"));
|
this.mod::setHudEnabled, new TranslatableText("midnightcontrols.tooltip.hud_enable"));
|
||||||
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()),
|
||||||
Text.translatable("midnightcontrols.menu.hud_side.tooltip"));
|
new TranslatableText("midnightcontrols.tooltip.hud_side"));
|
||||||
this.moveChatOption = new SpruceToggleBooleanOption("midnightcontrols.menu.move_chat", () -> MidnightControlsConfig.moveChat,
|
|
||||||
value -> MidnightControlsConfig.moveChat = value, Text.translatable("midnightcontrols.menu.move_chat.tooltip"));
|
|
||||||
// Controller options
|
// Controller options
|
||||||
this.toggleControllerProfileOption = new SpruceToggleBooleanOption("midnightcontrols.menu.separate_controller_profile", () -> MidnightControlsConfig.controllerBindingProfiles.containsKey(MidnightControlsConfig.getController().getGuid()), value -> {
|
|
||||||
if (value) {
|
|
||||||
MidnightControlsConfig.controllerBindingProfiles.put(MidnightControlsConfig.getController().getGuid(), MidnightControlsConfig.getBindingsForController());
|
|
||||||
MidnightControlsConfig.updateBindingsForController(MidnightControlsConfig.getController());
|
|
||||||
} else {
|
|
||||||
MidnightControlsConfig.controllerBindingProfiles.remove(MidnightControlsConfig.getController().getGuid());
|
|
||||||
MidnightControlsConfig.updateBindingsForController(MidnightControlsConfig.getController());
|
|
||||||
}
|
|
||||||
|
|
||||||
}, Text.translatable(""));
|
|
||||||
this.cameraModeOption = new SpruceCyclingOption("midnightcontrols.menu.camera_mode",
|
|
||||||
amount -> MidnightControlsConfig.cameraMode = MidnightControlsConfig.cameraMode.next(),
|
|
||||||
option -> option.getDisplayText(MidnightControlsConfig.cameraMode.getTranslatedText()),
|
|
||||||
Text.translatable("midnightcontrols.menu.camera_mode.tooltip"));
|
|
||||||
this.rightDeadZoneOption = new SpruceDoubleOption("midnightcontrols.menu.right_dead_zone", 0.05, 1.0, .05f,
|
this.rightDeadZoneOption = new SpruceDoubleOption("midnightcontrols.menu.right_dead_zone", 0.05, 1.0, .05f,
|
||||||
() -> MidnightControlsConfig.rightDeadZone,
|
() -> MidnightControlsConfig.rightDeadZone,
|
||||||
value -> MidnightControlsConfig.rightDeadZone = value, option -> {
|
value -> MidnightControlsConfig.rightDeadZone = value, option -> {
|
||||||
var value = String.valueOf(option.get());
|
var value = String.valueOf(option.get());
|
||||||
return option.getDisplayText(Text.literal(value.substring(0, Math.min(value.length(), 5))));
|
return option.getDisplayText(new LiteralText(value.substring(0, Math.min(value.length(), 5))));
|
||||||
}, Text.translatable("midnightcontrols.menu.right_dead_zone.tooltip"));
|
}, new TranslatableText("midnightcontrols.tooltip.right_dead_zone"));
|
||||||
this.leftDeadZoneOption = new SpruceDoubleOption("midnightcontrols.menu.left_dead_zone", 0.05, 1.0, .05f,
|
this.leftDeadZoneOption = new SpruceDoubleOption("midnightcontrols.menu.left_dead_zone", 0.05, 1.0, .05f,
|
||||||
() -> MidnightControlsConfig.leftDeadZone,
|
() -> MidnightControlsConfig.leftDeadZone,
|
||||||
value -> MidnightControlsConfig.leftDeadZone = value, option -> {
|
value -> MidnightControlsConfig.leftDeadZone = value, option -> {
|
||||||
var value = String.valueOf(option.get());
|
var value = String.valueOf(option.get());
|
||||||
return option.getDisplayText(Text.literal(value.substring(0, Math.min(value.length(), 5))));
|
return option.getDisplayText(new LiteralText(value.substring(0, Math.min(value.length(), 5))));
|
||||||
}, Text.translatable("midnightcontrols.menu.left_dead_zone.tooltip"));
|
}, new TranslatableText("midnightcontrols.tooltip.left_dead_zone"));
|
||||||
this.invertsRightXAxis = new SpruceToggleBooleanOption("midnightcontrols.menu.invert_right_x_axis", () -> MidnightControlsConfig.invertRightXAxis,
|
this.invertsRightXAxis = new SpruceToggleBooleanOption("midnightcontrols.menu.invert_right_x_axis", () -> MidnightControlsConfig.invertRightXAxis,
|
||||||
value -> MidnightControlsConfig.invertRightXAxis = value, null);
|
value -> MidnightControlsConfig.invertRightXAxis = value, null);
|
||||||
this.invertsRightYAxis = new SpruceToggleBooleanOption("midnightcontrols.menu.invert_right_y_axis", () -> MidnightControlsConfig.invertRightYAxis,
|
this.invertsRightYAxis = new SpruceToggleBooleanOption("midnightcontrols.menu.invert_right_y_axis", () -> MidnightControlsConfig.invertRightYAxis,
|
||||||
value -> MidnightControlsConfig.invertRightYAxis = value, null);
|
value -> MidnightControlsConfig.invertRightYAxis = value, null);
|
||||||
this.unfocusedInputOption = new SpruceToggleBooleanOption("midnightcontrols.menu.unfocused_input", () -> MidnightControlsConfig.unfocusedInput,
|
this.unfocusedInputOption = new SpruceToggleBooleanOption("midnightcontrols.menu.unfocused_input", () -> MidnightControlsConfig.unfocusedInput,
|
||||||
value -> MidnightControlsConfig.unfocusedInput = value, Text.translatable("midnightcontrols.menu.unfocused_input.tooltip"));
|
value -> MidnightControlsConfig.unfocusedInput = value, new TranslatableText("midnightcontrols.tooltip.unfocused_input"));
|
||||||
this.virtualMouseOption = new SpruceToggleBooleanOption("midnightcontrols.menu.virtual_mouse", () -> MidnightControlsConfig.virtualMouse,
|
this.virtualMouseOption = new SpruceToggleBooleanOption("midnightcontrols.menu.virtual_mouse", () -> MidnightControlsConfig.virtualMouse,
|
||||||
value -> MidnightControlsConfig.virtualMouse = value, Text.translatable("midnightcontrols.menu.virtual_mouse.tooltip"));
|
value -> MidnightControlsConfig.virtualMouse = value, new TranslatableText("midnightcontrols.tooltip.virtual_mouse"));
|
||||||
this.hideCursorOption = new SpruceToggleBooleanOption("midnightcontrols.menu.hide_cursor", () -> MidnightControlsConfig.hideNormalMouse,
|
|
||||||
value -> MidnightControlsConfig.hideNormalMouse = value, Text.translatable("midnightcontrols.menu.hide_cursor.tooltip"));
|
|
||||||
// Touch options
|
|
||||||
this.touchModeOption = new SpruceCyclingOption("midnightcontrols.menu.touch_mode",
|
|
||||||
amount -> MidnightControlsConfig.touchMode = MidnightControlsConfig.touchMode.next(),
|
|
||||||
option -> option.getDisplayText(MidnightControlsConfig.touchMode.getTranslatedText()),
|
|
||||||
Text.translatable("midnightcontrols.menu.touch_mode.tooltip"));
|
|
||||||
this.touchWithControllerOption = new SpruceToggleBooleanOption("midnightcontrols.menu.touch_with_controller", () -> MidnightControlsConfig.touchInControllerMode,
|
|
||||||
value -> MidnightControlsConfig.touchInControllerMode = value, Text.translatable("midnightcontrols.menu.touch_with_controller.tooltip"));
|
|
||||||
this.touchSpeedOption = new SpruceDoubleOption("midnightcontrols.menu.touch_speed", 0.0, 150.0, .5f,
|
|
||||||
() -> MidnightControlsConfig.touchSpeed,
|
|
||||||
value -> MidnightControlsConfig.touchSpeed = value, option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))),
|
|
||||||
Text.translatable("midnightcontrols.menu.touch_speed.tooltip"));
|
|
||||||
this.touchBreakDelayOption = new SpruceDoubleOption("midnightcontrols.menu.touch_break_delay", 50, 500, 1f,
|
|
||||||
() -> (double) MidnightControlsConfig.touchBreakDelay,
|
|
||||||
value -> MidnightControlsConfig.touchBreakDelay = value.intValue(), option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))),
|
|
||||||
Text.translatable("midnightcontrols.menu.touch_break_delay.tooltip"));
|
|
||||||
this.touchTransparencyOption = new SpruceDoubleOption("midnightcontrols.menu.touch_transparency", 0, 100, 1f,
|
|
||||||
() -> (double) MidnightControlsConfig.touchTransparency,
|
|
||||||
value -> MidnightControlsConfig.touchTransparency = value.intValue(), option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))),
|
|
||||||
Text.translatable("midnightcontrols.menu.touch_break_delay.tooltip"));
|
|
||||||
this.invertTouchOption = new SpruceToggleBooleanOption("midnightcontrols.menu.invert_touch", () -> MidnightControlsConfig.invertTouch,
|
|
||||||
value -> MidnightControlsConfig.invertTouch = value, Text.translatable("midnightcontrols.menu.invert_touch.tooltip"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -346,8 +274,8 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
this.buildTabs();
|
this.buildTabs();
|
||||||
|
|
||||||
this.addDrawableChild(this.resetOption.createWidget(Position.of(this.width / 2 - 155, this.height - 29), 150));
|
this.addDrawableChild(this.resetOption.createWidget(Position.of(this.width / 2 - 155, this.height - 29), 150));
|
||||||
this.addDrawableChild(ButtonWidget.builder(SpruceTexts.GUI_DONE, btn -> this.client.setScreen(this.parent))
|
this.addDrawableChild(new ButtonWidget(this.width / 2 - 155 + 160, this.height - 29, 150, 20, SpruceTexts.GUI_DONE,
|
||||||
.dimensions(this.width / 2 - 155 + 160, this.height - 29, 150, 20).build());
|
btn -> this.client.setScreen(this.parent)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void buildTabs() {
|
public void buildTabs() {
|
||||||
@@ -357,24 +285,22 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
tabs.getList().setBackground(new MidnightControlsBackground());
|
tabs.getList().setBackground(new MidnightControlsBackground());
|
||||||
this.addDrawableChild(tabs);
|
this.addDrawableChild(tabs);
|
||||||
|
|
||||||
tabs.addSeparatorEntry(Text.translatable("midnightcontrols.menu.separator.general"));
|
tabs.addSeparatorEntry(new TranslatableText("midnightcontrols.menu.separator.general"));
|
||||||
tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.general"), null,
|
tabs.addTabEntry(new TranslatableText("midnightcontrols.menu.title.general"), null,
|
||||||
this::buildGeneralTab);
|
this::buildGeneralTab);
|
||||||
tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.gameplay"), null,
|
tabs.addTabEntry(new TranslatableText("midnightcontrols.menu.title.gameplay"), null,
|
||||||
this::buildGameplayTab);
|
this::buildGameplayTab);
|
||||||
tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.visual"), null,
|
tabs.addTabEntry(new TranslatableText("midnightcontrols.menu.title.visual"), null,
|
||||||
this::buildVisualTab);
|
this::buildVisualTab);
|
||||||
|
|
||||||
tabs.addSeparatorEntry(Text.translatable("options.controls"));
|
tabs.addSeparatorEntry(new TranslatableText("options.controls"));
|
||||||
tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.controller_controls"), null,
|
tabs.addTabEntry(new TranslatableText("midnightcontrols.menu.title.controller_controls"), null,
|
||||||
this::buildControllerControlsTab);
|
this::buildControllerControlsTab);
|
||||||
|
|
||||||
tabs.addSeparatorEntry(Text.translatable("midnightcontrols.menu.separator.controller"));
|
tabs.addSeparatorEntry(new TranslatableText("midnightcontrols.menu.separator.controller"));
|
||||||
tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.controller"), null,
|
tabs.addTabEntry(new TranslatableText("midnightcontrols.menu.title.controller"), null,
|
||||||
this::buildControllerTab);
|
this::buildControllerTab);
|
||||||
tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.touch"), null,
|
tabs.addTabEntry(new TranslatableText("midnightcontrols.menu.title.mappings.string"), null,
|
||||||
this::buildTouchTab);
|
|
||||||
tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.mappings.string"), null,
|
|
||||||
this::buildMappingsStringEditorTab);
|
this::buildMappingsStringEditorTab);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -387,10 +313,6 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
list.addSingleOptionEntry(this.yAxisRotationSpeedOption);
|
list.addSingleOptionEntry(this.yAxisRotationSpeedOption);
|
||||||
list.addSingleOptionEntry(this.mouseSpeedOption);
|
list.addSingleOptionEntry(this.mouseSpeedOption);
|
||||||
list.addSingleOptionEntry(this.virtualMouseOption);
|
list.addSingleOptionEntry(this.virtualMouseOption);
|
||||||
list.addSingleOptionEntry(this.hideCursorOption);
|
|
||||||
list.addSingleOptionEntry(this.joystickAsMouseOption);
|
|
||||||
list.addSingleOptionEntry(this.eyeTrackingAsMouseOption);
|
|
||||||
list.addSingleOptionEntry(this.advancedConfigOption);
|
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -399,8 +321,6 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
list.setBackground(new MidnightControlsBackground(130));
|
list.setBackground(new MidnightControlsBackground(130));
|
||||||
list.addSingleOptionEntry(this.analogMovementOption);
|
list.addSingleOptionEntry(this.analogMovementOption);
|
||||||
list.addSingleOptionEntry(this.doubleTapToSprintOption);
|
list.addSingleOptionEntry(this.doubleTapToSprintOption);
|
||||||
list.addSingleOptionEntry(this.controllerToggleSneakOption);
|
|
||||||
list.addSingleOptionEntry(this.controllerToggleSprintOption);
|
|
||||||
if (MidnightControls.isExtrasLoaded) list.addSingleOptionEntry(this.fastBlockPlacingOption);
|
if (MidnightControls.isExtrasLoaded) list.addSingleOptionEntry(this.fastBlockPlacingOption);
|
||||||
if (MidnightControls.isExtrasLoaded) list.addSingleOptionEntry(this.frontBlockPlacingOption);
|
if (MidnightControls.isExtrasLoaded) list.addSingleOptionEntry(this.frontBlockPlacingOption);
|
||||||
if (MidnightControls.isExtrasLoaded) list.addSingleOptionEntry(this.verticalReacharoundOption);
|
if (MidnightControls.isExtrasLoaded) list.addSingleOptionEntry(this.verticalReacharoundOption);
|
||||||
@@ -418,7 +338,6 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
list.addSingleOptionEntry(new SpruceSeparatorOption("midnightcontrols.menu.title.hud", true, null));
|
list.addSingleOptionEntry(new SpruceSeparatorOption("midnightcontrols.menu.title.hud", true, null));
|
||||||
list.addSingleOptionEntry(this.hudEnableOption);
|
list.addSingleOptionEntry(this.hudEnableOption);
|
||||||
list.addSingleOptionEntry(this.hudSideOption);
|
list.addSingleOptionEntry(this.hudSideOption);
|
||||||
list.addSingleOptionEntry(this.moveChatOption);
|
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -430,17 +349,17 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
var root = new SpruceContainerWidget(Position.origin(), width, height);
|
var root = new SpruceContainerWidget(Position.origin(), width, height);
|
||||||
|
|
||||||
var aboutMappings1 = new SpruceLabelWidget(Position.of(0, 2),
|
var aboutMappings1 = new SpruceLabelWidget(Position.of(0, 2),
|
||||||
Text.translatable("midnightcontrols.controller.mappings.1", SDL2_GAMEPAD_TOOL),
|
new TranslatableText("midnightcontrols.controller.mappings.1", SDL2_GAMEPAD_TOOL),
|
||||||
width, true);
|
width, true);
|
||||||
|
|
||||||
var gamepadToolUrlLabel = new SpruceLabelWidget(Position.of(0, aboutMappings1.getHeight() + 4),
|
var gamepadToolUrlLabel = new SpruceLabelWidget(Position.of(0, aboutMappings1.getHeight() + 4),
|
||||||
this.controllerMappingsUrlText, width,
|
this.controllerMappingsUrlText, width,
|
||||||
label -> Util.getOperatingSystem().open(GAMEPAD_TOOL_URL), true);
|
label -> Util.getOperatingSystem().open(GAMEPAD_TOOL_URL), true);
|
||||||
gamepadToolUrlLabel.setTooltip(Text.translatable("chat.link.open"));
|
gamepadToolUrlLabel.setTooltip(new TranslatableText("chat.link.open"));
|
||||||
|
|
||||||
var aboutMappings3 = new SpruceLabelWidget(Position.of(0,
|
var aboutMappings3 = new SpruceLabelWidget(Position.of(0,
|
||||||
aboutMappings1.getHeight() + gamepadToolUrlLabel.getHeight() + 6),
|
aboutMappings1.getHeight() + gamepadToolUrlLabel.getHeight() + 6),
|
||||||
Text.translatable("midnightcontrols.controller.mappings.3", Formatting.GREEN.toString(), Formatting.RESET.toString()),
|
new TranslatableText("midnightcontrols.controller.mappings.3", Formatting.GREEN.toString(), Formatting.RESET.toString()),
|
||||||
width, true);
|
width, true);
|
||||||
|
|
||||||
int listHeight = height - 8 - aboutMappings1.getHeight() - aboutMappings3.getHeight() - gamepadToolUrlLabel.getHeight();
|
int listHeight = height - 8 - aboutMappings1.getHeight() - aboutMappings3.getHeight() - gamepadToolUrlLabel.getHeight();
|
||||||
@@ -455,9 +374,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
list.setBackground(new MidnightControlsBackground(130));
|
list.setBackground(new MidnightControlsBackground(130));
|
||||||
list.addSingleOptionEntry(this.controllerOption);
|
list.addSingleOptionEntry(this.controllerOption);
|
||||||
list.addSingleOptionEntry(this.secondControllerOption);
|
list.addSingleOptionEntry(this.secondControllerOption);
|
||||||
list.addSingleOptionEntry(this.toggleControllerProfileOption);
|
|
||||||
list.addSingleOptionEntry(this.unfocusedInputOption);
|
list.addSingleOptionEntry(this.unfocusedInputOption);
|
||||||
list.addSingleOptionEntry(this.cameraModeOption);
|
|
||||||
list.addOptionEntry(this.invertsRightXAxis, this.invertsRightYAxis);
|
list.addOptionEntry(this.invertsRightXAxis, this.invertsRightYAxis);
|
||||||
list.addSingleOptionEntry(this.rightDeadZoneOption);
|
list.addSingleOptionEntry(this.rightDeadZoneOption);
|
||||||
list.addSingleOptionEntry(this.leftDeadZoneOption);
|
list.addSingleOptionEntry(this.leftDeadZoneOption);
|
||||||
@@ -469,39 +386,27 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
root.addChild(labels);
|
root.addChild(labels);
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
public SpruceOptionListWidget buildTouchTab(int width, int height) {
|
|
||||||
var list = new SpruceOptionListWidget(Position.origin(), width, height);
|
|
||||||
list.setBackground(new MidnightControlsBackground(130));
|
|
||||||
list.addSingleOptionEntry(this.touchSpeedOption);
|
|
||||||
list.addSingleOptionEntry(this.touchWithControllerOption);
|
|
||||||
list.addSingleOptionEntry(this.invertTouchOption);
|
|
||||||
list.addSingleOptionEntry(new SpruceSeparatorOption("midnightcontrols.menu.title.hud", true, null));
|
|
||||||
list.addSingleOptionEntry(this.touchModeOption);
|
|
||||||
list.addSingleOptionEntry(this.touchBreakDelayOption);
|
|
||||||
list.addSingleOptionEntry(this.touchTransparencyOption);
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SpruceContainerWidget buildMappingsStringEditorTab(int width, int height) {
|
public SpruceContainerWidget buildMappingsStringEditorTab(int width, int height) {
|
||||||
return new MappingsStringInputWidget(Position.origin(), width, height);
|
return new MappingsStringInputWidget(Position.origin(), width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void renderTitle(DrawContext context, int mouseX, int mouseY, float delta) {
|
public void renderTitle(MatrixStack matrices, int mouseX, int mouseY, float delta) {
|
||||||
context.drawCenteredTextWithShadow(this.textRenderer, I18n.translate("midnightcontrols.menu.title"), this.width / 2, 8, 16777215);
|
drawCenteredText(matrices, this.textRenderer, I18n.translate("midnightcontrols.menu.title"), this.width / 2, 8, 16777215);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class MidnightControlsBackground implements Background {
|
public static class MidnightControlsBackground implements Background {
|
||||||
private static int transparency = 160;
|
private int transparency = 160;
|
||||||
public MidnightControlsBackground() {}
|
public MidnightControlsBackground() {}
|
||||||
public MidnightControlsBackground(int transparency) {
|
public MidnightControlsBackground(int transparency) {
|
||||||
MidnightControlsBackground.transparency = transparency;
|
this.transparency = transparency;
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public void render(DrawContext context, SpruceWidget widget, int vOffset, int mouseX, int mouseY, float delta) {
|
public void render(MatrixStack matrixStack, SpruceWidget widget, int vOffset, int mouseX, int mouseY, float delta) {
|
||||||
fill(context.getMatrices(), widget.getX(), widget.getY(), widget.getX() + widget.getWidth(), widget.getY() + widget.getHeight(), MidnightColorUtil.hex2Rgb("#000000"));
|
fill(matrixStack, widget.getX(), widget.getY(), widget.getX() + widget.getWidth(), widget.getY() + widget.getHeight(), MidnightColorUtil.hex2Rgb("#000000"));
|
||||||
}
|
}
|
||||||
private static void fill(MatrixStack matrixStack, int x2, int y2, int x1, int y1, Color color) {
|
private void fill(MatrixStack matrixStack, int x2, int y2, int x1, int y1, Color color) {
|
||||||
matrixStack.push();
|
matrixStack.push();
|
||||||
|
|
||||||
Matrix4f matrix = matrixStack.peek().getPositionMatrix();
|
Matrix4f matrix = matrixStack.peek().getPositionMatrix();
|
||||||
@@ -509,15 +414,19 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
float g = (float)(color.getGreen()) / 255.0F;
|
float g = (float)(color.getGreen()) / 255.0F;
|
||||||
float b = (float)(color.getBlue()) / 255.0F;
|
float b = (float)(color.getBlue()) / 255.0F;
|
||||||
float t = (float)(transparency) / 255.0F;
|
float t = (float)(transparency) / 255.0F;
|
||||||
BufferBuilder bufferBuilder = Tessellator.getInstance().begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR);
|
BufferBuilder bufferBuilder = Tessellator.getInstance().getBuffer();
|
||||||
RenderSystem.enableBlend();
|
RenderSystem.enableBlend();
|
||||||
|
RenderSystem.disableTexture();
|
||||||
RenderSystem.defaultBlendFunc();
|
RenderSystem.defaultBlendFunc();
|
||||||
RenderSystem.setShader(GameRenderer::getPositionColorProgram);
|
RenderSystem.setShader(GameRenderer::getPositionColorShader);
|
||||||
bufferBuilder.vertex(matrix, (float)x1, (float)y2, 0.0F).color(r, g, b, t);
|
bufferBuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR);
|
||||||
bufferBuilder.vertex(matrix, (float)x2, (float)y2, 0.0F).color(r, g, b, t);
|
bufferBuilder.vertex(matrix, (float)x1, (float)y2, 0.0F).color(r, g, b, t).next();
|
||||||
bufferBuilder.vertex(matrix, (float)x2, (float)y1, 0.0F).color(r, g, b, t);
|
bufferBuilder.vertex(matrix, (float)x2, (float)y2, 0.0F).color(r, g, b, t).next();
|
||||||
bufferBuilder.vertex(matrix, (float)x1, (float)y1, 0.0F).color(r, g, b, t);
|
bufferBuilder.vertex(matrix, (float)x2, (float)y1, 0.0F).color(r, g, b, t).next();
|
||||||
BufferRenderer.drawWithGlobalProgram(bufferBuilder.end());
|
bufferBuilder.vertex(matrix, (float)x1, (float)y1, 0.0F).color(r, g, b, t).next();
|
||||||
|
bufferBuilder.end();
|
||||||
|
BufferRenderer.draw(bufferBuilder);
|
||||||
|
RenderSystem.enableTexture();
|
||||||
RenderSystem.disableBlend();
|
RenderSystem.disableBlend();
|
||||||
matrixStack.pop();
|
matrixStack.pop();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,11 +10,12 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.gui;
|
package eu.midnightdust.midnightcontrols.client.gui;
|
||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.Controller;
|
import eu.midnightdust.midnightcontrols.client.controller.Controller;
|
||||||
import org.thinkingstudio.obsidianui.option.SpruceSimpleActionOption;
|
import dev.lambdaurora.spruceui.option.SpruceSimpleActionOption;
|
||||||
import org.thinkingstudio.obsidianui.widget.SpruceButtonWidget;
|
import dev.lambdaurora.spruceui.widget.SpruceButtonWidget;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.toast.SystemToast;
|
import net.minecraft.client.toast.SystemToast;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableText;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
@@ -33,8 +34,8 @@ public class ReloadControllerMappingsOption {
|
|||||||
Controller.updateMappings();
|
Controller.updateMappings();
|
||||||
if (client.currentScreen instanceof MidnightControlsSettingsScreen)
|
if (client.currentScreen instanceof MidnightControlsSettingsScreen)
|
||||||
client.currentScreen.init(client, client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight());
|
client.currentScreen.init(client, client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight());
|
||||||
client.getToastManager().add(SystemToast.create(client, SystemToast.Type.PERIODIC_NOTIFICATION,
|
client.getToastManager().add(SystemToast.create(client, SystemToast.Type.TUTORIAL_HINT,
|
||||||
Text.translatable("midnightcontrols.controller.mappings.updated"), Text.empty()));
|
new TranslatableText("midnightcontrols.controller.mappings.updated"), Text.of("")));
|
||||||
}, Text.translatable("midnightcontrols.tooltip.reload_controller_mappings"));
|
}, new TranslatableText("midnightcontrols.tooltip.reload_controller_mappings"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,11 +10,10 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.gui;
|
package eu.midnightdust.midnightcontrols.client.gui;
|
||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
||||||
import eu.midnightdust.midnightcontrols.client.ring.RingButtonMode;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.ring.RingPage;
|
import eu.midnightdust.midnightcontrols.client.ring.RingPage;
|
||||||
import net.minecraft.client.gui.DrawContext;
|
|
||||||
import net.minecraft.client.gui.screen.Screen;
|
import net.minecraft.client.gui.screen.Screen;
|
||||||
import net.minecraft.client.gui.widget.ButtonWidget;
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
|
import net.minecraft.text.LiteralText;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -28,59 +27,27 @@ public class RingScreen extends Screen {
|
|||||||
protected final MidnightControlsClient mod;
|
protected final MidnightControlsClient mod;
|
||||||
|
|
||||||
public RingScreen() {
|
public RingScreen() {
|
||||||
super(Text.literal("midnightcontrols.menu.title.ring"));
|
super(new LiteralText("midnightcontrols.menu.title.ring"));
|
||||||
this.mod = MidnightControlsClient.get();
|
this.mod = MidnightControlsClient.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void init() {
|
|
||||||
super.init();
|
|
||||||
if (mod.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 -> this.mod.ring.cyclePage(true)).dimensions(width - 25, 5, 20, 20).build());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean shouldPause() {
|
public boolean shouldPause() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
|
public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
|
||||||
super.render(context, mouseX, mouseY, delta);
|
super.render(matrices, mouseX, mouseY, delta);
|
||||||
|
|
||||||
RingPage page = this.mod.ring.getCurrentPage();
|
RingPage page = this.mod.ring.getCurrentPage();
|
||||||
page.render(context, this.textRenderer, this.width, this.height, mouseX, mouseY, delta);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
page.render(matrices, this.textRenderer, this.width, this.height, mouseX, mouseY, delta);
|
||||||
public void close() {
|
|
||||||
super.close();
|
|
||||||
assert client != null;
|
|
||||||
client.currentScreen = null;
|
|
||||||
RingPage page = this.mod.ring.getCurrentPage();
|
|
||||||
if (RingPage.selected >= 0 && page.actions[RingPage.selected] != null)
|
|
||||||
page.actions[RingPage.selected].activate(RingButtonMode.PRESS);
|
|
||||||
RingPage.selected = -1;
|
|
||||||
this.removed();
|
|
||||||
}
|
}
|
||||||
// @Override
|
|
||||||
// public boolean changeFocus(boolean lookForwards) {
|
|
||||||
// if (lookForwards) {
|
|
||||||
// if (RingPage.selected < 7) ++RingPage.selected;
|
|
||||||
// else RingPage.selected = -1;
|
|
||||||
// }
|
|
||||||
// else {
|
|
||||||
// if (RingPage.selected > -1) --RingPage.selected;
|
|
||||||
// else RingPage.selected = 7;
|
|
||||||
// }
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
|
|
||||||
@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 (mod.ring.getCurrentPage().onClick(client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight(), (int) mouseX, (int) mouseY)) {
|
||||||
this.close();
|
this.close();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,41 +9,28 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.gui;
|
package eu.midnightdust.midnightcontrols.client.gui;
|
||||||
|
|
||||||
import org.thinkingstudio.obsidianui.Position;
|
import dev.lambdaurora.spruceui.Position;
|
||||||
import org.thinkingstudio.obsidianui.widget.SpruceButtonWidget;
|
import dev.lambdaurora.spruceui.widget.SpruceButtonWidget;
|
||||||
import eu.midnightdust.lib.util.PlatformFunctions;
|
import eu.midnightdust.midnightcontrols.client.HudSide;
|
||||||
import eu.midnightdust.midnightcontrols.MidnightControlsConstants;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.ButtonState;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.HudSide;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
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.gui.widget.SilentTexturedButtonWidget;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.touch.gui.ItemUseButtonWidget;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.touch.gui.SilentTexturedButtonWidget;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.touch.TouchUtils;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.util.KeyBindingAccessor;
|
import eu.midnightdust.midnightcontrols.client.util.KeyBindingAccessor;
|
||||||
import net.minecraft.client.gui.DrawContext;
|
import net.minecraft.client.gui.screen.ChatScreen;
|
||||||
import net.minecraft.client.gui.screen.*;
|
import net.minecraft.client.gui.screen.GameMenuScreen;
|
||||||
|
import net.minecraft.client.gui.screen.Screen;
|
||||||
import net.minecraft.client.gui.screen.ingame.InventoryScreen;
|
import net.minecraft.client.gui.screen.ingame.InventoryScreen;
|
||||||
import net.minecraft.client.gui.widget.TextIconButtonWidget;
|
import net.minecraft.client.gui.widget.TexturedButtonWidget;
|
||||||
import net.minecraft.client.option.KeyBinding;
|
|
||||||
import net.minecraft.client.texture.MissingSprite;
|
|
||||||
import net.minecraft.client.texture.Sprite;
|
|
||||||
import net.minecraft.client.util.InputUtil;
|
|
||||||
import net.minecraft.item.*;
|
|
||||||
import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket;
|
import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket;
|
||||||
|
import net.minecraft.text.LiteralText;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
import net.minecraft.util.*;
|
import net.minecraft.util.Arm;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
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.jetbrains.annotations.NotNull;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
@@ -51,49 +38,47 @@ import static org.lwjgl.glfw.GLFW.GLFW_GAMEPAD_AXIS_RIGHT_Y;
|
|||||||
* Represents the touchscreen overlay
|
* Represents the touchscreen overlay
|
||||||
*/
|
*/
|
||||||
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 = new Identifier("midnightcontrols", "textures/gui/widgets.png");
|
||||||
private final MidnightControlsClient mod;
|
private MidnightControlsClient mod;
|
||||||
private SilentTexturedButtonWidget inventoryButton;
|
|
||||||
private SilentTexturedButtonWidget swapHandsButton;
|
|
||||||
private SilentTexturedButtonWidget dropButton;
|
|
||||||
private ItemUseButtonWidget useButton;
|
|
||||||
private SilentTexturedButtonWidget jumpButton;
|
private SilentTexturedButtonWidget jumpButton;
|
||||||
private SilentTexturedButtonWidget flyButton;
|
private SilentTexturedButtonWidget flyButton;
|
||||||
private SilentTexturedButtonWidget flyUpButton;
|
private SilentTexturedButtonWidget flyUpButton;
|
||||||
private SilentTexturedButtonWidget flyDownButton;
|
private SilentTexturedButtonWidget flyDownButton;
|
||||||
private SilentTexturedButtonWidget forwardButton;
|
|
||||||
private SilentTexturedButtonWidget forwardLeftButton;
|
|
||||||
private SilentTexturedButtonWidget forwardRightButton;
|
|
||||||
private SilentTexturedButtonWidget leftButton;
|
|
||||||
private SilentTexturedButtonWidget rightButton;
|
|
||||||
private SilentTexturedButtonWidget backButton;
|
|
||||||
private SilentTexturedButtonWidget startSneakButton;
|
|
||||||
private SilentTexturedButtonWidget endSneakButton;
|
|
||||||
private int flyButtonEnableTicks = 0;
|
private int flyButtonEnableTicks = 0;
|
||||||
private int forwardButtonTick = 0;
|
private int forwardButtonTick = 0;
|
||||||
public static TouchscreenOverlay instance;
|
private SilentTexturedButtonWidget forwardLeftButton;
|
||||||
|
private SilentTexturedButtonWidget forwardRightButton;
|
||||||
|
private SilentTexturedButtonWidget startSneakButton;
|
||||||
|
private SilentTexturedButtonWidget endSneakButton;
|
||||||
|
|
||||||
public TouchscreenOverlay(@NotNull MidnightControlsClient mod) {
|
public TouchscreenOverlay(@NotNull MidnightControlsClient mod) {
|
||||||
super(Text.literal("Touchscreen overlay"));
|
super(new LiteralText("Touchscreen overlay"));
|
||||||
this.mod = mod;
|
this.mod = mod;
|
||||||
|
this.passEvents = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean shouldPause() {
|
public boolean shouldPause()
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void renderInGameBackground(DrawContext context) {}
|
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
|
||||||
|
super.keyPressed(keyCode,scanCode,modifiers);
|
||||||
|
//return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
private void pauseGame(boolean bl) {
|
||||||
protected void applyBlur(float delta) {}
|
if (this.client == null)
|
||||||
|
return;
|
||||||
private void pauseGame() {
|
boolean bl2 = this.client.isIntegratedServerRunning() && !this.client.getServer().isRemote();
|
||||||
assert this.client != null;
|
if (bl2) {
|
||||||
this.client.setScreen(new GameMenuScreen(true));
|
this.client.setScreen(new GameMenuScreen(!bl));
|
||||||
if (this.client.isIntegratedServerRunning() && !Objects.requireNonNull(this.client.getServer()).isRemote()) {
|
|
||||||
this.client.getSoundManager().pauseAll();
|
this.client.getSoundManager().pauseAll();
|
||||||
|
} else {
|
||||||
|
this.client.setScreen(new GameMenuScreen(true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,26 +89,24 @@ public class TouchscreenOverlay extends Screen {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private void updateForwardButtonsState(boolean state) {
|
private void updateForwardButtonsState(boolean state) {
|
||||||
this.forwardButtonTick = state ? -1 : 20;
|
if (state)
|
||||||
|
this.forwardButtonTick = -1;
|
||||||
|
else
|
||||||
|
this.forwardButtonTick = 20;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the jump buttons.
|
* Updates the jump buttons.
|
||||||
*/
|
*/
|
||||||
private void updateJumpButtons() {
|
private void updateJumpButtons() {
|
||||||
assert this.client != null;
|
if (this.client == null)
|
||||||
assert this.client.player != null;
|
return;
|
||||||
float transparency = MidnightControlsConfig.touchTransparency / 100f;
|
if (!this.client.interactionManager.isFlyingLocked()) {
|
||||||
|
|
||||||
if (this.client.player.getAbilities().flying) {
|
|
||||||
boolean oldStateFly = this.flyButton.isVisible();
|
boolean oldStateFly = this.flyButton.isVisible();
|
||||||
this.jumpButton.setVisible(false);
|
this.jumpButton.setVisible(false);
|
||||||
this.flyButton.setVisible(true);
|
this.flyButton.setVisible(true);
|
||||||
this.flyUpButton.setVisible(true);
|
this.flyUpButton.setVisible(true);
|
||||||
this.flyDownButton.setVisible(true);
|
this.flyDownButton.setVisible(true);
|
||||||
this.flyButton.setAlpha(transparency);
|
|
||||||
this.flyUpButton.setAlpha(transparency);
|
|
||||||
this.flyDownButton.setAlpha(transparency);
|
|
||||||
if (oldStateFly != this.flyButton.isVisible()) {
|
if (oldStateFly != this.flyButton.isVisible()) {
|
||||||
this.flyButtonEnableTicks = 5;
|
this.flyButtonEnableTicks = 5;
|
||||||
this.setJump(false);
|
this.setJump(false);
|
||||||
@@ -134,7 +117,6 @@ public class TouchscreenOverlay extends Screen {
|
|||||||
this.flyButton.setVisible(false);
|
this.flyButton.setVisible(false);
|
||||||
this.flyUpButton.setVisible(false);
|
this.flyUpButton.setVisible(false);
|
||||||
this.flyDownButton.setVisible(false);
|
this.flyDownButton.setVisible(false);
|
||||||
this.jumpButton.setAlpha(transparency);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,7 +126,6 @@ public class TouchscreenOverlay extends Screen {
|
|||||||
* @param btn The pressed button.
|
* @param btn The pressed button.
|
||||||
*/
|
*/
|
||||||
private void handleJump(SpruceButtonWidget btn) {
|
private void handleJump(SpruceButtonWidget btn) {
|
||||||
assert this.client != null;
|
|
||||||
((KeyBindingAccessor) this.client.options.jumpKey).midnightcontrols$handlePressState(btn.isActive());
|
((KeyBindingAccessor) this.client.options.jumpKey).midnightcontrols$handlePressState(btn.isActive());
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@@ -153,49 +134,48 @@ public class TouchscreenOverlay extends Screen {
|
|||||||
* @param state The state.
|
* @param state The state.
|
||||||
*/
|
*/
|
||||||
private void setJump(boolean state) {
|
private void setJump(boolean state) {
|
||||||
assert this.client != null;
|
|
||||||
((KeyBindingAccessor) this.client.options.jumpKey).midnightcontrols$handlePressState(state);
|
((KeyBindingAccessor) this.client.options.jumpKey).midnightcontrols$handlePressState(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void tick() {
|
||||||
|
if (this.forwardButtonTick > 0) {
|
||||||
|
this.forwardButtonTick--;
|
||||||
|
} else if (this.forwardButtonTick == 0) {
|
||||||
|
if (this.forwardLeftButton.isVisible())
|
||||||
|
this.forwardLeftButton.setVisible(false);
|
||||||
|
if (this.forwardRightButton.isVisible())
|
||||||
|
this.forwardRightButton.setVisible(false);
|
||||||
|
}
|
||||||
|
this.updateJumpButtons();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void init() {
|
protected void init() {
|
||||||
super.init();
|
super.init();
|
||||||
assert this.client != null;
|
|
||||||
assert this.client.player != null;
|
|
||||||
assert this.client.interactionManager != null;
|
|
||||||
int scaledWidth = this.client.getWindow().getScaledWidth();
|
int scaledWidth = this.client.getWindow().getScaledWidth();
|
||||||
int scaledHeight = this.client.getWindow().getScaledHeight();
|
int scaledHeight = this.client.getWindow().getScaledHeight();
|
||||||
int emoteOffset = 0;
|
this.addDrawableChild(new TexturedButtonWidget(scaledWidth / 2 - 20, 0, 20, 20, 0, 106, 20, new Identifier("textures/gui/widgets.png"), 256, 256,
|
||||||
if (PlatformFunctions.isModLoaded("emotecraft")) {
|
btn -> this.client.setScreen(new ChatScreen("")), Text.of("")));
|
||||||
emoteOffset = 10;
|
this.addDrawableChild(new TexturedButtonWidget(scaledWidth / 2, 0, 20, 20, 0, 0, 20, WIDGETS_LOCATION, 256, 256,
|
||||||
TextIconButtonWidget emoteButton = TextIconButtonWidget.builder(Text.empty(), btn -> EmotecraftCompat.openEmotecraftScreen(this), true).width(20).texture(Identifier.of(MidnightControlsConstants.NAMESPACE, "touch/emote"), 20, 20).build();
|
btn -> this.pauseGame(false)));
|
||||||
emoteButton.setPosition(scaledWidth / 2 - 30, 0);
|
|
||||||
this.addDrawableChild(emoteButton);
|
|
||||||
}
|
|
||||||
|
|
||||||
TextIconButtonWidget chatButton = TextIconButtonWidget.builder(Text.empty(), btn -> this.client.setScreen(new ChatScreen("")), true).width(20).texture(Identifier.of(MidnightControlsConstants.NAMESPACE, "touch/chat"), 20, 20).build();
|
|
||||||
chatButton.setPosition(scaledWidth / 2 - 20 + emoteOffset, 0);
|
|
||||||
this.addDrawableChild(chatButton);
|
|
||||||
TextIconButtonWidget pauseButton = TextIconButtonWidget.builder(Text.empty(), btn -> this.pauseGame(), true).width(20).texture(Identifier.of(MidnightControlsConstants.NAMESPACE, "touch/pause"), 20, 20).build();
|
|
||||||
pauseButton.setPosition(scaledWidth / 2 + emoteOffset, 0);
|
|
||||||
this.addDrawableChild(pauseButton);
|
|
||||||
// Inventory buttons.
|
// Inventory buttons.
|
||||||
int inventoryButtonX = scaledWidth / 2;
|
int inventoryButtonX = scaledWidth / 2;
|
||||||
int inventoryButtonY = scaledHeight - 16 - 5;
|
int inventoryButtonY = scaledHeight - 16 - 5;
|
||||||
if (this.client.options.getMainArm().getValue() == Arm.LEFT) {
|
if (this.client.options.mainArm == Arm.LEFT) {
|
||||||
inventoryButtonX = inventoryButtonX - 91 - 24;
|
inventoryButtonX = inventoryButtonX - 91 - 24;
|
||||||
} else {
|
} else {
|
||||||
inventoryButtonX = inventoryButtonX + 91 + 4;
|
inventoryButtonX = inventoryButtonX + 91 + 4;
|
||||||
}
|
}
|
||||||
this.addDrawableChild(this.inventoryButton = new SilentTexturedButtonWidget(Position.of(inventoryButtonX, inventoryButtonY), 20, 20, Text.empty(), btn -> {
|
this.addDrawableChild(new TexturedButtonWidget(inventoryButtonX, inventoryButtonY, 20, 20, 20, 0, 20, WIDGETS_LOCATION, 256, 256,
|
||||||
if (this.client.interactionManager.hasRidingInventory()) {
|
btn -> {
|
||||||
this.client.player.openRidingInventory();
|
if (this.client.interactionManager.hasRidingInventory()) {
|
||||||
} else {
|
this.client.player.openRidingInventory();
|
||||||
this.client.getTutorialManager().onInventoryOpened();
|
} else {
|
||||||
this.client.setScreen(new InventoryScreen(this.client.player));
|
this.client.getTutorialManager().onInventoryOpened();
|
||||||
}
|
this.client.setScreen(new InventoryScreen(this.client.player));
|
||||||
}, 20, 0, 20, WIDGETS_LOCATION, 256, 256));
|
}
|
||||||
;
|
}));
|
||||||
int jumpButtonX, swapHandsX, sneakButtonX;
|
int jumpButtonX, swapHandsX, sneakButtonX;
|
||||||
int sneakButtonY = scaledHeight - 10 - 40 - 5;
|
int sneakButtonY = scaledHeight - 10 - 40 - 5;
|
||||||
if (MidnightControlsConfig.hudSide == HudSide.LEFT) {
|
if (MidnightControlsConfig.hudSide == HudSide.LEFT) {
|
||||||
@@ -208,38 +188,32 @@ public class TouchscreenOverlay extends Screen {
|
|||||||
sneakButtonX = scaledWidth - 10 - 40 - 5;
|
sneakButtonX = scaledWidth - 10 - 40 - 5;
|
||||||
}
|
}
|
||||||
// Swap items hand.
|
// Swap items hand.
|
||||||
this.addDrawableChild(this.swapHandsButton = new SilentTexturedButtonWidget(Position.of(swapHandsX, sneakButtonY), 20, 20, Text.empty(),
|
this.addDrawableChild(new SilentTexturedButtonWidget(Position.of(swapHandsX, sneakButtonY), 20, 20, Text.of(""),
|
||||||
button -> {
|
button -> {
|
||||||
if (button.isActive()) {
|
if (button.isActive()) {
|
||||||
if (!this.client.player.isSpectator()) {
|
if (!this.client.player.isSpectator()) {
|
||||||
Objects.requireNonNull(this.client.getNetworkHandler()).sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.SWAP_ITEM_WITH_OFFHAND, BlockPos.ORIGIN, Direction.DOWN));
|
this.client.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.SWAP_ITEM_WITH_OFFHAND, BlockPos.ORIGIN, Direction.DOWN));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},0, 160, 20, WIDGETS_LOCATION));
|
},0, 160, 20, WIDGETS_LOCATION));
|
||||||
// Drop
|
// Drop
|
||||||
this.addDrawableChild(this.dropButton = new SilentTexturedButtonWidget(Position.of(swapHandsX, sneakButtonY + 5 + 20), 20, 20, Text.empty(), btn -> {
|
this.addDrawableChild(new SilentTexturedButtonWidget(Position.of(swapHandsX, sneakButtonY + 5 + 20), 20, 20, Text.of(""), btn ->
|
||||||
if (btn.isActive() && !client.player.isSpectator() && client.player.dropSelectedItem(false)) {
|
((KeyBindingAccessor) this.client.options.dropKey).midnightcontrols$handlePressState(btn.isActive()), 0, 160, 20, WIDGETS_LOCATION));
|
||||||
client.player.swingHand(Hand.MAIN_HAND);
|
|
||||||
}
|
|
||||||
}, 20, 160, 20, WIDGETS_LOCATION));
|
|
||||||
// Use
|
|
||||||
this.addDrawableChild(this.useButton = new ItemUseButtonWidget(Position.of(width/2-25, height - 70), 50, 17, Text.translatable(MidnightControlsConstants.NAMESPACE+".action.eat"), btn ->
|
|
||||||
client.interactionManager.interactItem(client.player, client.player.getActiveHand())));
|
|
||||||
// Jump keys
|
// Jump keys
|
||||||
this.addDrawableChild(this.jumpButton = new SilentTexturedButtonWidget(Position.of(jumpButtonX, sneakButtonY), 20, 20, Text.empty(), this::handleJump, 0, 40, 20, WIDGETS_LOCATION));
|
this.addDrawableChild(this.jumpButton = new SilentTexturedButtonWidget(Position.of(jumpButtonX, sneakButtonY), 20, 20, Text.of(""), this::handleJump, 0, 40, 20, WIDGETS_LOCATION));
|
||||||
this.addDrawableChild(this.flyButton = new SilentTexturedButtonWidget(Position.of(jumpButtonX, sneakButtonY), 20, 20, Text.empty(),btn -> {
|
this.addDrawableChild(this.flyButton = new SilentTexturedButtonWidget(Position.of(jumpButtonX, sneakButtonY), 20, 20, Text.of(""),btn -> {
|
||||||
if (this.flyButtonEnableTicks == 0) this.client.player.getAbilities().flying = false;
|
if (this.flyButtonEnableTicks == 0) this.client.player.getAbilities().flying = false;
|
||||||
}, 20, 40, 20, WIDGETS_LOCATION)
|
}, 20, 40, 20, WIDGETS_LOCATION)
|
||||||
);
|
);
|
||||||
this.addDrawableChild(this.flyUpButton = new SilentTexturedButtonWidget(Position.of(jumpButtonX, sneakButtonY - 5 - 20), 20, 20,Text.empty(),
|
this.addDrawableChild(this.flyUpButton = new SilentTexturedButtonWidget(Position.of(jumpButtonX, sneakButtonY - 5 - 20), 20, 20,Text.of(""),
|
||||||
this::handleJump, 40, 40, 20, WIDGETS_LOCATION
|
this::handleJump, 40, 40, 20, WIDGETS_LOCATION
|
||||||
));
|
));
|
||||||
this.addDrawableChild(this.flyDownButton = new SilentTexturedButtonWidget(Position.of(jumpButtonX, sneakButtonY + 20 + 5), 20, 20, Text.empty(),
|
this.addDrawableChild(this.flyDownButton = new SilentTexturedButtonWidget(Position.of(jumpButtonX, sneakButtonY + 20 + 5), 20, 20, Text.of(""),
|
||||||
btn -> ((KeyBindingAccessor) this.client.options.sneakKey).midnightcontrols$handlePressState(btn.isActive()), 60, 40, 20, WIDGETS_LOCATION
|
btn -> ((KeyBindingAccessor) this.client.options.sneakKey).midnightcontrols$handlePressState(btn.isActive()), 60, 40, 20, WIDGETS_LOCATION
|
||||||
));
|
));
|
||||||
this.updateJumpButtons();
|
this.updateJumpButtons();
|
||||||
// Movements keys
|
// Movements keys
|
||||||
this.addDrawableChild((this.startSneakButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX, sneakButtonY), 20, 20, Text.empty(), btn -> {
|
this.addDrawableChild((this.startSneakButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX, sneakButtonY), 20, 20, Text.of(""), btn -> {
|
||||||
if (btn.isActive()) {
|
if (btn.isActive()) {
|
||||||
((KeyBindingAccessor) this.client.options.sneakKey).midnightcontrols$handlePressState(true);
|
((KeyBindingAccessor) this.client.options.sneakKey).midnightcontrols$handlePressState(true);
|
||||||
this.startSneakButton.setVisible(false);
|
this.startSneakButton.setVisible(false);
|
||||||
@@ -247,133 +221,76 @@ public class TouchscreenOverlay extends Screen {
|
|||||||
}
|
}
|
||||||
}, 0, 120, 20, WIDGETS_LOCATION))
|
}, 0, 120, 20, WIDGETS_LOCATION))
|
||||||
);
|
);
|
||||||
this.addDrawableChild((this.endSneakButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX, sneakButtonY), 20, 20, Text.empty(), btn -> {
|
this.addDrawableChild((this.endSneakButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX, sneakButtonY), 20, 20, Text.of(""), btn -> {
|
||||||
if (btn.isActive()) {
|
if (btn.isActive()) {
|
||||||
((KeyBindingAccessor) this.client.options.sneakKey).midnightcontrols$handlePressState(false);
|
((KeyBindingAccessor) this.client.options.sneakKey).midnightcontrols$handlePressState(false);
|
||||||
this.endSneakButton.setVisible(false);
|
this.endSneakButton.setVisible(false);
|
||||||
this.startSneakButton.setVisible(true);
|
this.startSneakButton.setVisible(true);
|
||||||
}
|
}
|
||||||
}, 20, 120, 20, WIDGETS_LOCATION)));
|
}, 20, 120, 20, WIDGETS_LOCATION)));
|
||||||
this.addDrawableChild(this.forwardLeftButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX - 20 - 5, sneakButtonY - 5 - 20), 20, 20, Text.empty(), btn -> {
|
this.endSneakButton.setVisible(false);
|
||||||
|
this.addDrawableChild(this.forwardLeftButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX - 20 - 5, sneakButtonY - 5 - 20), 20, 20, Text.of(""), btn -> {
|
||||||
((KeyBindingAccessor) this.client.options.forwardKey).midnightcontrols$handlePressState(btn.isActive());
|
((KeyBindingAccessor) this.client.options.forwardKey).midnightcontrols$handlePressState(btn.isActive());
|
||||||
((KeyBindingAccessor) this.client.options.leftKey).midnightcontrols$handlePressState(btn.isActive());
|
((KeyBindingAccessor) this.client.options.leftKey).midnightcontrols$handlePressState(btn.isActive());
|
||||||
this.updateForwardButtonsState(btn.isActive());
|
this.updateForwardButtonsState(btn.isActive());
|
||||||
}, 80, 80, 20, WIDGETS_LOCATION
|
}, 80, 80, 20, WIDGETS_LOCATION
|
||||||
));
|
));
|
||||||
this.addDrawableChild(this.forwardButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX, sneakButtonY - 5 - 20), 20, 20, Text.empty(), btn -> {
|
this.forwardLeftButton.setVisible(false);
|
||||||
|
this.addDrawableChild(new SilentTexturedButtonWidget(Position.of(sneakButtonX, sneakButtonY - 5 - 20), 20, 20, Text.of(""), btn -> {
|
||||||
((KeyBindingAccessor) this.client.options.forwardKey).midnightcontrols$handlePressState(btn.isActive());
|
((KeyBindingAccessor) this.client.options.forwardKey).midnightcontrols$handlePressState(btn.isActive());
|
||||||
this.updateForwardButtonsState(btn.isActive());
|
this.updateForwardButtonsState(btn.isActive());
|
||||||
this.forwardLeftButton.setVisible(true);
|
this.forwardLeftButton.setVisible(true);
|
||||||
this.forwardRightButton.setVisible(true);
|
this.forwardRightButton.setVisible(true);
|
||||||
}, 0, 80, 20, WIDGETS_LOCATION
|
}, 0, 80, 20, WIDGETS_LOCATION
|
||||||
));
|
));
|
||||||
this.addDrawableChild(this.forwardRightButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX + 20 + 5, sneakButtonY - 5 - 20), 20, 20, Text.empty(), btn -> {
|
this.addDrawableChild(this.forwardRightButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX + 20 + 5, sneakButtonY - 5 - 20), 20, 20, Text.of(""), btn -> {
|
||||||
((KeyBindingAccessor) this.client.options.forwardKey).midnightcontrols$handlePressState(btn.isActive());
|
((KeyBindingAccessor) this.client.options.forwardKey).midnightcontrols$handlePressState(btn.isActive());
|
||||||
((KeyBindingAccessor) this.client.options.rightKey).midnightcontrols$handlePressState(btn.isActive());
|
((KeyBindingAccessor) this.client.options.rightKey).midnightcontrols$handlePressState(btn.isActive());
|
||||||
this.updateForwardButtonsState(btn.isActive());
|
this.updateForwardButtonsState(btn.isActive());
|
||||||
}, 100, 80, 20, WIDGETS_LOCATION
|
}, 100, 80, 20, WIDGETS_LOCATION
|
||||||
));
|
));
|
||||||
|
this.forwardRightButton.setVisible(true);
|
||||||
this.addDrawableChild(this.rightButton =new SilentTexturedButtonWidget(Position.of(sneakButtonX + 20 + 5, sneakButtonY), 20, 20, Text.empty(),
|
this.addDrawableChild(new SilentTexturedButtonWidget(Position.of(sneakButtonX + 20 + 5, sneakButtonY), 20, 20, Text.of(""),
|
||||||
btn -> ((KeyBindingAccessor) this.client.options.rightKey).midnightcontrols$handlePressState(btn.isActive()), 20, 80, 20, WIDGETS_LOCATION
|
btn -> ((KeyBindingAccessor) this.client.options.rightKey).midnightcontrols$handlePressState(btn.isActive()), 20, 80, 20, WIDGETS_LOCATION
|
||||||
));
|
));
|
||||||
this.addDrawableChild(this.backButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX, sneakButtonY + 20 + 5), 20, 20, Text.empty(),
|
this.addDrawableChild(new SilentTexturedButtonWidget(Position.of(sneakButtonX, sneakButtonY + 20 + 5), 20, 20, Text.of(""),
|
||||||
btn -> ((KeyBindingAccessor) this.client.options.backKey).midnightcontrols$handlePressState(btn.isActive()), 40, 80, 20, WIDGETS_LOCATION
|
btn -> ((KeyBindingAccessor) this.client.options.backKey).midnightcontrols$handlePressState(btn.isActive()), 40, 80, 20, WIDGETS_LOCATION
|
||||||
));
|
));
|
||||||
this.addDrawableChild(this.leftButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX - 20 - 5, sneakButtonY), 20, 20, Text.empty(),
|
this.addDrawableChild(new SilentTexturedButtonWidget(Position.of(sneakButtonX - 20 - 5, sneakButtonY), 20, 20, Text.of(""),
|
||||||
btn -> ((KeyBindingAccessor) this.client.options.leftKey).midnightcontrols$handlePressState(btn.isActive()), 60, 80, 20, WIDGETS_LOCATION
|
btn -> ((KeyBindingAccessor) this.client.options.leftKey).midnightcontrols$handlePressState(btn.isActive()), 60, 80, 20, WIDGETS_LOCATION
|
||||||
));
|
));
|
||||||
initCustomButtons(true);
|
|
||||||
initCustomButtons(false);
|
|
||||||
|
|
||||||
this.setButtonProperties(MidnightControlsConfig.touchTransparency / 100f);
|
|
||||||
TouchscreenOverlay.instance = this;
|
|
||||||
}
|
|
||||||
private void initCustomButtons(boolean left) {
|
|
||||||
assert client != null;
|
|
||||||
Identifier emptySprite = Identifier.of(MidnightControlsConstants.NAMESPACE, "touch/empty");
|
|
||||||
List<String> list = left ? MidnightControlsConfig.leftTouchBinds : MidnightControlsConfig.rightTouchBinds;
|
|
||||||
Sprite missingSprite = client.getGuiAtlasManager().getSprite(MissingSprite.getMissingSpriteId());
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
String bindName = list.get(i);
|
|
||||||
ButtonBinding binding = InputManager.getBinding(bindName);
|
|
||||||
if (binding == null) continue;
|
|
||||||
boolean hasTexture = client.getGuiAtlasManager().getSprite(Identifier.of(MidnightControlsConstants.NAMESPACE, "binding/"+bindName)) != missingSprite;
|
|
||||||
if (MidnightControlsConfig.debug) System.out.println(left +" "+Identifier.of(MidnightControlsConstants.NAMESPACE, "binding/"+bindName)+" "+ hasTexture);
|
|
||||||
var button = TextIconButtonWidget.builder(Text.translatable(binding.getTranslationKey()), b -> binding.handle(client, 1, ButtonState.PRESS), hasTexture)
|
|
||||||
.texture(hasTexture ? Identifier.of(MidnightControlsConstants.NAMESPACE, "binding/"+bindName) : emptySprite, 20, 20).dimension(20, 20).build();
|
|
||||||
button.setPosition(left ? (3+(i*23)) : this.width-(23+(i*23)), 3);
|
|
||||||
button.setAlpha(MidnightControlsConfig.touchTransparency / 100f);
|
|
||||||
this.addDrawableChild(button);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private void setButtonProperties(float transparency) {
|
|
||||||
this.inventoryButton.setAlpha(transparency);
|
|
||||||
this.dropButton.setAlpha(transparency);
|
|
||||||
this.swapHandsButton.setAlpha(transparency);
|
|
||||||
this.jumpButton.setAlpha(transparency);
|
|
||||||
this.flyButton.setAlpha(transparency);
|
|
||||||
this.flyUpButton.setAlpha(transparency);
|
|
||||||
this.useButton.setAlpha(Math.min(transparency+0.1f, 1.0f));
|
|
||||||
this.flyDownButton.setAlpha(transparency);
|
|
||||||
this.startSneakButton.setAlpha(transparency);
|
|
||||||
this.endSneakButton.setAlpha(transparency);
|
|
||||||
this.forwardButton.setAlpha(transparency);
|
|
||||||
this.forwardLeftButton.setAlpha(Math.max(0.05f, transparency-0.1f));
|
|
||||||
this.forwardRightButton.setAlpha(Math.max(0.05f, transparency-0.1f));
|
|
||||||
this.leftButton.setAlpha(transparency);
|
|
||||||
this.rightButton.setAlpha(transparency);
|
|
||||||
this.backButton.setAlpha(transparency);
|
|
||||||
this.useButton.setAlpha(Math.min(transparency+0.1f, 1.0f));
|
|
||||||
this.endSneakButton.setVisible(false);
|
|
||||||
this.forwardLeftButton.setVisible(false);
|
|
||||||
this.forwardRightButton.setVisible(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void tick() {
|
public boolean mouseClicked(double mouseX, double mouseY, int button) {
|
||||||
assert this.client != null;
|
if (mouseY >= (double) (this.height - 22) && this.client != null && this.client.player != null) {
|
||||||
assert this.client.interactionManager != null;
|
int centerX = this.width / 2;
|
||||||
assert this.client.player != null;
|
if (mouseX >= (double) (centerX - 90) && mouseX <= (double) (centerX + 90)) {
|
||||||
|
for (int slot = 0; slot < 9; ++slot) {
|
||||||
if (this.forwardButtonTick > 0) {
|
int slotX = centerX - 90 + slot * 20 + 2;
|
||||||
--this.forwardButtonTick;
|
if (mouseX >= (double) slotX && mouseX <= (double) (slotX + 20)) {
|
||||||
} else {
|
this.client.player.getInventory().selectedSlot = slot;
|
||||||
this.forwardLeftButton.setVisible(false);
|
return true;
|
||||||
this.forwardRightButton.setVisible(false);
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
this.useButton.setVisible(client.player.getMainHandStack() != null && (client.player.getMainHandStack().getUseAction() != UseAction.NONE || client.player.getMainHandStack().getItem() instanceof ArmorItem) && !TouchUtils.hasInWorldUseAction(client.player.getMainHandStack()));
|
return super.mouseClicked(mouseX, mouseY, button);
|
||||||
this.updateJumpButtons();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
|
public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
|
||||||
if (button == GLFW.GLFW_MOUSE_BUTTON_1 && this.client != null) {
|
if (button == GLFW.GLFW_MOUSE_BUTTON_1 && this.client != null) {
|
||||||
if (!MidnightControlsConfig.invertTouch) {
|
|
||||||
deltaX = -deltaX;
|
|
||||||
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);
|
this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs(deltaY / 5.0), 2);
|
||||||
else this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs((deltaY / 3.0)*MidnightControlsConfig.touchSpeed/100), 1);
|
else if (deltaY < 0.01)
|
||||||
|
this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs(deltaY / 5.0), 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);
|
this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_X, (float) Math.abs(deltaX / 5.0), 2);
|
||||||
else this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_X, (float) Math.abs((deltaX / 3.0)*MidnightControlsConfig.touchSpeed/100), 1);
|
else if (deltaX < 0.01)
|
||||||
|
this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_X, (float) Math.abs(deltaX / 5.0), 1);
|
||||||
}
|
}
|
||||||
return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY);
|
return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY);
|
||||||
}
|
}
|
||||||
@Override
|
|
||||||
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
|
|
||||||
KeyBinding.onKeyPressed(InputUtil.fromKeyCode(keyCode, scanCode));
|
|
||||||
super.keyPressed(keyCode,scanCode,modifiers);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
|
|
||||||
super.render(context, mouseX, mouseY, delta);
|
|
||||||
context.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f);
|
|
||||||
context.fill(mouseX-10, mouseY-10, mouseX+10, mouseY+10, 0xFFFFFF);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,11 +11,12 @@ package eu.midnightdust.midnightcontrols.client.gui.widget;
|
|||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsRenderer;
|
import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsRenderer;
|
||||||
import org.thinkingstudio.obsidianui.Position;
|
import dev.lambdaurora.spruceui.Position;
|
||||||
import org.thinkingstudio.obsidianui.SpruceTexts;
|
import dev.lambdaurora.spruceui.SpruceTexts;
|
||||||
import org.thinkingstudio.obsidianui.widget.AbstractSpruceIconButtonWidget;
|
import dev.lambdaurora.spruceui.widget.AbstractSpruceIconButtonWidget;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.gui.DrawContext;
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
|
import net.minecraft.text.LiteralText;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
@@ -34,23 +35,23 @@ public class ControllerButtonWidget extends AbstractSpruceIconButtonWidget {
|
|||||||
public void update() {
|
public void update() {
|
||||||
int length = binding.getButton().length;
|
int length = binding.getButton().length;
|
||||||
this.setMessage(this.binding.isNotBound() ? SpruceTexts.NOT_BOUND.copy() :
|
this.setMessage(this.binding.isNotBound() ? SpruceTexts.NOT_BOUND.copy() :
|
||||||
(length > 0 ? ButtonBinding.getLocalizedButtonName(binding.getButton()[0]) : Text.literal("<>")));
|
(length > 0 ? ButtonBinding.getLocalizedButtonName(binding.getButton()[0]) : new LiteralText("<>")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Text getMessage() {
|
public Text getMessage() {
|
||||||
if (this.binding.getButton().length > 1)
|
if (this.binding.getButton().length > 1)
|
||||||
return Text.empty();
|
return Text.of("");
|
||||||
return super.getMessage();
|
return super.getMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected int renderIcon(DrawContext context, int mouseX, int mouseY, float delta) {
|
protected int renderIcon(MatrixStack matrices, int mouseX, int mouseY, float delta) {
|
||||||
int x = this.getX();
|
int x = this.getX();
|
||||||
if (this.binding.getButton().length > 1) {
|
if (this.binding.getButton().length > 1) {
|
||||||
x += (this.width / 2 - this.iconWidth / 2) - 4;
|
x += (this.width / 2 - this.iconWidth / 2) - 4;
|
||||||
}
|
}
|
||||||
var size = MidnightControlsRenderer.drawButton(context, x, this.getY(), this.binding, MinecraftClient.getInstance());
|
var size = MidnightControlsRenderer.drawButton(matrices, x, this.getY(), this.binding, MinecraftClient.getInstance());
|
||||||
this.iconWidth = size.length();
|
this.iconWidth = size.length();
|
||||||
return size.height();
|
return size.height();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,14 +13,15 @@ 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;
|
||||||
import org.thinkingstudio.obsidianui.Position;
|
import dev.lambdaurora.spruceui.Position;
|
||||||
import org.thinkingstudio.obsidianui.SpruceTexts;
|
import dev.lambdaurora.spruceui.SpruceTexts;
|
||||||
import org.thinkingstudio.obsidianui.widget.SpruceButtonWidget;
|
import dev.lambdaurora.spruceui.widget.SpruceButtonWidget;
|
||||||
import org.thinkingstudio.obsidianui.widget.container.SpruceContainerWidget;
|
import dev.lambdaurora.spruceui.widget.container.SpruceContainerWidget;
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsSettingsScreen;
|
import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsSettingsScreen;
|
||||||
import net.minecraft.client.gui.DrawContext;
|
|
||||||
import net.minecraft.client.gui.screen.option.ControlsOptionsScreen;
|
import net.minecraft.client.gui.screen.option.ControlsOptionsScreen;
|
||||||
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableText;
|
||||||
import org.aperlambda.lambdacommon.utils.function.Predicates;
|
import org.aperlambda.lambdacommon.utils.function.Predicates;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -47,7 +48,7 @@ public class ControllerControlsWidget extends SpruceContainerWidget {
|
|||||||
|
|
||||||
protected void init() {
|
protected void init() {
|
||||||
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"),
|
new TranslatableText("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);
|
this.bindingsListWidget = new ControlsListWidget(Position.of(this, 0, 43), this.width, this.height - 43 - 35, this);
|
||||||
this.bindingsListWidget.setBackground(new MidnightControlsSettingsScreen.MidnightControlsBackground(130));
|
this.bindingsListWidget.setBackground(new MidnightControlsSettingsScreen.MidnightControlsBackground(130));
|
||||||
@@ -58,11 +59,11 @@ public class ControllerControlsWidget extends SpruceContainerWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) {
|
public void renderWidget(MatrixStack matrices, int mouseX, int mouseY, float delta) {
|
||||||
context.drawCenteredTextWithShadow(this.client.textRenderer, Text.translatable("midnightcontrols.menu.title.controller_controls"),
|
drawCenteredText(matrices, this.client.textRenderer, new TranslatableText("midnightcontrols.menu.title.controller_controls"),
|
||||||
this.getX() + this.width / 2, this.getY() + 4, 16777215);
|
this.getX() + this.width / 2, this.getY() + 4, 16777215);
|
||||||
this.resetButton.setActive(InputManager.streamBindings().anyMatch(Predicates.not(ButtonBinding::isDefault)));
|
this.resetButton.setActive(InputManager.streamBindings().anyMatch(Predicates.not(ButtonBinding::isDefault)));
|
||||||
super.renderWidget(context, mouseX, mouseY, delta);
|
super.renderWidget(matrices, mouseX, mouseY, delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void finishBindingEdit(int... buttons) {
|
public void finishBindingEdit(int... buttons) {
|
||||||
|
|||||||
@@ -14,20 +14,22 @@ 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.ButtonCategory;
|
import eu.midnightdust.midnightcontrols.client.controller.ButtonCategory;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
||||||
import org.thinkingstudio.obsidianui.Position;
|
import dev.lambdaurora.spruceui.Position;
|
||||||
import org.thinkingstudio.obsidianui.SpruceTexts;
|
import dev.lambdaurora.spruceui.SpruceTexts;
|
||||||
import org.thinkingstudio.obsidianui.navigation.NavigationDirection;
|
import dev.lambdaurora.spruceui.navigation.NavigationDirection;
|
||||||
import org.thinkingstudio.obsidianui.navigation.NavigationUtils;
|
import dev.lambdaurora.spruceui.navigation.NavigationUtils;
|
||||||
import org.thinkingstudio.obsidianui.widget.SpruceButtonWidget;
|
import dev.lambdaurora.spruceui.widget.SpruceButtonWidget;
|
||||||
import org.thinkingstudio.obsidianui.widget.SpruceSeparatorWidget;
|
import dev.lambdaurora.spruceui.widget.SpruceSeparatorWidget;
|
||||||
import org.thinkingstudio.obsidianui.widget.SpruceWidget;
|
import dev.lambdaurora.spruceui.widget.SpruceWidget;
|
||||||
import org.thinkingstudio.obsidianui.widget.container.SpruceEntryListWidget;
|
import dev.lambdaurora.spruceui.widget.container.SpruceEntryListWidget;
|
||||||
import org.thinkingstudio.obsidianui.widget.container.SpruceParentWidget;
|
import dev.lambdaurora.spruceui.widget.container.SpruceParentWidget;
|
||||||
import net.fabricmc.api.EnvType;
|
import net.fabricmc.api.EnvType;
|
||||||
import net.fabricmc.api.Environment;
|
import net.fabricmc.api.Environment;
|
||||||
import net.minecraft.client.gui.DrawContext;
|
|
||||||
import net.minecraft.client.resource.language.I18n;
|
import net.minecraft.client.resource.language.I18n;
|
||||||
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
|
import net.minecraft.text.LiteralText;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableText;
|
||||||
import net.minecraft.util.Formatting;
|
import net.minecraft.util.Formatting;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
@@ -91,17 +93,17 @@ public class ControlsListWidget extends SpruceEntryListWidget<ControlsListWidget
|
|||||||
MidnightControlsClient.get().input.beginControlsInput(gui);
|
MidnightControlsClient.get().input.beginControlsInput(gui);
|
||||||
}) {
|
}) {
|
||||||
protected Text getNarrationMessage() {
|
protected Text getNarrationMessage() {
|
||||||
return binding.isNotBound() ? Text.translatable("narrator.controls.unbound", bindingName)
|
return binding.isNotBound() ? new TranslatableText("narrator.controls.unbound", bindingName)
|
||||||
: Text.translatable("narrator.controls.bound", bindingName, super.getNarrationMessage());
|
: new TranslatableText("narrator.controls.bound", bindingName, super.getNarrationMessage());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
this.children.add(editButton);
|
this.children.add(editButton);
|
||||||
this.resetButton = new SpruceButtonWidget(Position.of(this,
|
this.resetButton = new SpruceButtonWidget(Position.of(this,
|
||||||
this.editButton.getPosition().getRelativeX() + this.editButton.getWidth() + 2, 0),
|
this.editButton.getPosition().getRelativeX() + this.editButton.getWidth() + 2, 0),
|
||||||
44, 20, Text.translatable("controls.reset"),
|
44, 20, new TranslatableText("controls.reset"),
|
||||||
btn -> MidnightControlsConfig.setButtonBinding(binding, binding.getDefaultButton())) {
|
btn -> MidnightControlsConfig.setButtonBinding(binding, binding.getDefaultButton())) {
|
||||||
protected Text getNarrationMessage() {
|
protected Text getNarrationMessage() {
|
||||||
return Text.translatable("narrator.controls.reset", bindingName);
|
return new TranslatableText("narrator.controls.reset", bindingName);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
this.children.add(this.resetButton);
|
this.children.add(this.resetButton);
|
||||||
@@ -114,7 +116,7 @@ public class ControlsListWidget extends SpruceEntryListWidget<ControlsListWidget
|
|||||||
MidnightControlsClient.get().input.beginControlsInput(null);
|
MidnightControlsClient.get().input.beginControlsInput(null);
|
||||||
}) {
|
}) {
|
||||||
protected Text getNarrationMessage() {
|
protected Text getNarrationMessage() {
|
||||||
return Text.translatable("midnightcontrols.narrator.unbound", bindingName);
|
return new TranslatableText("midnightcontrols.narrator.unbound", bindingName);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
this.children.add(this.unbindButton);
|
this.children.add(this.unbindButton);
|
||||||
@@ -226,14 +228,14 @@ public class ControlsListWidget extends SpruceEntryListWidget<ControlsListWidget
|
|||||||
/* Rendering */
|
/* Rendering */
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) {
|
protected void renderWidget(MatrixStack matrices, int mouseX, int mouseY, float delta) {
|
||||||
boolean focused = gui.focusedBinding == this.binding;
|
boolean focused = gui.focusedBinding == this.binding;
|
||||||
|
|
||||||
var textRenderer = ControlsListWidget.this.client.textRenderer;
|
var textRenderer = ControlsListWidget.this.client.textRenderer;
|
||||||
int height = this.getHeight();
|
int height = this.getHeight();
|
||||||
//float textX = (float) (this.getX() + 70 - ControlsListWidget.this.maxTextLength);
|
//float textX = (float) (this.getX() + 70 - ControlsListWidget.this.maxTextLength);
|
||||||
int textY = this.getY() + height / 2;
|
int textY = this.getY() + height / 2;
|
||||||
context.drawText(textRenderer, this.bindingName, this.getX(), (textY - 9 / 2), 16777215, true);
|
textRenderer.draw(matrices, this.bindingName, this.getX(), (float) (textY - 9 / 2), 16777215);
|
||||||
|
|
||||||
this.resetButton.setVisible(!focused);
|
this.resetButton.setVisible(!focused);
|
||||||
this.unbindButton.setVisible(focused);
|
this.unbindButton.setVisible(focused);
|
||||||
@@ -241,9 +243,9 @@ public class ControlsListWidget extends SpruceEntryListWidget<ControlsListWidget
|
|||||||
|
|
||||||
this.editButton.update();
|
this.editButton.update();
|
||||||
if (focused) {
|
if (focused) {
|
||||||
var text = Text.literal("> ").formatted(Formatting.WHITE);
|
var text = new LiteralText("> ").formatted(Formatting.WHITE);
|
||||||
text.append(this.editButton.getMessage().copy().formatted(Formatting.YELLOW));
|
text.append(this.editButton.getMessage().copy().formatted(Formatting.YELLOW));
|
||||||
this.editButton.setMessage(text.append(Text.literal(" <").formatted(Formatting.WHITE)));
|
this.editButton.setMessage(text.append(new LiteralText(" <").formatted(Formatting.WHITE)));
|
||||||
} else if (!this.binding.isNotBound() && InputManager.hasDuplicatedBindings(this.binding)) {
|
} else if (!this.binding.isNotBound() && InputManager.hasDuplicatedBindings(this.binding)) {
|
||||||
var text = this.editButton.getMessage().copy();
|
var text = this.editButton.getMessage().copy();
|
||||||
this.editButton.setMessage(text.formatted(Formatting.RED));
|
this.editButton.setMessage(text.formatted(Formatting.RED));
|
||||||
@@ -252,7 +254,7 @@ public class ControlsListWidget extends SpruceEntryListWidget<ControlsListWidget
|
|||||||
this.editButton.setMessage(text.formatted(Formatting.GOLD));
|
this.editButton.setMessage(text.formatted(Formatting.GOLD));
|
||||||
}
|
}
|
||||||
|
|
||||||
this.children.forEach(widget -> widget.render(context, mouseX, mouseY, delta));
|
this.children.forEach(widget -> widget.render(matrices, mouseX, mouseY, delta));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -262,7 +264,7 @@ public class ControlsListWidget extends SpruceEntryListWidget<ControlsListWidget
|
|||||||
protected CategoryEntry(ControlsListWidget parent, ButtonCategory category) {
|
protected CategoryEntry(ControlsListWidget parent, ButtonCategory category) {
|
||||||
super(parent);
|
super(parent);
|
||||||
this.separatorWidget = new SpruceSeparatorWidget(Position.of(this, 2, 0), this.getWidth() - 4,
|
this.separatorWidget = new SpruceSeparatorWidget(Position.of(this, 2, 0), this.getWidth() - 4,
|
||||||
Text.literal(category.getTranslatedName())) {
|
new LiteralText(category.getTranslatedName())) {
|
||||||
@Override
|
@Override
|
||||||
public int getWidth() {
|
public int getWidth() {
|
||||||
return CategoryEntry.this.getWidth() - 4;
|
return CategoryEntry.this.getWidth() - 4;
|
||||||
@@ -289,8 +291,8 @@ public class ControlsListWidget extends SpruceEntryListWidget<ControlsListWidget
|
|||||||
/* Rendering */
|
/* Rendering */
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) {
|
protected void renderWidget(MatrixStack matrices, int mouseX, int mouseY, float delta) {
|
||||||
this.separatorWidget.render(context, mouseX, mouseY, delta);
|
this.separatorWidget.render(matrices, mouseX, mouseY, delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.touch.gui;
|
package eu.midnightdust.midnightcontrols.client.gui.widget;
|
||||||
|
|
||||||
import org.thinkingstudio.obsidianui.Position;
|
import dev.lambdaurora.spruceui.Position;
|
||||||
import org.thinkingstudio.obsidianui.widget.SpruceTexturedButtonWidget;
|
import dev.lambdaurora.spruceui.widget.SpruceTexturedButtonWidget;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
|
|
||||||
@@ -23,17 +23,4 @@ public class SilentTexturedButtonWidget extends SpruceTexturedButtonWidget {
|
|||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public void playDownSound() {}
|
public void playDownSound() {}
|
||||||
@Override
|
|
||||||
protected void onRelease(double mouseX, double mouseY) {
|
|
||||||
this.setActive(false);
|
|
||||||
super.onClick(mouseX, mouseY);
|
|
||||||
super.onRelease(mouseX, mouseY);
|
|
||||||
this.setActive(true);
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void onClick(double mouseX, double mouseY) {
|
|
||||||
this.setActive(true);
|
|
||||||
super.onClick(mouseX, mouseY);
|
|
||||||
this.setActive(false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.mixin;
|
|
||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
|
||||||
import net.minecraft.client.gui.DrawContext;
|
|
||||||
import net.minecraft.client.gui.screen.ChatScreen;
|
|
||||||
import net.minecraft.client.gui.screen.Screen;
|
|
||||||
import net.minecraft.client.gui.widget.TextFieldWidget;
|
|
||||||
import net.minecraft.text.Text;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
|
|
||||||
@Mixin(ChatScreen.class)
|
|
||||||
public abstract class ChatScreenMixin extends Screen {
|
|
||||||
@Shadow protected TextFieldWidget chatField;
|
|
||||||
|
|
||||||
protected ChatScreenMixin(Text title) {
|
|
||||||
super(title);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(at = @At("TAIL"), method = "init")
|
|
||||||
private void midnightcontrols$moveInputField(CallbackInfo ci) {
|
|
||||||
if (MidnightControlsConfig.moveChat) chatField.setY(4);
|
|
||||||
}
|
|
||||||
@Inject(method = "render", at = @At("HEAD"))
|
|
||||||
private void midnightcontrols$moveInputFieldBackground(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) {
|
|
||||||
if (MidnightControlsConfig.moveChat) context.getMatrices().translate(0f, -this.height + 16, 0f);
|
|
||||||
}
|
|
||||||
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/TextFieldWidget;render(Lnet/minecraft/client/gui/DrawContext;IIF)V", shift = At.Shift.BEFORE))
|
|
||||||
private void midnightcontrols$dontMoveOtherStuff(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) {
|
|
||||||
if (MidnightControlsConfig.moveChat) context.getMatrices().translate(0f, this.height - 16, 0f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -11,7 +11,6 @@ package eu.midnightdust.midnightcontrols.client.mixin;
|
|||||||
|
|
||||||
import com.mojang.authlib.GameProfile;
|
import com.mojang.authlib.GameProfile;
|
||||||
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.MovementHandler;
|
import eu.midnightdust.midnightcontrols.client.controller.MovementHandler;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
@@ -20,15 +19,12 @@ import net.minecraft.client.network.AbstractClientPlayerEntity;
|
|||||||
import net.minecraft.client.network.ClientPlayerEntity;
|
import net.minecraft.client.network.ClientPlayerEntity;
|
||||||
import net.minecraft.client.world.ClientWorld;
|
import net.minecraft.client.world.ClientWorld;
|
||||||
import net.minecraft.entity.MovementType;
|
import net.minecraft.entity.MovementType;
|
||||||
import net.minecraft.network.encryption.PlayerPublicKey;
|
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
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.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.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -76,7 +72,7 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "tickMovement", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/input/Input;tick(ZF)V", shift = At.Shift.AFTER))
|
@Inject(method = "tickMovement", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/input/Input;tick(Z)V", shift = At.Shift.AFTER))
|
||||||
public void onInputUpdate(CallbackInfo ci) {
|
public void onInputUpdate(CallbackInfo ci) {
|
||||||
MovementHandler.HANDLER.applyMovement((ClientPlayerEntity) (Object) this);
|
MovementHandler.HANDLER.applyMovement((ClientPlayerEntity) (Object) this);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,14 +9,16 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.mixin;
|
package eu.midnightdust.midnightcontrols.client.mixin;
|
||||||
|
|
||||||
|
import eu.midnightdust.lib.util.screen.TexturedOverlayButtonWidget;
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsSettingsScreen;
|
import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsSettingsScreen;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.fabricmc.loader.api.FabricLoader;
|
||||||
import net.minecraft.client.gui.screen.Screen;
|
import net.minecraft.client.gui.screen.Screen;
|
||||||
import net.minecraft.client.gui.screen.option.ControlsOptionsScreen;
|
import net.minecraft.client.gui.screen.option.ControlsOptionsScreen;
|
||||||
import net.minecraft.client.gui.screen.option.GameOptionsScreen;
|
import net.minecraft.client.gui.screen.option.GameOptionsScreen;
|
||||||
import net.minecraft.client.gui.widget.TextIconButtonWidget;
|
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||||
import net.minecraft.client.option.GameOptions;
|
import net.minecraft.client.option.GameOptions;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableText;
|
||||||
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;
|
||||||
@@ -29,28 +31,27 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||||||
*/
|
*/
|
||||||
@Mixin(ControlsOptionsScreen.class)
|
@Mixin(ControlsOptionsScreen.class)
|
||||||
public abstract class ControlsOptionsScreenMixin extends GameOptionsScreen {
|
public abstract class ControlsOptionsScreenMixin extends GameOptionsScreen {
|
||||||
|
@Unique private final boolean showAlternativeButton = FabricLoader.getInstance().isModLoaded("crawl");
|
||||||
public ControlsOptionsScreenMixin(Screen parent, GameOptions gameOptions, Text title) {
|
public ControlsOptionsScreenMixin(Screen parent, GameOptions gameOptions, Text text) {
|
||||||
super(parent, gameOptions, title);
|
super(parent, gameOptions, text);
|
||||||
}
|
}
|
||||||
@Unique TextIconButtonWidget button = TextIconButtonWidget.builder(Text.translatable("midnightcontrols.menu.title.controller"), (button -> this.client.setScreen(new MidnightControlsSettingsScreen(this, false))), true)
|
@Inject(method = "init", at = @At(value = "INVOKE", ordinal = 1, shift = At.Shift.AFTER, target = "Lnet/minecraft/client/gui/screen/option/ControlsOptionsScreen;addDrawableChild(Lnet/minecraft/client/gui/Element;)Lnet/minecraft/client/gui/Element;"))
|
||||||
.dimension(20,20).texture(Identifier.of("midnightcontrols", "icon/controller"), 20, 20).build();
|
private void addAlternativeControllerButton(CallbackInfo ci) {
|
||||||
|
if (showAlternativeButton) {
|
||||||
@Override
|
this.addDrawableChild(new TexturedOverlayButtonWidget(this.width / 2 + 158, this.height / 6 - 12, 20, 20,0,0,20, new Identifier("midnightcontrols", "textures/gui/midnightcontrols_button.png"), 32, 64, (button) -> {
|
||||||
public void init() {
|
this.client.setScreen(new MidnightControlsSettingsScreen(this, false));
|
||||||
super.init();
|
}, new TranslatableText("midnightcontrols.menu.title.controller")));
|
||||||
this.midnightcontrols$setupButton();
|
}
|
||||||
this.addDrawableChild(button);
|
|
||||||
}
|
}
|
||||||
|
@Inject(method = "init", at = @At(value = "INVOKE", ordinal = 4, shift = At.Shift.AFTER, target = "Lnet/minecraft/client/gui/screen/option/ControlsOptionsScreen;addDrawableChild(Lnet/minecraft/client/gui/Element;)Lnet/minecraft/client/gui/Element;"))
|
||||||
@Override
|
private void addControllerButton(CallbackInfo ci) {
|
||||||
public void resize(MinecraftClient client, int width, int height) {
|
if (!showAlternativeButton) {
|
||||||
super.resize(client, width, height);
|
int i = this.width / 2 - 155;
|
||||||
this.midnightcontrols$setupButton();
|
int j = i + 160;
|
||||||
}
|
int k = this.height / 6 - 12 + 48;
|
||||||
@Unique
|
this.addDrawableChild(new ButtonWidget(j, k, 150, 20, new TranslatableText("midnightcontrols.menu.title.controller").append("..."), (button) -> {
|
||||||
public void midnightcontrols$setupButton() {
|
this.client.setScreen(new MidnightControlsSettingsScreen(this, false));
|
||||||
assert body != null;
|
}));
|
||||||
button.setPosition(body.getWidth() / 2 + 158, body.getY() + 4);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ package eu.midnightdust.midnightcontrols.client.mixin;
|
|||||||
|
|
||||||
import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
|
import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
|
||||||
import net.minecraft.item.ItemGroup;
|
import net.minecraft.item.ItemGroup;
|
||||||
import net.minecraft.item.ItemGroups;
|
|
||||||
import net.minecraft.screen.slot.Slot;
|
import net.minecraft.screen.slot.Slot;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
@@ -30,8 +29,8 @@ public interface CreativeInventoryScreenAccessor {
|
|||||||
* @return the selected tab index
|
* @return the selected tab index
|
||||||
*/
|
*/
|
||||||
@Accessor("selectedTab")
|
@Accessor("selectedTab")
|
||||||
static ItemGroup getSelectedTab() {
|
static int getSelectedTab() {
|
||||||
return ItemGroups.getDefaultTab();
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* 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.client.mixin;
|
||||||
|
|
||||||
|
import net.minecraft.client.gui.widget.EntryListWidget;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.gen.Invoker;
|
||||||
|
|
||||||
|
@Mixin(EntryListWidget.class)
|
||||||
|
public interface EntryListWidgetAccessor {
|
||||||
|
@Invoker("moveSelection")
|
||||||
|
void midnightcontrols$moveSelection(EntryListWidget.MoveDirection direction);
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* 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.client.mixin;
|
||||||
|
|
||||||
|
import net.minecraft.client.option.GameOptions;
|
||||||
|
import net.minecraft.client.option.Option;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a mixin to GameOptions.
|
||||||
|
* <p>
|
||||||
|
* Sets the default of the Auto-Jump option to false.
|
||||||
|
*/
|
||||||
|
@Mixin(GameOptions.class)
|
||||||
|
public abstract class GameOptionsMixin {
|
||||||
|
|
||||||
|
@Shadow public boolean autoJump;
|
||||||
|
|
||||||
|
@Inject(method = "load", at = @At("HEAD"))
|
||||||
|
public void onInit(CallbackInfo ci) {
|
||||||
|
// Set default value of the Auto-Jump option to false.
|
||||||
|
autoJump = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,18 +9,11 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.mixin;
|
package eu.midnightdust.midnightcontrols.client.mixin;
|
||||||
|
|
||||||
import com.llamalad7.mixinextras.sugar.Local;
|
|
||||||
import com.mojang.blaze3d.systems.RenderSystem;
|
|
||||||
import eu.midnightdust.midnightcontrols.ControlsMode;
|
import eu.midnightdust.midnightcontrols.ControlsMode;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsRenderer;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.touch.TouchUtils;
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.gui.DrawContext;
|
|
||||||
import net.minecraft.client.render.GameRenderer;
|
import net.minecraft.client.render.GameRenderer;
|
||||||
import net.minecraft.client.render.RenderTickCounter;
|
|
||||||
import org.joml.Matrix4f;
|
|
||||||
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;
|
||||||
@@ -29,26 +22,14 @@ import org.spongepowered.asm.mixin.injection.Inject;
|
|||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
@Mixin(GameRenderer.class)
|
@Mixin(GameRenderer.class)
|
||||||
public abstract class GameRendererMixin {
|
public class GameRendererMixin {
|
||||||
@Shadow
|
@Shadow
|
||||||
@Final
|
@Final
|
||||||
MinecraftClient client;
|
private MinecraftClient client;
|
||||||
|
|
||||||
@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"))
|
||||||
private void onRender(RenderTickCounter tickCounter, boolean tick, CallbackInfo ci) {
|
private void onRender(float tickDelta, long startTime, boolean fullRender, 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.get().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))
|
|
||||||
private void renderVirtualCursor(RenderTickCounter tickCounter, boolean tick, CallbackInfo ci, @Local DrawContext drawContext) {
|
|
||||||
MidnightControlsRenderer.renderVirtualCursor(drawContext, client);
|
|
||||||
drawContext.draw();
|
|
||||||
}
|
|
||||||
@Inject(at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/GameRenderer;renderHand:Z"), method = "renderWorld")
|
|
||||||
private void captureProjAndModMatrix(RenderTickCounter tickCounter, CallbackInfo ci, @Local(ordinal = 1) Matrix4f matrices) {
|
|
||||||
TouchUtils.lastProjMat.set(RenderSystem.getProjectionMatrix());
|
|
||||||
TouchUtils.lastModMat.set(RenderSystem.getModelViewMatrix());
|
|
||||||
TouchUtils.lastWorldSpaceMatrix.set(matrices);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,18 +12,17 @@ package eu.midnightdust.midnightcontrols.client.mixin;
|
|||||||
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.MidnightInput;
|
||||||
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;
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsRenderer;
|
import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsRenderer;
|
||||||
import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor;
|
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.screen.ingame.HandledScreen;
|
import net.minecraft.client.gui.screen.ingame.HandledScreen;
|
||||||
import net.minecraft.client.util.math.MatrixStack;
|
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 net.minecraft.text.TranslatableText;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
@@ -39,6 +38,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||||||
*/
|
*/
|
||||||
@Mixin(HandledScreen.class)
|
@Mixin(HandledScreen.class)
|
||||||
public abstract class HandledScreenMixin implements HandledScreenAccessor {
|
public abstract class HandledScreenMixin implements HandledScreenAccessor {
|
||||||
|
@Unique private static float scale = 1f;
|
||||||
|
|
||||||
@Accessor("x")
|
@Accessor("x")
|
||||||
public abstract int getX();
|
public abstract int getX();
|
||||||
|
|
||||||
@@ -56,26 +57,32 @@ public abstract class HandledScreenMixin implements HandledScreenAccessor {
|
|||||||
public abstract void midnightcontrols$onMouseClick(@Nullable Slot slot, int slotId, int clickData, SlotActionType actionType);
|
public abstract void midnightcontrols$onMouseClick(@Nullable Slot slot, int slotId, int clickData, SlotActionType actionType);
|
||||||
|
|
||||||
@Inject(method = "render", at = @At("RETURN"))
|
@Inject(method = "render", at = @At("RETURN"))
|
||||||
public void onRender(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) {
|
public void onRender(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) {
|
||||||
if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && MidnightControlsConfig.hudEnable) {
|
if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER) {
|
||||||
var client = MinecraftClient.getInstance();
|
var client = MinecraftClient.getInstance();
|
||||||
int x = 2, y = client.getWindow().getScaledHeight() - 2 - MidnightControlsRenderer.ICON_SIZE;
|
if (client.options.guiScale >= 4) {
|
||||||
if (MidnightControlsCompat.isEMIPresent() && EMICompat.isEMIEnabled()) {
|
scale = 0.75f;
|
||||||
x += 42;
|
} else scale = 1f;
|
||||||
|
matrices.push();
|
||||||
|
if (scale != 1f) matrices.scale(scale,scale,scale);
|
||||||
|
int x = 2, y = (int) (client.getWindow().getScaledHeight() * (1 / scale) - 2 - MidnightControlsRenderer.ICON_SIZE);
|
||||||
|
if (MidnightControlsCompat.isEMIPresent()) {
|
||||||
|
x += 40 * (1 / scale);
|
||||||
}
|
}
|
||||||
if (!ButtonBinding.TAKE_ALL.isNotBound()) x = MidnightControlsRenderer.drawButtonTip(context, x, y, ButtonBinding.TAKE_ALL,true, client) + 2;
|
x = MidnightControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_A}, "midnightcontrols.action.pickup_all", true, client) + 2;
|
||||||
if (!ButtonBinding.EXIT.isNotBound()) x = MidnightControlsRenderer.drawButtonTip(context, x, y, ButtonBinding.EXIT, true, client) + 2;
|
x = MidnightControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_B}, "midnightcontrols.action.exit", true, client) + 2;
|
||||||
if (MidnightControlsCompat.isReiPresent()) {
|
if (MidnightControlsCompat.isReiPresent()) {
|
||||||
x = 2;
|
x = 2;
|
||||||
y -= 24;
|
y -= 24;
|
||||||
}
|
}
|
||||||
if (MidnightControlsCompat.isEMIPresent() && EMICompat.isEMIEnabled() && EMICompat.isSearchBarCentered()) {
|
if (MidnightControlsCompat.isEMIPresent()) {
|
||||||
x = client.getWindow().getScaledWidth() - 55 - client.textRenderer.getWidth(Text.translatable("midnightcontrols.action.pickup"))
|
x = (int) (client.getWindow().getScaledWidth() * (1 / scale) - 55 - client.textRenderer.getWidth(new TranslatableText("midnightcontrols.action.pickup"))
|
||||||
- client.textRenderer.getWidth(Text.translatable("midnightcontrols.action.quick_move"))
|
* (1 / scale) - client.textRenderer.getWidth(new TranslatableText("midnightcontrols.action.quick_move"))
|
||||||
- MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.TAKE) - MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.QUICK_MOVE);
|
- MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.TAKE) - MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.QUICK_MOVE));
|
||||||
}
|
}
|
||||||
if (!ButtonBinding.TAKE.isNotBound()) x = MidnightControlsRenderer.drawButtonTip(context, x, y, ButtonBinding.TAKE, true, client);
|
x = MidnightControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_X}, "midnightcontrols.action.pickup", true, client);
|
||||||
if (!ButtonBinding.QUICK_MOVE.isNotBound()) MidnightControlsRenderer.drawButtonTip(context, x, y, ButtonBinding.QUICK_MOVE, true, client);
|
MidnightControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_Y}, "midnightcontrols.action.quick_move", true, client);
|
||||||
|
matrices.pop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.mixin;
|
|
||||||
|
|
||||||
import net.minecraft.client.util.InputUtil;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
|
||||||
|
|
||||||
@Mixin(InputUtil.class)
|
|
||||||
public abstract class InputUtilMixin {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author kabliz
|
|
||||||
* @reason This method is static, and there is a terrible UX issue if raw input is turned on at the same time as
|
|
||||||
* eye tracking. Raw input only tracks literal mice and not other devices, leading to the game appearing to be
|
|
||||||
* unresponsive and the player not understanding why. This overwrite preserves the user's mouse preferences,
|
|
||||||
* while not interfering with eye tracking, and the two modes can be switched between during a play session.
|
|
||||||
*/
|
|
||||||
@Inject(method = "isRawMouseMotionSupported", at = @At("HEAD"), cancellable = true)
|
|
||||||
private static void setRawMouseMotionSupported(CallbackInfoReturnable<Boolean> cir) {
|
|
||||||
if (MidnightControlsConfig.eyeTrackerAsMouse) cir.setReturnValue(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.mixin;
|
|
||||||
|
|
||||||
import net.minecraft.client.option.KeyBinding;
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@Mixin(KeyBinding.class)
|
|
||||||
public interface KeyBindingIDAccessor {
|
|
||||||
@Accessor @Final
|
|
||||||
static Map<String, KeyBinding> getKEYS_BY_ID() {return null;};
|
|
||||||
}
|
|
||||||
@@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.Mixin;
|
|||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
@Mixin(KeyBinding.class)
|
@Mixin(KeyBinding.class)
|
||||||
public abstract class KeyBindingMixin implements KeyBindingAccessor {
|
public class KeyBindingMixin implements KeyBindingAccessor {
|
||||||
@Shadow
|
@Shadow
|
||||||
private int timesPressed;
|
private int timesPressed;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package eu.midnightdust.midnightcontrols.client.mixin;
|
||||||
|
|
||||||
|
import net.fabricmc.fabric.impl.client.keybinding.KeyBindingRegistryImpl;
|
||||||
|
import net.minecraft.client.option.KeyBinding;
|
||||||
|
import org.spongepowered.asm.mixin.Final;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Mixin(value = KeyBindingRegistryImpl.class, remap = false)
|
||||||
|
public interface KeyBindingRegistryImplAccessor {
|
||||||
|
@Accessor @Final
|
||||||
|
static List<KeyBinding> getModdedKeyBindings() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.mixin;
|
|
||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay;
|
|
||||||
import net.minecraft.client.Keyboard;
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
|
||||||
import net.minecraft.client.gui.screen.Screen;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
|
||||||
|
|
||||||
@Mixin(Keyboard.class)
|
|
||||||
public class KeyboardMixin {
|
|
||||||
@Redirect(method = "onKey", at = @At(value = "FIELD", target = "Lnet/minecraft/client/MinecraftClient;currentScreen:Lnet/minecraft/client/gui/screen/Screen;"))
|
|
||||||
private Screen midnightcontrols$ignoreTouchOverlay(MinecraftClient instance) {
|
|
||||||
if (instance.currentScreen instanceof TouchscreenOverlay) return null;
|
|
||||||
return instance.currentScreen;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -9,15 +9,18 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.mixin;
|
package eu.midnightdust.midnightcontrols.client.mixin;
|
||||||
|
|
||||||
|
import eu.midnightdust.midnightcontrols.MidnightControls;
|
||||||
import eu.midnightdust.midnightcontrols.MidnightControlsFeature;
|
import eu.midnightdust.midnightcontrols.MidnightControlsFeature;
|
||||||
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.gui.MidnightControlsRenderer;
|
||||||
import net.minecraft.client.MinecraftClient;
|
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.client.util.math.MatrixStack;
|
||||||
|
import net.minecraft.client.world.ClientWorld;
|
||||||
import net.minecraft.item.BlockItem;
|
import net.minecraft.item.BlockItem;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.util.ActionResult;
|
import net.minecraft.util.ActionResult;
|
||||||
@@ -28,7 +31,7 @@ import net.minecraft.util.math.BlockPos;
|
|||||||
import net.minecraft.util.math.Direction;
|
import net.minecraft.util.math.Direction;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.objectweb.asm.Opcodes;
|
||||||
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;
|
||||||
@@ -39,18 +42,26 @@ import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
|
|||||||
|
|
||||||
@Mixin(MinecraftClient.class)
|
@Mixin(MinecraftClient.class)
|
||||||
public abstract class MinecraftClientMixin {
|
public abstract class MinecraftClientMixin {
|
||||||
@Shadow @Nullable public HitResult crosshairTarget;
|
@Shadow
|
||||||
|
@Nullable
|
||||||
|
public HitResult crosshairTarget;
|
||||||
|
|
||||||
@Shadow @Nullable public ClientPlayerEntity player;
|
@Shadow
|
||||||
|
@Nullable
|
||||||
|
public ClientPlayerEntity player;
|
||||||
|
|
||||||
@Shadow @Nullable public ClientPlayerInteractionManager interactionManager;
|
@Shadow
|
||||||
|
@Nullable
|
||||||
|
public ClientPlayerInteractionManager interactionManager;
|
||||||
|
|
||||||
@Shadow @Final public GameRenderer gameRenderer;
|
@Shadow
|
||||||
|
@Final
|
||||||
|
public GameRenderer gameRenderer;
|
||||||
|
|
||||||
@Shadow private int itemUseCooldown;
|
@Shadow
|
||||||
|
private int itemUseCooldown;
|
||||||
@Shadow public abstract BufferBuilderStorage getBufferBuilders();
|
|
||||||
|
|
||||||
|
@Shadow @Nullable public ClientWorld world;
|
||||||
private BlockPos midnightcontrols$lastTargetPos;
|
private BlockPos midnightcontrols$lastTargetPos;
|
||||||
private Vec3d midnightcontrols$lastPos;
|
private Vec3d midnightcontrols$lastPos;
|
||||||
private Direction midnightcontrols$lastTargetSide;
|
private Direction midnightcontrols$lastTargetSide;
|
||||||
@@ -90,22 +101,40 @@ public abstract class MinecraftClientMixin {
|
|||||||
this.midnightcontrols$lastTargetSide = side;
|
this.midnightcontrols$lastTargetSide = side;
|
||||||
}
|
}
|
||||||
// Removed front placing sprinting as way too cheaty.
|
// Removed front placing sprinting as way too cheaty.
|
||||||
// else if (this.player.isSprinting()) {
|
else if (this.player.isSprinting()) {
|
||||||
// hitResult = MidnightControlsClient.get().reacharound.getLastReacharoundResult();
|
hitResult = MidnightControlsClient.get().reacharound.getLastReacharoundResult();
|
||||||
// if (hitResult != null) {
|
if (hitResult != null) {
|
||||||
// if (cooldown > 0)
|
if (cooldown > 0)
|
||||||
// this.itemUseCooldown = 0;
|
this.itemUseCooldown = 0;
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
this.midnightcontrols$lastPos = this.player.getPos();
|
this.midnightcontrols$lastPos = this.player.getPos();
|
||||||
}
|
}
|
||||||
|
// Applied multiple times for smooth camera turning even on low FPS
|
||||||
|
@Inject(method = "run", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiler/Profiler;startTick()V", shift = At.Shift.BEFORE))
|
||||||
|
private void onPrePreRender(CallbackInfo ci) {
|
||||||
|
MidnightControlsClient.get().onRender((MinecraftClient) (Object) (this));
|
||||||
|
}
|
||||||
|
@Inject(method = "run", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiler/Recorder;startTick()V", shift = At.Shift.AFTER))
|
||||||
|
private void onPreRender(CallbackInfo ci) {
|
||||||
|
MidnightControlsClient.get().onRender((MinecraftClient) (Object) (this));
|
||||||
|
}
|
||||||
|
@Inject(method = "render", at = @At("HEAD"))
|
||||||
|
private void onRender(CallbackInfo ci) {
|
||||||
|
MidnightControlsClient.get().onRender((MinecraftClient) (Object) (this));
|
||||||
|
}
|
||||||
|
@Inject(method = "render", at = @At("TAIL"))
|
||||||
|
private void onPostRender(CallbackInfo ci) {
|
||||||
|
MidnightControlsClient.get().onRender((MinecraftClient) (Object) (this));
|
||||||
|
}
|
||||||
|
@Inject(method = "run", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiler/Profiler;endTick()V", shift = At.Shift.AFTER))
|
||||||
|
private void onPostPostRender(CallbackInfo ci) {
|
||||||
|
MidnightControlsClient.get().onRender((MinecraftClient) (Object) (this));
|
||||||
|
}
|
||||||
|
|
||||||
@Inject(at = @At("TAIL"), method = "setScreen")
|
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/GameRenderer;render(FJZ)V", shift = At.Shift.AFTER))
|
||||||
private void setScreen(Screen screen, CallbackInfo info) {
|
private void renderVirtualCursor(boolean fullRender, CallbackInfo ci) {
|
||||||
if (MidnightControlsConfig.hideNormalMouse){
|
MidnightControlsRenderer.renderVirtualCursor(new MatrixStack(), (MinecraftClient) (Object) this);
|
||||||
if (screen != null) GLFW.glfwSetInputMode(MinecraftClient.getInstance().getWindow().getHandle(), GLFW.GLFW_CURSOR, GLFW.GLFW_CURSOR_HIDDEN);
|
|
||||||
else GLFW.glfwSetInputMode(MinecraftClient.getInstance().getWindow().getHandle(), GLFW.GLFW_CURSOR, GLFW.GLFW_CURSOR_DISABLED);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@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)
|
||||||
@@ -122,7 +151,7 @@ public abstract class MinecraftClientMixin {
|
|||||||
hitResult = mod.reacharound.withSideForReacharound(hitResult, stackInHand);
|
hitResult = mod.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, world, hand, hitResult);
|
||||||
if (result.isAccepted()) {
|
if (result.isAccepted()) {
|
||||||
if (result.shouldSwingHand()) {
|
if (result.shouldSwingHand()) {
|
||||||
this.player.swingHand(hand);
|
this.player.swingHand(hand);
|
||||||
@@ -141,10 +170,4 @@ public abstract class MinecraftClientMixin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// This is always supposed to be located at before the line 'this.profiler.swap("Keybindings");'
|
|
||||||
// @Redirect(method = "tick", at = @At(value = "FIELD",target = "Lnet/minecraft/client/MinecraftClient;currentScreen:Lnet/minecraft/client/gui/screen/Screen;", ordinal = 6))
|
|
||||||
// private Screen midnightcontrols$ignoreTouchOverlay(MinecraftClient instance) {
|
|
||||||
// if (instance.currentScreen instanceof TouchscreenOverlay) return null;
|
|
||||||
// return instance.currentScreen;
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.mixin;
|
|
||||||
|
|
||||||
import net.minecraft.client.Mouse;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
|
||||||
import org.spongepowered.asm.mixin.gen.Invoker;
|
|
||||||
|
|
||||||
@Mixin(Mouse.class)
|
|
||||||
public interface MouseAccessor {
|
|
||||||
@Invoker("onCursorPos")
|
|
||||||
void midnightcontrols$onCursorPos(long window, double x, double y);
|
|
||||||
@Accessor
|
|
||||||
void setLeftButtonClicked(boolean value);
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -12,90 +12,47 @@ package eu.midnightdust.midnightcontrols.client.mixin;
|
|||||||
import eu.midnightdust.midnightcontrols.ControlsMode;
|
import eu.midnightdust.midnightcontrols.ControlsMode;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay;
|
import eu.midnightdust.midnightcontrols.client.util.MouseAccessor;
|
||||||
import eu.midnightdust.midnightcontrols.client.touch.TouchInput;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.touch.TouchUtils;
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.Mouse;
|
import net.minecraft.client.Mouse;
|
||||||
import net.minecraft.client.util.GlfwUtil;
|
import net.minecraft.client.gui.screen.Screen;
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import net.minecraft.item.ThrowablePotionItem;
|
|
||||||
import net.minecraft.util.UseAction;
|
|
||||||
import net.minecraft.util.math.Smoother;
|
|
||||||
import org.lwjgl.glfw.GLFW;
|
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.gen.Accessor;
|
||||||
|
import org.spongepowered.asm.mixin.gen.Invoker;
|
||||||
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.CallbackInfoReturnable;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
import eu.midnightdust.midnightcontrols.client.mouse.EyeTrackerHandler;
|
|
||||||
|
|
||||||
import static eu.midnightdust.midnightcontrols.client.MidnightControlsConfig.doMixedInput;
|
|
||||||
import static org.lwjgl.glfw.GLFW.*;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds extra access to the mouse.
|
* Adds extra access to the mouse.
|
||||||
*/
|
*/
|
||||||
@Mixin(Mouse.class)
|
@Mixin(Mouse.class)
|
||||||
public abstract class MouseMixin implements MouseAccessor {
|
public abstract class MouseMixin implements MouseAccessor {
|
||||||
@Shadow @Final private MinecraftClient client;
|
@Shadow
|
||||||
|
@Final
|
||||||
|
private MinecraftClient client;
|
||||||
|
|
||||||
@Shadow private double y;
|
@Accessor
|
||||||
|
public abstract void setLeftButtonClicked(boolean value);
|
||||||
|
|
||||||
@Shadow private double cursorDeltaX;
|
@Invoker("onCursorPos")
|
||||||
|
public abstract void midnightcontrols$onCursorPos(long window, double x, double y);
|
||||||
|
|
||||||
@Shadow private double cursorDeltaY;
|
@Inject(method = "onMouseButton", at = @At(value = "TAIL"))
|
||||||
|
private void onMouseBackButton(long window, int button, int action, int mods, CallbackInfo ci) {
|
||||||
@Shadow private double x;
|
if (action == 1 && button == GLFW.GLFW_MOUSE_BUTTON_4 && MinecraftClient.getInstance().currentScreen != null) {
|
||||||
|
if (MidnightControlsClient.get().input.tryGoBack(MinecraftClient.getInstance().currentScreen)) {
|
||||||
@Shadow private boolean cursorLocked;
|
action = 0;
|
||||||
|
|
||||||
@Shadow private boolean hasResolutionChanged;
|
|
||||||
|
|
||||||
@Shadow private double glfwTime;
|
|
||||||
|
|
||||||
@Shadow @Final private Smoother cursorXSmoother;
|
|
||||||
|
|
||||||
@Shadow @Final private Smoother cursorYSmoother;
|
|
||||||
|
|
||||||
@Shadow private boolean leftButtonClicked;
|
|
||||||
|
|
||||||
@Inject(method = "onMouseButton", at = @At(value = "HEAD"), cancellable = true)
|
|
||||||
private void midnightcontrols$onMouseButton(long window, int button, int action, int mods, CallbackInfo ci) {
|
|
||||||
if (window != this.client.getWindow().getHandle()) return;
|
|
||||||
if (action == 1 && button == GLFW.GLFW_MOUSE_BUTTON_4 && client.currentScreen != null) {
|
|
||||||
MidnightControlsClient.get().input.tryGoBack(client.currentScreen);
|
|
||||||
}
|
|
||||||
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 mouseY = y / client.getWindow().getScaleFactor();
|
|
||||||
int centerX = client.getWindow().getScaledWidth() / 2;
|
|
||||||
if (action == 1 && mouseY >= (double) (client.getWindow().getScaledHeight() - 22) && mouseX >= (double) (centerX - 90) && mouseX <= (double) (centerX + 90)) {
|
|
||||||
for (int slot = 0; slot < 9; ++slot) {
|
|
||||||
int slotX = centerX - 90 + slot * 20 + 2;
|
|
||||||
if (mouseX >= (double) slotX && mouseX <= (double) (slotX + 20)) {
|
|
||||||
client.player.getInventory().selectedSlot = slot;
|
|
||||||
ci.cancel();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (action == 1) {
|
|
||||||
TouchInput.clickStartTime = System.currentTimeMillis();
|
|
||||||
boolean bl = false;
|
|
||||||
if (client.currentScreen instanceof TouchscreenOverlay overlay) bl = overlay.mouseClicked(mouseX, mouseY, button);
|
|
||||||
if (!bl) TouchInput.firstHitResult = TouchUtils.getTargettedObject(mouseX, mouseY);
|
|
||||||
if (client.currentScreen == null) ci.cancel();
|
|
||||||
}
|
|
||||||
else if (TouchInput.mouseReleased(mouseX, mouseY, button)) ci.cancel();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "isCursorLocked", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "isCursorLocked", at = @At("HEAD"), cancellable = true)
|
||||||
private void midnightcontrols$isCursorLocked(CallbackInfoReturnable<Boolean> ci) {
|
private void isCursorLocked(CallbackInfoReturnable<Boolean> ci) {
|
||||||
if (this.client.currentScreen == null) {
|
if (this.client.currentScreen == null) {
|
||||||
if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && MidnightControlsConfig.virtualMouse) {
|
if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && MidnightControlsConfig.virtualMouse) {
|
||||||
ci.setReturnValue(true);
|
ci.setReturnValue(true);
|
||||||
@@ -105,49 +62,9 @@ public abstract class MouseMixin implements MouseAccessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "lockCursor", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "lockCursor", at = @At("HEAD"), cancellable = true)
|
||||||
private void midnightcontrols$onCursorLocked(CallbackInfo ci) {
|
private void onCursorLocked(CallbackInfo ci) {
|
||||||
if ((MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && MidnightControlsConfig.virtualMouse) ||
|
if (/*config.getControlsMode() == ControlsMode.TOUCHSCREEN
|
||||||
MidnightControlsConfig.controlsMode == ControlsMode.TOUCHSCREEN || doMixedInput())
|
||*/ (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && MidnightControlsConfig.virtualMouse))
|
||||||
ci.cancel();
|
ci.cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "updateMouse", at = @At("HEAD"), cancellable = true)
|
|
||||||
private void midnightcontrols$updateMouse(CallbackInfo ci) {
|
|
||||||
if (MidnightControlsConfig.eyeTrackerAsMouse && cursorLocked && client.isWindowFocused()) {
|
|
||||||
// Eye Tracking is only for the camera controlling cursor, we need the normal cursor everywhere else.
|
|
||||||
if (!client.options.smoothCameraEnabled) {
|
|
||||||
cursorXSmoother.clear();
|
|
||||||
cursorYSmoother.clear();
|
|
||||||
}
|
|
||||||
EyeTrackerHandler.updateMouseWithEyeTracking(x + cursorDeltaX, y + cursorDeltaY, client,
|
|
||||||
glfwTime, leftButtonClicked, isUsingLongRangedTool(), cursorXSmoother, cursorYSmoother);
|
|
||||||
glfwTime = GlfwUtil.getTime();
|
|
||||||
cursorDeltaX = 0.0;
|
|
||||||
cursorDeltaY = 0.0;
|
|
||||||
ci.cancel();
|
|
||||||
}
|
|
||||||
if (doMixedInput() && client.isWindowFocused()) {
|
|
||||||
ci.cancel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Unique
|
|
||||||
private boolean isUsingLongRangedTool() {
|
|
||||||
if (client.player == null) return false;
|
|
||||||
ItemStack stack = client.player.getActiveItem();
|
|
||||||
return (leftButtonClicked && (stack.getUseAction() == UseAction.BOW || stack.getUseAction() == UseAction.CROSSBOW ||
|
|
||||||
stack.getUseAction() == UseAction.SPEAR || stack.getItem() instanceof ThrowablePotionItem));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "lockCursor", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/InputUtil;setCursorParameters(JIDD)V",shift = At.Shift.BEFORE), cancellable = true)
|
|
||||||
private void midnightcontrols$lockCursor(CallbackInfo ci) {
|
|
||||||
if ((doMixedInput() || MidnightControlsConfig.eyeTrackerAsMouse)) {
|
|
||||||
//In eye tracking mode, we cannot have the cursor locked to the center.
|
|
||||||
GLFW.glfwSetInputMode(client.getWindow().getHandle(), GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
|
|
||||||
client.setScreen(null);
|
|
||||||
hasResolutionChanged = true;
|
|
||||||
ci.cancel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package eu.midnightdust.midnightcontrols.client.mixin;
|
||||||
|
|
||||||
|
import net.minecraft.client.gui.Selectable;
|
||||||
|
import net.minecraft.client.gui.screen.Screen;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Mixin(Screen.class)
|
||||||
|
public interface ScreenAccessor {
|
||||||
|
@Accessor
|
||||||
|
List<Selectable> getSelectables();
|
||||||
|
@Accessor @Nullable
|
||||||
|
Selectable getSelected();
|
||||||
|
}
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.mixin;
|
|
||||||
|
|
||||||
import org.thinkingstudio.obsidianui.Position;
|
|
||||||
import eu.midnightdust.midnightcontrols.ControlsMode;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.ButtonState;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.InputHandlers;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.touch.gui.SilentTexturedButtonWidget;
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
|
||||||
import net.minecraft.client.gui.Drawable;
|
|
||||||
import net.minecraft.client.gui.Element;
|
|
||||||
import net.minecraft.client.gui.Selectable;
|
|
||||||
import net.minecraft.client.gui.screen.Screen;
|
|
||||||
import net.minecraft.client.gui.screen.ingame.HandledScreen;
|
|
||||||
import net.minecraft.text.Text;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
|
|
||||||
import static eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay.WIDGETS_LOCATION;
|
|
||||||
|
|
||||||
@Mixin(Screen.class)
|
|
||||||
public abstract class ScreenMixin {
|
|
||||||
@Shadow protected abstract <T extends Element & Drawable & Selectable> T addDrawableChild(T drawableElement);
|
|
||||||
|
|
||||||
@Shadow public int width;
|
|
||||||
|
|
||||||
@Inject(method = "init(Lnet/minecraft/client/MinecraftClient;II)V", at = @At("TAIL"))
|
|
||||||
public void midnightcontrols$addCloseButton(MinecraftClient client, int width, int height, CallbackInfo ci) {
|
|
||||||
if (MidnightControlsConfig.controlsMode == ControlsMode.TOUCHSCREEN && (MidnightControlsConfig.closeButtonScreens.stream().anyMatch(s -> this.getClass().getName().startsWith(s) || ((Object)this) instanceof HandledScreen<?>))) {
|
|
||||||
this.addDrawableChild(new SilentTexturedButtonWidget(Position.of(this.width - 30, 10), 20, 20, Text.empty(), btn ->
|
|
||||||
InputHandlers.handleExit().press(client, ButtonBinding.BACK, 0f, ButtonState.PRESS), 20, 160, 20, WIDGETS_LOCATION));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.mixin;
|
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
|
||||||
import net.minecraft.client.gui.tab.Tab;
|
|
||||||
import net.minecraft.client.gui.tab.TabManager;
|
|
||||||
import net.minecraft.client.gui.widget.TabNavigationWidget;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
|
||||||
|
|
||||||
@Mixin(TabNavigationWidget.class)
|
|
||||||
public interface TabNavigationWidgetAccessor {
|
|
||||||
@Accessor
|
|
||||||
TabManager getTabManager();
|
|
||||||
@Accessor
|
|
||||||
ImmutableList<Tab> getTabs();
|
|
||||||
}
|
|
||||||
@@ -9,14 +9,8 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.mixin;
|
package eu.midnightdust.midnightcontrols.client.mixin;
|
||||||
|
|
||||||
import com.llamalad7.mixinextras.sugar.Local;
|
|
||||||
import eu.midnightdust.lib.util.MidnightColorUtil;
|
|
||||||
import eu.midnightdust.midnightcontrols.ControlsMode;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
import eu.midnightdust.midnightcontrols.client.touch.TouchInput;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.TouchMode;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.util.RainbowColor;
|
|
||||||
import net.minecraft.block.ShapeContext;
|
import net.minecraft.block.ShapeContext;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.render.*;
|
import net.minecraft.client.render.*;
|
||||||
@@ -26,21 +20,16 @@ import net.minecraft.item.BlockItem;
|
|||||||
import net.minecraft.item.ItemPlacementContext;
|
import net.minecraft.item.ItemPlacementContext;
|
||||||
import net.minecraft.item.ItemUsageContext;
|
import net.minecraft.item.ItemUsageContext;
|
||||||
import net.minecraft.util.Hand;
|
import net.minecraft.util.Hand;
|
||||||
import net.minecraft.util.hit.BlockHitResult;
|
|
||||||
import net.minecraft.util.hit.HitResult;
|
import net.minecraft.util.hit.HitResult;
|
||||||
|
import net.minecraft.util.math.Matrix4f;
|
||||||
import net.minecraft.util.shape.VoxelShape;
|
import net.minecraft.util.shape.VoxelShape;
|
||||||
import org.joml.Matrix4f;
|
|
||||||
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.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
import java.awt.*;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a mixin to WorldRenderer.
|
* Represents a mixin to WorldRenderer.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -60,15 +49,7 @@ public abstract class WorldRendererMixin {
|
|||||||
private BufferBuilderStorage bufferBuilders;
|
private BufferBuilderStorage bufferBuilders;
|
||||||
|
|
||||||
@Shadow
|
@Shadow
|
||||||
private static void drawCuboidShapeOutline(MatrixStack matrices, VertexConsumer vertexConsumer, VoxelShape shape, double offsetX, double offsetY, double offsetZ, float red, float green, float blue, float alpha) {
|
private static void drawShapeOutline(MatrixStack matrixStack, VertexConsumer vertexConsumer, VoxelShape voxelShape, double d, double e, double f, float g, float h, float i, float j) {
|
||||||
}
|
|
||||||
|
|
||||||
@Redirect(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/hit/HitResult;getType()Lnet/minecraft/util/hit/HitResult$Type;"))
|
|
||||||
private HitResult.Type dontRenderOutline(HitResult instance) {
|
|
||||||
if (MidnightControlsConfig.controlsMode == ControlsMode.TOUCHSCREEN && MidnightControlsConfig.touchMode == TouchMode.FINGER_POS) {
|
|
||||||
return HitResult.Type.MISS;
|
|
||||||
}
|
|
||||||
return instance.getType();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(
|
@Inject(
|
||||||
@@ -80,40 +61,15 @@ public abstract class WorldRendererMixin {
|
|||||||
shift = At.Shift.AFTER
|
shift = At.Shift.AFTER
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
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(MatrixStack matrices, float tickDelta, long limitTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer,
|
||||||
if (((MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && MidnightControlsConfig.touchInControllerMode) || MidnightControlsConfig.controlsMode == ControlsMode.TOUCHSCREEN)
|
LightmapTextureManager lightmapTextureManager, Matrix4f matrix4f, CallbackInfo ci) {
|
||||||
&& MidnightControlsConfig.touchMode == TouchMode.FINGER_POS) {
|
|
||||||
this.renderFingerOutline(matrices, camera);
|
|
||||||
}
|
|
||||||
this.renderReacharoundOutline(matrices, camera);
|
|
||||||
}
|
|
||||||
@Unique
|
|
||||||
private void renderFingerOutline(MatrixStack matrices, Camera camera) {
|
|
||||||
if (TouchInput.firstHitResult == null || TouchInput.firstHitResult.getType() != HitResult.Type.BLOCK)
|
|
||||||
return;
|
|
||||||
BlockHitResult result = (BlockHitResult) TouchInput.firstHitResult;
|
|
||||||
var blockPos = result.getBlockPos();
|
|
||||||
if (this.world.getWorldBorder().contains(blockPos) && this.client.player != null) {
|
|
||||||
var outlineShape = this.world.getBlockState(blockPos).getOutlineShape(this.client.world, blockPos, ShapeContext.of(camera.getFocusedEntity()));
|
|
||||||
Color rgb = MidnightColorUtil.hex2Rgb(MidnightControlsConfig.touchOutlineColorHex);
|
|
||||||
if (MidnightControlsConfig.touchOutlineColorHex.isEmpty()) rgb = RainbowColor.radialRainbow(1,1);
|
|
||||||
var pos = camera.getPos();
|
|
||||||
matrices.push();
|
|
||||||
var vertexConsumer = this.bufferBuilders.getEntityVertexConsumers().getBuffer(RenderLayer.getLines());
|
|
||||||
drawCuboidShapeOutline(matrices, vertexConsumer, outlineShape, blockPos.getX() - pos.getX(), blockPos.getY() - pos.getY(), blockPos.getZ() - pos.getZ(),
|
|
||||||
rgb.getRed() / 255.f, rgb.getGreen() / 255.f, rgb.getBlue() / 255.f, MidnightControlsConfig.touchOutlineColorAlpha / 255.f);
|
|
||||||
matrices.pop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@Unique
|
|
||||||
private void 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 = MidnightControlsClient.get().reacharound.getLastReacharoundResult();
|
||||||
if (result == null)
|
if (result == null)
|
||||||
return;
|
return;
|
||||||
var blockPos = result.getBlockPos();
|
var blockPos = result.getBlockPos();
|
||||||
if (this.world.getWorldBorder().contains(blockPos) && this.client.player != null) {
|
if (this.world.getWorldBorder().contains(blockPos)) {
|
||||||
var stack = this.client.player.getStackInHand(Hand.MAIN_HAND);
|
var stack = this.client.player.getStackInHand(Hand.MAIN_HAND);
|
||||||
if (stack == null || !(stack.getItem() instanceof BlockItem))
|
if (stack == null || !(stack.getItem() instanceof BlockItem))
|
||||||
return;
|
return;
|
||||||
@@ -130,14 +86,12 @@ public abstract class WorldRendererMixin {
|
|||||||
var pos = camera.getPos();
|
var pos = camera.getPos();
|
||||||
|
|
||||||
var outlineShape = placementState.getOutlineShape(this.client.world, blockPos, ShapeContext.of(camera.getFocusedEntity()));
|
var outlineShape = placementState.getOutlineShape(this.client.world, blockPos, ShapeContext.of(camera.getFocusedEntity()));
|
||||||
Color rgb = MidnightColorUtil.hex2Rgb(MidnightControlsConfig.reacharoundOutlineColorHex);
|
int[] color = MidnightControlsConfig.reacharoundOutlineColor;
|
||||||
if (MidnightControlsConfig.reacharoundOutlineColorHex.isEmpty()) rgb = RainbowColor.radialRainbow(1,1);
|
|
||||||
matrices.push();
|
|
||||||
var vertexConsumer = this.bufferBuilders.getEntityVertexConsumers().getBuffer(RenderLayer.getLines());
|
var vertexConsumer = this.bufferBuilders.getEntityVertexConsumers().getBuffer(RenderLayer.getLines());
|
||||||
drawCuboidShapeOutline(matrices, vertexConsumer, outlineShape,
|
drawShapeOutline(matrices, vertexConsumer, outlineShape,
|
||||||
(double) blockPos.getX() - pos.getX(), (double) blockPos.getY() - pos.getY(), (double) blockPos.getZ() - pos.getZ(),
|
(double) blockPos.getX() - pos.getX(), (double) blockPos.getY() - pos.getY(), (double) blockPos.getZ() - pos.getZ(),
|
||||||
rgb.getRed() / 255.f, rgb.getGreen() / 255.f, rgb.getBlue() / 255.f, MidnightControlsConfig.reacharoundOutlineColorAlpha / 255.f);
|
color[0] / 255.f, color[1] / 255.f, color[2] / 255.f, color[3] / 255.f);
|
||||||
matrices.pop();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,78 +0,0 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.mouse;
|
|
||||||
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
|
||||||
import net.minecraft.client.util.GlfwUtil;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
|
||||||
import net.minecraft.util.math.Smoother;
|
|
||||||
|
|
||||||
public class EyeTrackerHandler {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
public static void updateMouseWithEyeTracking(double mouseX, double mouseY,
|
|
||||||
MinecraftClient client,
|
|
||||||
double lastMouseUpdateTime,
|
|
||||||
boolean holdingLeftMouseButton,
|
|
||||||
boolean usingLongRangedTool,
|
|
||||||
Smoother smoothX,
|
|
||||||
Smoother smoothY
|
|
||||||
) {
|
|
||||||
// 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,
|
|
||||||
// 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)
|
|
||||||
double centerX = client.getWindow().getWidth() / 2.0;
|
|
||||||
double centerY = client.getWindow().getHeight() / 2.0;
|
|
||||||
double gazeRawX = mouseX - centerX;
|
|
||||||
double gazeRawY = mouseY - centerY;
|
|
||||||
|
|
||||||
//This part follows the original mouse.java somewhat closely, with different constants
|
|
||||||
double feeling = 2.5;
|
|
||||||
double sensitivity = client.options.getMouseSensitivity().getValue() * feeling;
|
|
||||||
double spyglass = sensitivity * sensitivity * sensitivity;
|
|
||||||
double moveScalar = spyglass * 8.0;
|
|
||||||
|
|
||||||
double frameScalar;
|
|
||||||
if(client.options.getPerspective().isFirstPerson() && client.player.isUsingSpyglass()) {
|
|
||||||
frameScalar = spyglass;
|
|
||||||
} else {
|
|
||||||
frameScalar = moveScalar;
|
|
||||||
}
|
|
||||||
if(holdingLeftMouseButton && !usingLongRangedTool) {
|
|
||||||
frameScalar *= 0.5; //Don't move the camera so much while mining. It's annoying.
|
|
||||||
}
|
|
||||||
|
|
||||||
// The longest vector connects the center to the corner of the screen, so that is our maximum magnitude for
|
|
||||||
// normalization. We use normalized screen size vector for resolution independent control
|
|
||||||
double magnitudeMax = Math.sqrt(centerX*centerX + centerY*centerY);
|
|
||||||
double normalizedX = gazeRawX / magnitudeMax;
|
|
||||||
double normalizedY = gazeRawY / magnitudeMax;
|
|
||||||
|
|
||||||
double moveX = normalizedX * frameScalar;
|
|
||||||
double moveY = normalizedY * frameScalar;
|
|
||||||
if (client.options.smoothCameraEnabled) {
|
|
||||||
moveX = smoothX.smooth(moveX, moveScalar*deltaTime);
|
|
||||||
moveY = smoothY.smooth(moveY, moveScalar*deltaTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
// The player entity's needs their facing rotated.
|
|
||||||
double invertY = 1.0;
|
|
||||||
double moveMagnitude = Math.sqrt(normalizedX*normalizedX + normalizedY*normalizedY);
|
|
||||||
if (client.options.getInvertYMouse().getValue()) {
|
|
||||||
invertY = -1.0;
|
|
||||||
}
|
|
||||||
boolean notInDeadzone = (moveMagnitude > MidnightControlsConfig.eyeTrackerDeadzone) && !usingLongRangedTool;
|
|
||||||
if (client.player != null && notInDeadzone) {
|
|
||||||
client.player.changeLookDirection(moveX, moveY * invertY);
|
|
||||||
client.getTutorialManager().onUpdateMouse(moveX, moveY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.client.ring;
|
|
||||||
|
|
||||||
import com.electronwill.nightconfig.core.Config;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.ButtonState;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.util.KeyBindingAccessor;
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
|
||||||
import net.minecraft.client.font.TextRenderer;
|
|
||||||
import net.minecraft.client.gui.DrawContext;
|
|
||||||
import net.minecraft.client.gui.screen.Screen;
|
|
||||||
import net.minecraft.text.OrderedText;
|
|
||||||
import net.minecraft.text.Text;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.function.Supplier;
|
|
||||||
|
|
||||||
public class ButtonBindingRingAction extends RingAction {
|
|
||||||
public static final Factory FACTORY = new Factory();
|
|
||||||
public final ButtonBinding binding;
|
|
||||||
|
|
||||||
public ButtonBindingRingAction(@NotNull ButtonBinding binding) {
|
|
||||||
super();
|
|
||||||
this.binding = binding;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull String getName() {
|
|
||||||
return this.binding.getTranslationKey();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onAction(@NotNull RingButtonMode mode) {
|
|
||||||
binding.handle(MinecraftClient.getInstance(), 1.0f, ButtonState.PRESS);
|
|
||||||
if (binding.asKeyBinding().isPresent()) {
|
|
||||||
binding.asKeyBinding().get().setPressed(true);
|
|
||||||
((KeyBindingAccessor)binding.asKeyBinding().get()).midnightcontrols$press();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void drawIcon(@NotNull DrawContext context, @NotNull TextRenderer textRenderer, int x, int y, boolean hovered) {
|
|
||||||
List<OrderedText> lines = textRenderer.wrapLines(Text.translatable(this.getName()), MidnightRing.ELEMENT_SIZE);
|
|
||||||
for (int i = 0; i < lines.size(); ++i) {
|
|
||||||
context.drawCenteredTextWithShadow(textRenderer, lines.get(i), x + MidnightRing.ELEMENT_SIZE / 2, y + MidnightRing.ELEMENT_SIZE / 2 - textRenderer.fontHeight / 2 * (lines.size()-1) - textRenderer.fontHeight / 2 + textRenderer.fontHeight * i, 0xffffff);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static class Factory implements RingAction.Factory {
|
|
||||||
@Override
|
|
||||||
public @NotNull Supplier<RingAction> newFromGui(@NotNull Screen screen) {
|
|
||||||
return () -> null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @Nullable RingAction parse(@NotNull Config config) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* 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.client.ring;
|
||||||
|
|
||||||
|
import com.electronwill.nightconfig.core.Config;
|
||||||
|
import net.minecraft.client.font.TextRenderer;
|
||||||
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public class DummyRingAction extends RingAction {
|
||||||
|
public DummyRingAction(@NotNull Config config) {
|
||||||
|
super(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull String getName() {
|
||||||
|
return "dummy";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAction(@NotNull RingButtonMode mode) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawIcon(@NotNull MatrixStack matrices, @NotNull TextRenderer textRenderer, int x, int y, boolean hovered) {
|
||||||
|
drawCenteredText(matrices, textRenderer, this.getName(), x + 25, y + 25 - textRenderer.fontHeight / 2, 0xffffff);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
* 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.client.ring;
|
||||||
|
|
||||||
|
import com.electronwill.nightconfig.core.Config;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.util.KeyBindingAccessor;
|
||||||
|
import net.minecraft.client.font.TextRenderer;
|
||||||
|
import net.minecraft.client.gui.screen.Screen;
|
||||||
|
import net.minecraft.client.option.KeyBinding;
|
||||||
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableText;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public class KeyBindingRingAction extends RingAction {
|
||||||
|
public static final Factory FACTORY = new Factory();
|
||||||
|
public final KeyBinding binding;
|
||||||
|
|
||||||
|
public KeyBindingRingAction(@NotNull Config config, @NotNull KeyBinding binding) {
|
||||||
|
super(config);
|
||||||
|
this.binding = binding;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull String getName() {
|
||||||
|
return this.binding.getTranslationKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAction(@NotNull RingButtonMode mode) {
|
||||||
|
KeyBindingAccessor accessor = (KeyBindingAccessor) this.binding;
|
||||||
|
switch (mode) {
|
||||||
|
case PRESS, HOLD -> accessor.midnightcontrols$handlePressState(this.activated);
|
||||||
|
case TOGGLE -> {
|
||||||
|
accessor.midnightcontrols$handlePressState(!this.binding.isPressed());
|
||||||
|
this.activated = !this.binding.isPressed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawIcon(@NotNull MatrixStack matrices, @NotNull TextRenderer textRenderer, int x, int y, boolean hovered) {
|
||||||
|
drawCenteredText(matrices, textRenderer, new TranslatableText(this.getName()), x + 25, y + 25 - textRenderer.fontHeight / 2, 0xffffff);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static class Factory implements RingAction.Factory {
|
||||||
|
@Override
|
||||||
|
public @NotNull Supplier<RingAction> newFromGui(@NotNull Screen screen) {
|
||||||
|
return () -> null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable RingAction parse(@NotNull Config config) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,12 +9,10 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.ring;
|
package eu.midnightdust.midnightcontrols.client.ring;
|
||||||
|
|
||||||
|
import com.electronwill.nightconfig.core.Config;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
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.InputManager;
|
|
||||||
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
||||||
import net.minecraft.util.math.MathHelper;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -30,7 +28,7 @@ import java.util.Map;
|
|||||||
* @since 1.4.0
|
* @since 1.4.0
|
||||||
*/
|
*/
|
||||||
public final class MidnightRing {
|
public final class MidnightRing {
|
||||||
public static final int ELEMENT_SIZE = 75;
|
public static final int ELEMENT_SIZE = 50;
|
||||||
|
|
||||||
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));
|
||||||
@@ -43,7 +41,7 @@ public final class MidnightRing {
|
|||||||
|
|
||||||
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 + "\".");
|
this.mod.warn("Tried to register twice a ring action: \"" + name + "\".");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.actionFactories.put(name, factory);
|
this.actionFactories.put(name, factory);
|
||||||
@@ -52,55 +50,18 @@ public final class MidnightRing {
|
|||||||
/**
|
/**
|
||||||
* Loads the ring from configuration.
|
* Loads the ring from configuration.
|
||||||
*/
|
*/
|
||||||
public void loadFromConfig() {
|
public void load() {
|
||||||
List<String> configBindings = MidnightControlsConfig.ringBindings;
|
List<Config> configPages = null;
|
||||||
if (configBindings != null) {
|
if (configPages != null) {
|
||||||
this.pages.clear();
|
this.pages.clear();
|
||||||
int bindingIndex = 0;
|
for (var configPage : configPages) {
|
||||||
for (int i = 0; i < MathHelper.ceil(configBindings.size() / 8f); ++i) {
|
RingPage.parseRingPage(configPage).ifPresent(this.pages::add);
|
||||||
this.pages.add(new RingPage(i+1 + " / " + MathHelper.ceil(configBindings.size() / 8f)));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (String binding : configBindings) {
|
|
||||||
ButtonBinding buttonBinding = InputManager.getBinding(binding);
|
|
||||||
if (buttonBinding != null) {
|
|
||||||
RingPage page = this.pages.get(MathHelper.floor(bindingIndex / 8f));
|
|
||||||
page.actions[bindingIndex - 8 * (MathHelper.floor(bindingIndex / 8f))] = (new ButtonBindingRingAction(buttonBinding));
|
|
||||||
++bindingIndex;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.pages.isEmpty()) {
|
if (this.pages.isEmpty()) {
|
||||||
this.pages.add(RingPage.DEFAULT);
|
this.pages.add(RingPage.DEFAULT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
* Loads the ring from all unbound keys.
|
|
||||||
*/
|
|
||||||
public void loadFromUnbound() {
|
|
||||||
List<ButtonBinding> unboundBindings = InputManager.getUnboundBindings();
|
|
||||||
if (unboundBindings != null) {
|
|
||||||
this.pages.clear();
|
|
||||||
int bindingIndex = 0;
|
|
||||||
for (int i = 0; i < MathHelper.ceil(unboundBindings.size() / 8f); ++i) {
|
|
||||||
this.pages.add(new RingPage(i+1 + " / " + MathHelper.ceil(unboundBindings.size() / 8f)));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (ButtonBinding buttonBinding : unboundBindings) {
|
|
||||||
if (buttonBinding != null) {
|
|
||||||
RingPage page = this.pages.get(MathHelper.floor(bindingIndex / 8f));
|
|
||||||
page.actions[bindingIndex - 8 * (MathHelper.floor(bindingIndex / 8f))] = (new ButtonBindingRingAction(buttonBinding));
|
|
||||||
++bindingIndex;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (this.pages.isEmpty()) {
|
|
||||||
this.pages.add(RingPage.DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public int getMaxPages() {
|
|
||||||
return this.pages.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
public @NotNull RingPage getCurrentPage() {
|
public @NotNull RingPage getCurrentPage() {
|
||||||
if (this.currentPage >= this.pages.size())
|
if (this.currentPage >= this.pages.size())
|
||||||
@@ -109,13 +70,4 @@ public final class MidnightRing {
|
|||||||
this.currentPage = 0;
|
this.currentPage = 0;
|
||||||
return this.pages.get(this.currentPage);
|
return this.pages.get(this.currentPage);
|
||||||
}
|
}
|
||||||
public void cyclePage(boolean forwards) {
|
|
||||||
if (forwards) {
|
|
||||||
if (currentPage < pages.size()-1) ++currentPage;
|
|
||||||
else currentPage = 0;
|
|
||||||
} else {
|
|
||||||
if (currentPage > 0) --currentPage;
|
|
||||||
else currentPage = pages.size();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,9 +11,11 @@ package eu.midnightdust.midnightcontrols.client.ring;
|
|||||||
|
|
||||||
import com.electronwill.nightconfig.core.Config;
|
import com.electronwill.nightconfig.core.Config;
|
||||||
import net.minecraft.client.font.TextRenderer;
|
import net.minecraft.client.font.TextRenderer;
|
||||||
import net.minecraft.client.gui.DrawContext;
|
import net.minecraft.client.gui.DrawableHelper;
|
||||||
import net.minecraft.client.gui.screen.Screen;
|
import net.minecraft.client.gui.screen.Screen;
|
||||||
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableText;
|
||||||
import org.aperlambda.lambdacommon.utils.Nameable;
|
import org.aperlambda.lambdacommon.utils.Nameable;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
@@ -27,10 +29,12 @@ import java.util.function.Supplier;
|
|||||||
* @version 1.5.0
|
* @version 1.5.0
|
||||||
* @since 1.4.0
|
* @since 1.4.0
|
||||||
*/
|
*/
|
||||||
public abstract class RingAction implements Nameable {
|
public abstract class RingAction extends DrawableHelper implements Nameable {
|
||||||
|
protected Config config;
|
||||||
protected boolean activated = false;
|
protected boolean activated = false;
|
||||||
|
|
||||||
public RingAction() {
|
public RingAction(@NotNull Config config) {
|
||||||
|
this.config = config;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -39,7 +43,7 @@ public abstract class RingAction implements Nameable {
|
|||||||
* @return the text name
|
* @return the text name
|
||||||
*/
|
*/
|
||||||
public Text getTextName() {
|
public Text getTextName() {
|
||||||
return Text.translatable(this.getName());
|
return new TranslatableText(this.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -59,12 +63,12 @@ public abstract class RingAction implements Nameable {
|
|||||||
|
|
||||||
public abstract void onAction(@NotNull RingButtonMode mode);
|
public abstract void onAction(@NotNull RingButtonMode mode);
|
||||||
|
|
||||||
public void render(@NotNull DrawContext context, @NotNull TextRenderer textRenderer, int x, int y, boolean hovered, int index) {
|
public void render(@NotNull MatrixStack matrices, @NotNull TextRenderer textRenderer, int x, int y, boolean hovered) {
|
||||||
context.fill(x, y, x + MidnightRing.ELEMENT_SIZE, y + MidnightRing.ELEMENT_SIZE, hovered || RingPage.selected == index ? 0xbb777777 : 0xbb000000);
|
fill(matrices, x, y, x + MidnightRing.ELEMENT_SIZE, y + MidnightRing.ELEMENT_SIZE, hovered ? 0xbb777777 : 0xbb000000);
|
||||||
drawIcon(context, textRenderer, x, y, hovered);
|
drawIcon(matrices, textRenderer, x, y, hovered);
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract void drawIcon(@NotNull DrawContext context, @NotNull TextRenderer textRenderer, int x, int y, boolean hovered);
|
public abstract void drawIcon(@NotNull MatrixStack matrices, @NotNull TextRenderer textRenderer, int x, int y, boolean hovered);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a factory for {@link RingAction}.
|
* Represents a factory for {@link RingAction}.
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.ring;
|
package eu.midnightdust.midnightcontrols.client.ring;
|
||||||
|
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableText;
|
||||||
import org.aperlambda.lambdacommon.utils.Nameable;
|
import org.aperlambda.lambdacommon.utils.Nameable;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
@@ -30,7 +31,7 @@ public enum RingButtonMode implements Nameable {
|
|||||||
|
|
||||||
RingButtonMode(@NotNull String name) {
|
RingButtonMode(@NotNull String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.text = Text.translatable(this.getTranslationKey());
|
this.text = new TranslatableText(this.getTranslationKey());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -9,12 +9,19 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.ring;
|
package eu.midnightdust.midnightcontrols.client.ring;
|
||||||
|
|
||||||
|
import com.electronwill.nightconfig.core.Config;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
||||||
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.font.TextRenderer;
|
import net.minecraft.client.font.TextRenderer;
|
||||||
import net.minecraft.client.gui.DrawContext;
|
import net.minecraft.client.gui.DrawableHelper;
|
||||||
|
import net.minecraft.client.gui.screen.ChatScreen;
|
||||||
import net.minecraft.client.util.math.MatrixStack;
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a ring page.
|
* Represents a ring page.
|
||||||
*
|
*
|
||||||
@@ -22,34 +29,37 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
* @version 1.5.0
|
* @version 1.5.0
|
||||||
* @since 1.4.0
|
* @since 1.4.0
|
||||||
*/
|
*/
|
||||||
public class RingPage {
|
public class RingPage extends DrawableHelper {
|
||||||
public static final RingPage DEFAULT = new RingPage("Default");
|
public static final RingPage DEFAULT = new RingPage("Default");
|
||||||
|
|
||||||
public final String name;
|
public final String name;
|
||||||
public static int selected = -1;
|
private RingAction[] actions = new RingAction[8];
|
||||||
public RingAction[] actions = new RingAction[8];
|
|
||||||
|
|
||||||
public RingPage(@NotNull String name) {
|
public RingPage(@NotNull String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < 8; i++) {
|
||||||
this.actions[i] = null;
|
this.actions[i] = null;
|
||||||
}
|
}
|
||||||
|
this.actions[0] = new DummyRingAction(null);
|
||||||
|
this.actions[1] = new KeyBindingRingAction(null, MidnightControlsClient.BINDING_LOOK_UP);
|
||||||
|
this.actions[2] = new KeyBindingRingAction(null, MidnightControlsClient.BINDING_LOOK_LEFT);
|
||||||
|
this.actions[3] = new KeyBindingRingAction(null, MidnightControlsClient.BINDING_LOOK_RIGHT);
|
||||||
|
this.actions[4] = new KeyBindingRingAction(null, MidnightControlsClient.BINDING_LOOK_DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Renders the ring page.
|
* Renders the ring page.
|
||||||
*
|
*
|
||||||
* @param context the context
|
* @param matrices the matrices
|
||||||
* @param width the screen width
|
* @param width the screen width
|
||||||
* @param height the screen height
|
* @param height the screen height
|
||||||
* @param mouseX the mouse X-coordinate
|
* @param mouseX the mouse X-coordinate
|
||||||
* @param mouseY the mouse Y-coordinate
|
* @param mouseY the mouse Y-coordinate
|
||||||
* @param tickDelta the tick delta
|
* @param tickDelta the tick delta
|
||||||
*/
|
*/
|
||||||
public void render(@NotNull DrawContext context, @NotNull TextRenderer textRenderer, int width, int height, int mouseX, int mouseY, float tickDelta) {
|
public void render(@NotNull MatrixStack matrices, @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);
|
|
||||||
|
|
||||||
int offset = MidnightRing.ELEMENT_SIZE + (MidnightRing.ELEMENT_SIZE / 2) + 5;
|
int offset = MidnightRing.ELEMENT_SIZE + (MidnightRing.ELEMENT_SIZE / 2) + 5;
|
||||||
|
|
||||||
@@ -58,29 +68,29 @@ public class RingPage {
|
|||||||
for (int i = 0; i < 3; i++) {
|
for (int i = 0; i < 3; i++) {
|
||||||
var ringAction = this.actions[i];
|
var ringAction = this.actions[i];
|
||||||
if (ringAction != null)
|
if (ringAction != null)
|
||||||
ringAction.render(context, textRenderer, x, y, isHovered(x, y, mouseX, mouseY), i);
|
ringAction.render(matrices, textRenderer, x, y, isHovered(x, y, mouseX, mouseY));
|
||||||
x += MidnightRing.ELEMENT_SIZE + 5;
|
x += 55;
|
||||||
}
|
}
|
||||||
y += MidnightRing.ELEMENT_SIZE + 5;
|
y += 55;
|
||||||
x = centerX - offset;
|
x = centerX - offset;
|
||||||
for (int i = 3; i < 5; i++) {
|
for (int i = 3; i < 5; i++) {
|
||||||
var ringAction = this.actions[i];
|
var ringAction = this.actions[i];
|
||||||
if (ringAction != null)
|
if (ringAction != null)
|
||||||
ringAction.render(context, textRenderer, x, y, isHovered(x, y, mouseX, mouseY), i);
|
ringAction.render(matrices, textRenderer, x, y, isHovered(x, y, mouseX, mouseY));
|
||||||
x += (MidnightRing.ELEMENT_SIZE + 5) * 2;
|
x += 55 * 2;
|
||||||
}
|
}
|
||||||
y += MidnightRing.ELEMENT_SIZE + 5;
|
y += 55;
|
||||||
x = centerX - offset;
|
x = centerX - offset;
|
||||||
for (int i = 5; i < 8; i++) {
|
for (int i = 5; i < 8; i++) {
|
||||||
var ringAction = this.actions[i];
|
var ringAction = this.actions[i];
|
||||||
if (ringAction != null)
|
if (ringAction != null)
|
||||||
ringAction.render(context, textRenderer, x, y, isHovered(x, y, mouseX, mouseY), i);
|
ringAction.render(matrices, textRenderer, x, y, isHovered(x, y, mouseX, mouseY));
|
||||||
x += MidnightRing.ELEMENT_SIZE + 5;
|
x += 55;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isHovered(int x, int y, int mouseX, int mouseY) {
|
private static boolean isHovered(int x, int y, int mouseX, int mouseY) {
|
||||||
return mouseX >= x && mouseY >= y && mouseX <= x + MidnightRing.ELEMENT_SIZE && mouseY <= y + MidnightRing.ELEMENT_SIZE && selected < 0;
|
return mouseX >= x && mouseY >= y && mouseX <= x + MidnightRing.ELEMENT_SIZE && mouseY <= y + MidnightRing.ELEMENT_SIZE;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Renders the ring page.
|
* Renders the ring page.
|
||||||
@@ -104,9 +114,9 @@ public class RingPage {
|
|||||||
ringAction.activate(RingButtonMode.PRESS);
|
ringAction.activate(RingButtonMode.PRESS);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
x += MidnightRing.ELEMENT_SIZE + 5;
|
x += 55;
|
||||||
}
|
}
|
||||||
y += MidnightRing.ELEMENT_SIZE + 5;
|
y += 55;
|
||||||
x = centerX - offset;
|
x = centerX - offset;
|
||||||
for (int i = 3; i < 5; i++) {
|
for (int i = 3; i < 5; i++) {
|
||||||
var ringAction = this.actions[i];
|
var ringAction = this.actions[i];
|
||||||
@@ -114,9 +124,9 @@ public class RingPage {
|
|||||||
ringAction.activate(RingButtonMode.PRESS);
|
ringAction.activate(RingButtonMode.PRESS);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
x += (MidnightRing.ELEMENT_SIZE + 5) * 2;
|
x += 55 * 2;
|
||||||
}
|
}
|
||||||
y += MidnightRing.ELEMENT_SIZE + 5;
|
y += 55;
|
||||||
x = centerX - offset;
|
x = centerX - offset;
|
||||||
for (int i = 5; i < 8; i++) {
|
for (int i = 5; i < 8; i++) {
|
||||||
var ringAction = this.actions[i];
|
var ringAction = this.actions[i];
|
||||||
@@ -124,8 +134,27 @@ public class RingPage {
|
|||||||
ringAction.activate(RingButtonMode.PRESS);
|
ringAction.activate(RingButtonMode.PRESS);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
x += MidnightRing.ELEMENT_SIZE + 5;
|
x += 55;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tries to parse a ring page configuration.
|
||||||
|
*
|
||||||
|
* @param config the configuration
|
||||||
|
* @return an optional ring page
|
||||||
|
*/
|
||||||
|
public static @NotNull Optional<RingPage> parseRingPage(@NotNull Config config) {
|
||||||
|
String name = config.get("name");
|
||||||
|
if (name == null)
|
||||||
|
return Optional.empty();
|
||||||
|
|
||||||
|
var page = new RingPage(name);
|
||||||
|
|
||||||
|
List<Config> actionConfigs = config.get("actions");
|
||||||
|
|
||||||
|
|
||||||
|
return Optional.of(page);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,104 +0,0 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.touch;
|
|
||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay;
|
|
||||||
import net.minecraft.block.BlockState;
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import net.minecraft.util.ActionResult;
|
|
||||||
import net.minecraft.util.Hand;
|
|
||||||
import net.minecraft.util.hit.BlockHitResult;
|
|
||||||
import net.minecraft.util.hit.EntityHitResult;
|
|
||||||
import net.minecraft.util.hit.HitResult;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
|
||||||
|
|
||||||
import static eu.midnightdust.midnightcontrols.client.MidnightControlsConfig.doMixedInput;
|
|
||||||
|
|
||||||
public class TouchInput {
|
|
||||||
private static final MinecraftClient client = MinecraftClient.getInstance();
|
|
||||||
public static long clickStartTime;
|
|
||||||
public static HitResult firstHitResult = null;
|
|
||||||
public static void tick() {
|
|
||||||
if ((client.currentScreen == null && doMixedInput()) || client.currentScreen instanceof TouchscreenOverlay) {
|
|
||||||
double scaleFactor = client.getWindow().getScaleFactor();
|
|
||||||
if (clickStartTime > 0 && System.currentTimeMillis() - clickStartTime >= MidnightControlsConfig.touchBreakDelay) {
|
|
||||||
mouseHeldDown(client.mouse.getX() / scaleFactor, client.mouse.getY() / scaleFactor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static void mouseHeldDown(double mouseX, double mouseY) {
|
|
||||||
assert client != null;
|
|
||||||
assert client.player != null;
|
|
||||||
assert client.interactionManager != null;
|
|
||||||
|
|
||||||
if (client.player.getMainHandStack() != null && TouchUtils.hasInWorldUseAction(client.player.getMainHandStack())) {
|
|
||||||
client.interactionManager.interactItem(client.player, client.player.getActiveHand());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
HitResult result = TouchUtils.getTargettedObject(mouseX, mouseY);
|
|
||||||
if (result == null || firstHitResult == null) {
|
|
||||||
client.interactionManager.cancelBlockBreaking();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result instanceof BlockHitResult blockHit && firstHitResult instanceof BlockHitResult firstBlock && blockHit.getBlockPos().equals(firstBlock.getBlockPos())) {
|
|
||||||
if (MidnightControlsConfig.debug) System.out.println(blockHit.getBlockPos().toString());
|
|
||||||
if (client.interactionManager.updateBlockBreakingProgress(blockHit.getBlockPos(), blockHit.getSide())) {
|
|
||||||
client.particleManager.addBlockBreakingParticles(blockHit.getBlockPos(), blockHit.getSide());
|
|
||||||
client.player.swingHand(Hand.MAIN_HAND);
|
|
||||||
} else client.interactionManager.cancelBlockBreaking();
|
|
||||||
firstHitResult = TouchUtils.getTargettedObject(mouseX, mouseY);
|
|
||||||
}
|
|
||||||
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) {
|
|
||||||
client.player.swingHand(Hand.MAIN_HAND);
|
|
||||||
}
|
|
||||||
firstHitResult = TouchUtils.getTargettedObject(mouseX, mouseY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static boolean mouseReleased(double mouseX, double mouseY, int button) {
|
|
||||||
firstHitResult = null;
|
|
||||||
if (client.interactionManager != null) client.interactionManager.cancelBlockBreaking();
|
|
||||||
if ((client.currentScreen == null || !client.currentScreen.mouseReleased(mouseX, mouseY, button)) && System.currentTimeMillis() - clickStartTime < MidnightControlsConfig.touchBreakDelay) {
|
|
||||||
assert client.player != null;
|
|
||||||
assert client.world != null;
|
|
||||||
assert client.interactionManager != null;
|
|
||||||
clickStartTime = -1;
|
|
||||||
|
|
||||||
if (client.player.getMainHandStack() != null && TouchUtils.hasInWorldUseAction(client.player.getMainHandStack())) {
|
|
||||||
client.interactionManager.stopUsingItem(client.player);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
HitResult result = TouchUtils.getTargettedObject(mouseX, mouseY);
|
|
||||||
if (result == null) return false;
|
|
||||||
|
|
||||||
|
|
||||||
if (result instanceof BlockHitResult blockHit) {
|
|
||||||
BlockPos blockPos = blockHit.getBlockPos().offset(blockHit.getSide());
|
|
||||||
BlockState state = client.world.getBlockState(blockPos);
|
|
||||||
|
|
||||||
if (client.world.isAir(blockPos) || state.isReplaceable()) {
|
|
||||||
ItemStack stackInHand = client.player.getMainHandStack();
|
|
||||||
int previousStackCount = stackInHand.getCount();
|
|
||||||
var interaction = client.interactionManager.interactBlock(client.player, client.player.getActiveHand(), blockHit);
|
|
||||||
if (interaction.isAccepted()) {
|
|
||||||
if (interaction.shouldSwingHand()) {
|
|
||||||
client.player.swingHand(client.player.preferredHand);
|
|
||||||
if (!stackInHand.isEmpty() && (stackInHand.getCount() != previousStackCount || client.interactionManager.hasCreativeInventory())) {
|
|
||||||
client.gameRenderer.firstPersonRenderer.resetEquipProgress(client.player.preferredHand);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (result instanceof EntityHitResult entityHit) {
|
|
||||||
client.interactionManager.attackEntity(client.player, entityHit.getEntity());
|
|
||||||
client.player.swingHand(Hand.MAIN_HAND);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
clickStartTime = -1;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.touch;
|
|
||||||
|
|
||||||
import eu.midnightdust.lib.util.PlatformFunctions;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.TouchMode;
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
|
||||||
import net.minecraft.client.render.Camera;
|
|
||||||
import net.minecraft.entity.projectile.ProjectileUtil;
|
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import net.minecraft.util.UseAction;
|
|
||||||
import net.minecraft.util.hit.BlockHitResult;
|
|
||||||
import net.minecraft.util.hit.EntityHitResult;
|
|
||||||
import net.minecraft.util.hit.HitResult;
|
|
||||||
import net.minecraft.util.math.Box;
|
|
||||||
import net.minecraft.util.math.Vec3d;
|
|
||||||
import net.minecraft.world.RaycastContext;
|
|
||||||
import org.joml.Matrix4f;
|
|
||||||
import org.joml.Vector3f;
|
|
||||||
import org.lwjgl.opengl.GL11;
|
|
||||||
|
|
||||||
import static eu.midnightdust.midnightcontrols.client.MidnightReacharound.getPlayerRange;
|
|
||||||
|
|
||||||
public class TouchUtils {
|
|
||||||
private static final MinecraftClient client = MinecraftClient.getInstance();
|
|
||||||
public static final Matrix4f lastWorldSpaceMatrix = new Matrix4f();
|
|
||||||
public static final Matrix4f lastProjMat = 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")) {
|
|
||||||
return client.crosshairTarget;
|
|
||||||
}
|
|
||||||
Vec3d near = screenSpaceToWorldSpace(mouseX, mouseY, 0);
|
|
||||||
Vec3d far = screenSpaceToWorldSpace(mouseX, mouseY, 1);
|
|
||||||
EntityHitResult entityCast = ProjectileUtil.raycast(client.player, near, far, Box.from(client.player.getPos()).expand(getPlayerRange(client)), entity -> (!entity.isSpectator() && entity.isAttackable()), getPlayerRange(client) * getPlayerRange(client));
|
|
||||||
|
|
||||||
if (entityCast != null && entityCast.getType() == HitResult.Type.ENTITY) return entityCast;
|
|
||||||
|
|
||||||
BlockHitResult result = client.world.raycast(new RaycastContext(near, far, RaycastContext.ShapeType.OUTLINE, RaycastContext.FluidHandling.ANY, client.player));
|
|
||||||
|
|
||||||
if (client.player.getPos().distanceTo(result.getPos()) > getPlayerRange(client)) return null;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Taken from https://github.com/0x3C50/Renderer/blob/master/src/main/java/me/x150/renderer/util/RendererUtils.java#L270
|
|
||||||
* Credits to 0x3C50 */
|
|
||||||
public static Vec3d screenSpaceToWorldSpace(double x, double y, double d) {
|
|
||||||
Camera camera = client.getEntityRenderDispatcher().camera;
|
|
||||||
int displayHeight = client.getWindow().getScaledHeight();
|
|
||||||
int displayWidth = client.getWindow().getScaledWidth();
|
|
||||||
int[] viewport = new int[4];
|
|
||||||
GL11.glGetIntegerv(GL11.GL_VIEWPORT, viewport);
|
|
||||||
Vector3f target = new Vector3f();
|
|
||||||
|
|
||||||
Matrix4f matrixProj = new Matrix4f(lastProjMat);
|
|
||||||
Matrix4f matrixModel = new Matrix4f(lastModMat);
|
|
||||||
|
|
||||||
matrixProj.mul(matrixModel)
|
|
||||||
.mul(lastWorldSpaceMatrix)
|
|
||||||
.unproject((float) x / displayWidth * viewport[2],
|
|
||||||
(float) (displayHeight - y) / displayHeight * viewport[3], (float) d, viewport, target);
|
|
||||||
|
|
||||||
return new Vec3d(target.x, target.y, target.z).add(camera.getPos());
|
|
||||||
}
|
|
||||||
public static boolean hasInWorldUseAction(ItemStack stack) {
|
|
||||||
UseAction action = stack.getUseAction();
|
|
||||||
return action == UseAction.BOW || action == UseAction.BRUSH || action == UseAction.SPEAR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.touch.gui;
|
|
||||||
|
|
||||||
import org.thinkingstudio.obsidianui.Position;
|
|
||||||
import org.thinkingstudio.obsidianui.widget.SpruceButtonWidget;
|
|
||||||
import eu.midnightdust.midnightcontrols.MidnightControlsConstants;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
|
||||||
import net.minecraft.item.ArmorItem;
|
|
||||||
import net.minecraft.text.Text;
|
|
||||||
import net.minecraft.util.UseAction;
|
|
||||||
|
|
||||||
public class ItemUseButtonWidget extends SpruceButtonWidget {
|
|
||||||
|
|
||||||
public ItemUseButtonWidget(Position position, int width, int height, Text message, PressAction action) {
|
|
||||||
super(position, width, height, message, action);
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
protected void onRelease(double mouseX, double mouseY) {
|
|
||||||
assert client.player != null;
|
|
||||||
assert client.interactionManager != null;
|
|
||||||
UseAction action = client.player.getMainHandStack().getUseAction();
|
|
||||||
if (action == UseAction.SPYGLASS || action == UseAction.TOOT_HORN) client.interactionManager.stopUsingItem(client.player);
|
|
||||||
super.onRelease(mouseX, mouseY);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setVisible(boolean visible) {
|
|
||||||
if (visible && client.player != null && client.player.getMainHandStack() != null) {
|
|
||||||
UseAction action = client.player.getMainHandStack().getUseAction();
|
|
||||||
if (action == UseAction.EAT) {
|
|
||||||
this.setMessage(Text.translatable(MidnightControlsConstants.NAMESPACE+".action.eat"));
|
|
||||||
} else if (action == UseAction.DRINK) {
|
|
||||||
this.setMessage(Text.translatable(MidnightControlsConstants.NAMESPACE+".action.drink"));
|
|
||||||
} else if (client.player.getMainHandStack().getItem() instanceof ArmorItem) {
|
|
||||||
this.setMessage(Text.translatable(MidnightControlsConstants.NAMESPACE+".action.equip"));
|
|
||||||
} else if (!action.equals(UseAction.NONE)) {
|
|
||||||
this.setMessage(Text.translatable(MidnightControlsConstants.NAMESPACE+".action.use"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.setAlpha(MidnightControlsConfig.touchTransparency / 100f);
|
|
||||||
super.setVisible(visible);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.util;
|
|
||||||
|
|
||||||
import net.minecraft.util.math.MathHelper;
|
|
||||||
|
|
||||||
public class MathUtil {
|
|
||||||
public static class PolarUtil {
|
|
||||||
public float polarX;
|
|
||||||
public float polarY;
|
|
||||||
public PolarUtil() {}
|
|
||||||
|
|
||||||
public void calculate(float x, float y, float speedFactor) {
|
|
||||||
calculate(x, y, speedFactor, 0);
|
|
||||||
}
|
|
||||||
public void calculate(float x, float y, float speedFactor, double deadZone) {
|
|
||||||
double inputR = Math.pow(x, 2) + Math.pow(y, 2);
|
|
||||||
inputR = (Math.abs(speedFactor * MathHelper.clamp(inputR,0.f,1.f)));
|
|
||||||
inputR = inputR < deadZone ? 0f : (inputR-deadZone) / (1f-deadZone);
|
|
||||||
double inputTheta = Math.atan2(y, x);
|
|
||||||
polarX = (float) (inputR *Math.cos(inputTheta));
|
|
||||||
polarY = (float) (inputR *Math.sin(inputTheta));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* 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.client.util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents mouse's extra access.
|
||||||
|
*/
|
||||||
|
public interface MouseAccessor {
|
||||||
|
void midnightcontrols$onCursorPos(long window, double x, double y);
|
||||||
|
void setLeftButtonClicked(boolean value);
|
||||||
|
}
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.util;
|
|
||||||
|
|
||||||
import java.awt.*;
|
|
||||||
|
|
||||||
public class RainbowColor {
|
|
||||||
public static float hue;
|
|
||||||
public static void tick() {
|
|
||||||
if (hue > 1) hue = 0f;
|
|
||||||
hue = hue + 0.01f;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Color radialRainbow(float saturation, float brightness) {
|
|
||||||
return Color.getHSBColor(hue, saturation, brightness);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
package eu.midnightdust.midnightcontrols.packet;
|
|
||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.MidnightControlsConstants;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
|
||||||
import io.netty.buffer.Unpooled;
|
|
||||||
import net.fabricmc.loader.api.FabricLoader;
|
|
||||||
import net.fabricmc.loader.api.ModContainer;
|
|
||||||
import net.minecraft.network.PacketByteBuf;
|
|
||||||
import net.minecraft.network.RegistryByteBuf;
|
|
||||||
import net.minecraft.network.codec.PacketCodec;
|
|
||||||
import net.minecraft.network.packet.CustomPayload;
|
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
public record ControlsModePacket(String controlsMode) implements CustomPayload {
|
|
||||||
public static final Id<ControlsModePacket> PACKET_ID = new Id<>(MidnightControlsConstants.CONTROLS_MODE_CHANNEL);
|
|
||||||
public static final PacketCodec<RegistryByteBuf, ControlsModePacket> codec = PacketCodec.of(ControlsModePacket::write, ControlsModePacket::read);
|
|
||||||
|
|
||||||
public static ControlsModePacket read(RegistryByteBuf buf) {
|
|
||||||
return new ControlsModePacket(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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
package eu.midnightdust.midnightcontrols.packet;
|
|
||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.MidnightControlsConstants;
|
|
||||||
import eu.midnightdust.midnightcontrols.MidnightControlsFeature;
|
|
||||||
import net.minecraft.network.RegistryByteBuf;
|
|
||||||
import net.minecraft.network.codec.PacketCodec;
|
|
||||||
import net.minecraft.network.packet.CustomPayload;
|
|
||||||
|
|
||||||
public record FeaturePacket(MidnightControlsFeature... features) implements CustomPayload {
|
|
||||||
public static final Id<FeaturePacket> PACKET_ID = new Id<>(MidnightControlsConstants.FEATURE_CHANNEL);
|
|
||||||
public static final PacketCodec<RegistryByteBuf, FeaturePacket> codec = PacketCodec.of(FeaturePacket::write, FeaturePacket::read);
|
|
||||||
|
|
||||||
public static FeaturePacket read(RegistryByteBuf buf) {
|
|
||||||
int featureLength = buf.readVarInt();
|
|
||||||
MidnightControlsFeature[] receivedFeatures = new MidnightControlsFeature[featureLength];
|
|
||||||
for (int i = 0; i < featureLength; i++) {
|
|
||||||
var name = buf.readString(64);
|
|
||||||
boolean allowed = buf.readBoolean();
|
|
||||||
var feature = MidnightControlsFeature.fromName(name);
|
|
||||||
if (feature.isPresent()) {
|
|
||||||
feature.get().setAllowed(allowed);
|
|
||||||
receivedFeatures[i] = feature.get();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new FeaturePacket(receivedFeatures);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void write(RegistryByteBuf buf) {
|
|
||||||
if (features.length == 0)
|
|
||||||
throw new IllegalArgumentException("At least one feature must be provided.");
|
|
||||||
|
|
||||||
buf.writeVarInt(features.length);
|
|
||||||
for (var feature : features) {
|
|
||||||
buf.writeString(feature.getName(), 64);
|
|
||||||
buf.writeBoolean(feature.isAllowed());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Id<? extends CustomPayload> getId() {
|
|
||||||
return PACKET_ID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
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 HelloPacket(String version, String controlsMode) implements CustomPayload {
|
|
||||||
public static final CustomPayload.Id<HelloPacket> PACKET_ID = new CustomPayload.Id<>(MidnightControlsConstants.HELLO_CHANNEL);
|
|
||||||
public static final PacketCodec<RegistryByteBuf, HelloPacket> codec = PacketCodec.of(HelloPacket::write, HelloPacket::read);
|
|
||||||
|
|
||||||
public static HelloPacket read(RegistryByteBuf buf) {
|
|
||||||
return new HelloPacket(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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -4,11 +4,10 @@
|
|||||||
"key.midnightcontrols.look_left": "Nach links schauen",
|
"key.midnightcontrols.look_left": "Nach links schauen",
|
||||||
"key.midnightcontrols.look_right": "Nach rechts schauen",
|
"key.midnightcontrols.look_right": "Nach rechts schauen",
|
||||||
"key.midnightcontrols.look_up": "Nach oben schauen",
|
"key.midnightcontrols.look_up": "Nach oben schauen",
|
||||||
"key.midnightcontrols.ring": "Öffne Ring mit ungebundenen Aktionen",
|
"key.midnightcontrols.ring": "Zeige Steuerungsring",
|
||||||
"midnightcontrols.action.attack": "Angreifen",
|
"midnightcontrols.action.attack": "Angreifen",
|
||||||
"midnightcontrols.action.back": "Zurück",
|
"midnightcontrols.action.back": "Zurück",
|
||||||
"midnightcontrols.action.chat": "Chat öffnen",
|
"midnightcontrols.action.chat": "Chat öffnen",
|
||||||
"midnightcontrols.action.controls_ring": "Öffne Ring mit ungebundenen Aktionen",
|
|
||||||
"midnightcontrols.action.drop_item": "Item droppen",
|
"midnightcontrols.action.drop_item": "Item droppen",
|
||||||
"midnightcontrols.action.exit": "Schließen",
|
"midnightcontrols.action.exit": "Schließen",
|
||||||
"midnightcontrols.action.forward": "Vorwärts",
|
"midnightcontrols.action.forward": "Vorwärts",
|
||||||
@@ -41,6 +40,8 @@
|
|||||||
"midnightcontrols.action.zoom_in": "Zoom erhöhen",
|
"midnightcontrols.action.zoom_in": "Zoom erhöhen",
|
||||||
"midnightcontrols.action.zoom_out": "Zoom verringern",
|
"midnightcontrols.action.zoom_out": "Zoom verringern",
|
||||||
"midnightcontrols.action.zoom_reset": "Zoom zurücksetzen",
|
"midnightcontrols.action.zoom_reset": "Zoom zurücksetzen",
|
||||||
|
"midnightcontrols.action.key.emotecraft.fastchoose": "Emote Schnellauswahl",
|
||||||
|
"midnightcontrols.action.key.emotecraft.stop": "Emote stoppen",
|
||||||
"midnightcontrols.button.left_bumper": "Linke Schultertaste",
|
"midnightcontrols.button.left_bumper": "Linke Schultertaste",
|
||||||
"midnightcontrols.button.right_bumper": "Rechte Schultertaste",
|
"midnightcontrols.button.right_bumper": "Rechte Schultertaste",
|
||||||
"midnightcontrols.button.back": "Zurück",
|
"midnightcontrols.button.back": "Zurück",
|
||||||
@@ -77,80 +78,83 @@
|
|||||||
"midnightcontrols.controller.mappings.error.write": "Fehler beim Schreiben der Controller Mappings.",
|
"midnightcontrols.controller.mappings.error.write": "Fehler beim Schreiben der Controller Mappings.",
|
||||||
"midnightcontrols.controller.mappings.updated": "Mappings aktualisiert!",
|
"midnightcontrols.controller.mappings.updated": "Mappings aktualisiert!",
|
||||||
"midnightcontrols.controller_type.default": "Standard",
|
"midnightcontrols.controller_type.default": "Standard",
|
||||||
"midnightcontrols.controller_type.numbered": "Nummerierter Controller",
|
"midnightcontrols.controller_type.dualshock": "DualShock",
|
||||||
|
"midnightcontrols.controller_type.switch": "Switch",
|
||||||
|
"midnightcontrols.controller_type.xbox": "Xbox",
|
||||||
|
"midnightcontrols.controller_type.steam": "Steam",
|
||||||
|
"midnightcontrols.controller_type.ouya": "OUYA",
|
||||||
"midnightcontrols.controls_mode.default": "Tastatur/Maus",
|
"midnightcontrols.controls_mode.default": "Tastatur/Maus",
|
||||||
"midnightcontrols.controls_mode.controller": "Controller",
|
"midnightcontrols.controls_mode.controller": "Controller",
|
||||||
"midnightcontrols.controls_mode.touchscreen": "Touchscreen (In Arbeit)",
|
"midnightcontrols.controls_mode.touchscreen": "Touchscreen (In Arbeit)",
|
||||||
"midnightcontrols.hud_side.left": "Links",
|
"midnightcontrols.hud_side.left": "links",
|
||||||
"midnightcontrols.hud_side.right": "Rechts",
|
"midnightcontrols.hud_side.right": "rechts",
|
||||||
"midnightcontrols.menu.analog_movement": "Analoge Bewegung",
|
"midnightcontrols.menu.analog_movement": "Analoge Bewegung",
|
||||||
"midnightcontrols.menu.analog_movement.tooltip": "Aktiviert analoge Bewegung, wenn möglich.",
|
|
||||||
"midnightcontrols.menu.auto_switch_mode": "Automatischer Wechsel",
|
"midnightcontrols.menu.auto_switch_mode": "Automatischer Wechsel",
|
||||||
"midnightcontrols.menu.auto_switch_mode.tooltip": "Ob der Eingabemodus automatisch auf Controller eingestellt werden soll, wenn einer verbunden wird.",
|
|
||||||
"midnightcontrols.menu.controller": "Controller",
|
"midnightcontrols.menu.controller": "Controller",
|
||||||
"midnightcontrols.menu.controller2": "Zweiter Controller",
|
"midnightcontrols.menu.controller2": "Zweiter Controller",
|
||||||
"midnightcontrols.menu.controller2.tooltip": "Zweiter Controller, zum Beispiel für Joy-Cons.",
|
|
||||||
"midnightcontrols.menu.controller_type": "Controller-Typ",
|
"midnightcontrols.menu.controller_type": "Controller-Typ",
|
||||||
"midnightcontrols.menu.controller_type.tooltip": "Der Controllertyp für den die Knöpfe angezeigt werden sollen.",
|
|
||||||
"midnightcontrols.menu.controls_mode": "Modus",
|
"midnightcontrols.menu.controls_mode": "Modus",
|
||||||
"midnightcontrols.menu.controls_mode.tooltip": "Der Steuerungsmodus.",
|
|
||||||
"midnightcontrols.menu.double_tap_to_sprint": "Doppel-Tipp zum Sprinten",
|
"midnightcontrols.menu.double_tap_to_sprint": "Doppel-Tipp zum Sprinten",
|
||||||
"midnightcontrols.menu.fast_block_placing": "Schnelles Bauen",
|
"midnightcontrols.menu.fast_block_placing": "Schnelles Bauen",
|
||||||
"midnightcontrols.menu.fast_block_placing.tooltip": "Während des Fliegens im Kreativmodus das schnelle Platzieren von Knöpfen aktivieren. §cWird von manchen Servern als cheaten eingestuft.",
|
|
||||||
"midnightcontrols.menu.fly_drifting": "Flug-Drifting",
|
"midnightcontrols.menu.fly_drifting": "Flug-Drifting",
|
||||||
"midnightcontrols.menu.fly_drifting.tooltip": "Aktiviert das Flug-Drifting von Vanilla Minecraft.",
|
|
||||||
"midnightcontrols.menu.fly_drifting_vertical": "Vertikales Flug-Drifting",
|
"midnightcontrols.menu.fly_drifting_vertical": "Vertikales Flug-Drifting",
|
||||||
"midnightcontrols.menu.fly_drifting_vertical.tooltip": "Aktiviert das vertikale Flug-Drifting von Vanilla Minecraft",
|
|
||||||
"midnightcontrols.menu.hud_enable": "HUD aktivieren",
|
"midnightcontrols.menu.hud_enable": "HUD aktivieren",
|
||||||
"midnightcontrols.menu.hud_enable.tooltip": "(De-)Aktiviert die Knopfanzeige im Spiel",
|
|
||||||
"midnightcontrols.menu.hud_side": "HUD-Seite",
|
"midnightcontrols.menu.hud_side": "HUD-Seite",
|
||||||
"midnightcontrols.menu.hud_side.tooltip": "Die Position der Knopfanzeige.",
|
|
||||||
"midnightcontrols.menu.invert_right_x_axis": "X rechts umkehren",
|
"midnightcontrols.menu.invert_right_x_axis": "X rechts umkehren",
|
||||||
"midnightcontrols.menu.invert_right_y_axis": "Y rechts umkehren",
|
"midnightcontrols.menu.invert_right_y_axis": "Y rechts umkehren",
|
||||||
"midnightcontrols.menu.keyboard_controls": "Tastatureinstellungen...",
|
"midnightcontrols.menu.keyboard_controls": "Tastatureinstellungen...",
|
||||||
"midnightcontrols.menu.left_dead_zone": "Tote Zone des linken Sticks",
|
"midnightcontrols.menu.left_dead_zone": "Linke tote Zone",
|
||||||
"midnightcontrols.menu.left_dead_zone.tooltip": "Die tote Zone für den linken Analogstick.",
|
|
||||||
"midnightcontrols.menu.mappings.open_input_str": "Öffne den Controller-Mapping Editor",
|
"midnightcontrols.menu.mappings.open_input_str": "Öffne den Controller-Mapping Editor",
|
||||||
"midnightcontrols.menu.max_left_x_value": "Maximalwert Linke X-Achse",
|
"midnightcontrols.menu.max_left_x_value": "Maximalwert Linke X-Achse",
|
||||||
"midnightcontrols.menu.max_left_x_value.tooltip": "Ändert den maximalen Wert der linken X-Achse. Nützlich, wenn deine Achse nicht bis zum Maximum geht.",
|
|
||||||
"midnightcontrols.menu.max_left_y_value": "Maximalwert Linke Y-Achse",
|
"midnightcontrols.menu.max_left_y_value": "Maximalwert Linke Y-Achse",
|
||||||
"midnightcontrols.menu.max_left_y_value.tooltip": "Ändert den maximalen Wert der linken Y-Achse. Nützlich, wenn deine Achse nicht bis zum Maximum geht.",
|
|
||||||
"midnightcontrols.menu.max_right_x_value": "Maximalwert Rechte X-Achse",
|
"midnightcontrols.menu.max_right_x_value": "Maximalwert Rechte X-Achse",
|
||||||
"midnightcontrols.menu.max_right_x_value.tooltip": "Ändert den maximalen Wert der rechten X-Achse. Nützlich, wenn deine Achse nicht bis zum Maximum geht.",
|
|
||||||
"midnightcontrols.menu.max_right_y_value": "Maximalwert Rechte Y-Achse",
|
"midnightcontrols.menu.max_right_y_value": "Maximalwert Rechte Y-Achse",
|
||||||
"midnightcontrols.menu.max_right_y_value.tooltip": "Ändert den maximalen Wert der rechten Y-Achse. Nützlich, wenn deine Achse nicht bis zum Maximum geht.",
|
|
||||||
"midnightcontrols.menu.mouse_speed": "Mausgeschwindigkeit",
|
"midnightcontrols.menu.mouse_speed": "Mausgeschwindigkeit",
|
||||||
"midnightcontrols.menu.mouse_speed.tooltip": "Die emulierte Mausgeschwindigkeit des Controllers.",
|
|
||||||
"midnightcontrols.menu.reacharound.horizontal": "Vorderes Blockplatzieren",
|
"midnightcontrols.menu.reacharound.horizontal": "Vorderes Blockplatzieren",
|
||||||
"midnightcontrols.menu.reacharound.horizontal.tooltip": "Aktiviert vorderes Platzieren von Blöcken, §cwird von manchen Servern als cheaten eingestuft§r.",
|
|
||||||
"midnightcontrols.menu.reacharound.vertical": "Vertikales Umgreifen",
|
"midnightcontrols.menu.reacharound.vertical": "Vertikales Umgreifen",
|
||||||
"midnightcontrols.menu.reacharound.vertical.tooltip": "Aktiviert vertikales Platzieren von Blöcken, §cwird von manchen Servern als cheaten eingestuft§r.",
|
|
||||||
"midnightcontrols.menu.reload_controller_mappings": "Controller-Mappings neuladen",
|
"midnightcontrols.menu.reload_controller_mappings": "Controller-Mappings neuladen",
|
||||||
"midnightcontrols.menu.reload_controller_mappings.tooltip": "Lädt die Controller-Mappings neu.",
|
"midnightcontrols.menu.right_dead_zone": "Rechte tote Zone",
|
||||||
"midnightcontrols.menu.right_dead_zone": "Tote Zone des rechten Sticks",
|
|
||||||
"midnightcontrols.menu.right_dead_zone.tooltip": "Die tote Zone für den rechten Analogstick.",
|
|
||||||
"midnightcontrols.menu.rotation_speed": "Rotationsgeschwindigkeit (X-Achse)",
|
"midnightcontrols.menu.rotation_speed": "Rotationsgeschwindigkeit (X-Achse)",
|
||||||
"midnightcontrols.menu.rotation_speed.tooltip": "Die Kamerarotationsgeschwindigkeit im Controllermodus. (X-Achse)",
|
|
||||||
"midnightcontrols.menu.y_axis_rotation_speed": "Rotationsgeschwindigkeit (Y-Achse)",
|
"midnightcontrols.menu.y_axis_rotation_speed": "Rotationsgeschwindigkeit (Y-Achse)",
|
||||||
"midnightcontrols.menu.y_axis_rotation_speed.tooltip": "Die Kamerarotationsgeschwindigkeit im Controllermodus. (Y-Achse)",
|
|
||||||
"midnightcontrols.menu.separate_controller_profile": "Separates Controller-Profil",
|
|
||||||
"midnightcontrols.menu.separator.controller": "Controller",
|
"midnightcontrols.menu.separator.controller": "Controller",
|
||||||
"midnightcontrols.menu.separator.general": "Generell",
|
"midnightcontrols.menu.separator.general": "Generell",
|
||||||
"midnightcontrols.menu.title": "MidnightControls - Einstellungen",
|
"midnightcontrols.menu.title": "MidnightControls - Einstellungen",
|
||||||
"midnightcontrols.menu.title.controller": "Controlleroptionen",
|
"midnightcontrols.menu.title.controller": "Controlleroptionen",
|
||||||
"midnightcontrols.menu.title.controller_controls": "Controller Aktionen",
|
"midnightcontrols.menu.title.controller_controls": "Controller Steuerung",
|
||||||
"midnightcontrols.menu.title.gameplay": "Gameplay Optionen",
|
"midnightcontrols.menu.title.gameplay": "Gameplay Optionen",
|
||||||
"midnightcontrols.menu.title.general": "Generelle Optionen",
|
"midnightcontrols.menu.title.general": "Generelle Optionen",
|
||||||
"midnightcontrols.menu.title.hud": "HUD Optionen",
|
"midnightcontrols.menu.title.hud": "HUD Optionen",
|
||||||
"midnightcontrols.menu.title.mappings.string": "Mapping-Datei Editor",
|
"midnightcontrols.menu.title.mappings.string": "Mapping-Datei Editor",
|
||||||
"midnightcontrols.menu.title.visual": "Visuelle Optionen",
|
"midnightcontrols.menu.title.visual": "Visuelle Optionen",
|
||||||
"midnightcontrols.menu.unfocused_input": "Unfokussierte Eingabe",
|
"midnightcontrols.menu.unfocused_input": "Unfokussierte Eingabe",
|
||||||
"midnightcontrols.menu.unfocused_input.tooltip": "Erlaube Controllereingabe auch wenn das Fenster nicht fokussiert ist.",
|
|
||||||
"midnightcontrols.menu.virtual_mouse": "Virtuelle Maus",
|
"midnightcontrols.menu.virtual_mouse": "Virtuelle Maus",
|
||||||
"midnightcontrols.menu.virtual_mouse.tooltip": "Aktiviere die virtuelle Maus.",
|
|
||||||
"midnightcontrols.menu.virtual_mouse.skin": "Aussehen der Virtuellen Maus",
|
"midnightcontrols.menu.virtual_mouse.skin": "Aussehen der Virtuellen Maus",
|
||||||
"midnightcontrols.narrator.unbound": "%s entbunden",
|
"midnightcontrols.narrator.unbound": "%s entbunden",
|
||||||
"midnightcontrols.not_bound": "Nicht zugewiesen",
|
"midnightcontrols.not_bound": "Nicht zugewiesen",
|
||||||
|
"midnightcontrols.tooltip.analog_movement": "Aktiviert analoge Bewegung, wenn möglich.",
|
||||||
|
"midnightcontrols.tooltip.auto_switch_mode": "Ob der Eingabemodus automatisch auf Controller eingestellt werden soll, wenn einer verbunden wird.",
|
||||||
|
"midnightcontrols.tooltip.controller2": "Zweiter Controller, zum Beispiel für Joy-Cons.",
|
||||||
|
"midnightcontrols.tooltip.controller_type": "Der Controllertyp für den die Knöpfe angezeigt werden sollen.",
|
||||||
|
"midnightcontrols.tooltip.controls_mode": "Der Steuerungsmodus.",
|
||||||
|
"midnightcontrols.tooltip.fast_block_placing": "Während des Fliegens im Kreativmodus das schnelle Platzieren von Knöpfen aktivieren. §cWird von manchen Servern als cheaten eingestuft.",
|
||||||
|
"midnightcontrols.tooltip.fly_drifting": "Aktiviert das Flug-Drifting von Vanilla Minecraft.",
|
||||||
|
"midnightcontrols.tooltip.fly_drifting_vertical": "Aktiviert das vertikale Flug-Drifting von Vanilla Minecraft",
|
||||||
|
"midnightcontrols.tooltip.hud_enable": "(De-)Aktiviert die Knopfanzeige im Spiel",
|
||||||
|
"midnightcontrols.tooltip.hud_side": "Die Position der Knopfanzeige.",
|
||||||
|
"midnightcontrols.tooltip.left_dead_zone": "Die tote Zone für den linken Analogstick.",
|
||||||
|
"midnightcontrols.tooltip.max_left_x_value": "Ändert den maximalen Wert der linken X-Achse. Nützlich, wenn deine Achse nicht bis zum Maximum geht.",
|
||||||
|
"midnightcontrols.tooltip.max_left_y_value": "Ändert den maximalen Wert der linken Y-Achse. Nützlich, wenn deine Achse nicht bis zum Maximum geht.",
|
||||||
|
"midnightcontrols.tooltip.max_right_x_value": "Ändert den maximalen Wert der rechten X-Achse. Nützlich, wenn deine Achse nicht bis zum Maximum geht.",
|
||||||
|
"midnightcontrols.tooltip.max_right_y_value": "Ändert den maximalen Wert der rechten Y-Achse. Nützlich, wenn deine Achse nicht bis zum Maximum geht.",
|
||||||
|
"midnightcontrols.tooltip.mouse_speed": "Die emulierte Mausgeschwindigkeit des Controllers.",
|
||||||
|
"midnightcontrols.tooltip.reacharound.horizontal": "Aktiviert vorderes Platzieren von Blöcken, §cwird von manchen Servern als cheaten eingestuft§r.",
|
||||||
|
"midnightcontrols.tooltip.reacharound.vertical": "Aktiviert vertikales Platzieren von Blöcken, §cwird von manchen Servern als cheaten eingestuft§r.",
|
||||||
|
"midnightcontrols.tooltip.reload_controller_mappings": "Lädt die Controller-Mappings neu.",
|
||||||
|
"midnightcontrols.tooltip.right_dead_zone": "Die tote Zone für den rechten Analogstick.",
|
||||||
|
"midnightcontrols.tooltip.rotation_speed": "Die Kamerarotationsgeschwindigkeit im Controllermodus. (X-Achse)",
|
||||||
|
"midnightcontrols.tooltip.y_axis_rotation_speed": "Die Kamerarotationsgeschwindigkeit im Controllermodus. (Y-Achse)",
|
||||||
|
"midnightcontrols.tooltip.unfocused_input": "Erlaube Controllereingabe auch wenn das Fenster nicht fokussiert ist.",
|
||||||
|
"midnightcontrols.tooltip.virtual_mouse": "Aktiviere die virtuelle Maus.",
|
||||||
"midnightcontrols.virtual_mouse.skin.default_light": "Standard Hell",
|
"midnightcontrols.virtual_mouse.skin.default_light": "Standard Hell",
|
||||||
"midnightcontrols.virtual_mouse.skin.default_dark": "Standard Dunkel",
|
"midnightcontrols.virtual_mouse.skin.default_dark": "Standard Dunkel",
|
||||||
"midnightcontrols.virtual_mouse.skin.second_light": "Alternativ Hell",
|
"midnightcontrols.virtual_mouse.skin.second_light": "Alternativ Hell",
|
||||||
|
|||||||
@@ -1,43 +1,16 @@
|
|||||||
{
|
{
|
||||||
"midnightcontrols.midnightconfig.title": "MidnightControls Advanced Config",
|
"midnightcontrols.midnightconfig.title": "MidnightControls Advanced Config",
|
||||||
"midnightcontrols.midnightconfig.enum.VirtualMouseSkin.DEFAULT_LIGHT": "Default Light",
|
|
||||||
"midnightcontrols.midnightconfig.enum.VirtualMouseSkin.DEFAULT_DARK": "Default Dark",
|
|
||||||
"midnightcontrols.midnightconfig.enum.VirtualMouseSkin.SECOND_LIGHT": "Second Light",
|
|
||||||
"midnightcontrols.midnightconfig.enum.VirtualMouseSkin.SECOND_DARK": "Second Dark",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.DEFAULT": "Default",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.DUALSHOCK": "DualShock",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.DUALSENSE": "DualSense",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.SWITCH": "Switch/Wii Controller",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.XBOX": "Xbox One/Series Controller",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.XBOX_360": "Xbox 360 Controller",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.STEAM_CONTROLLER": "Steam Controller",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.STEAM_DECK": "Steam Deck",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.OUYA": "OUYA Controller",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.NUMBERED": "Numbered Controller",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControlsMode.DEFAULT": "Keyboard/Mouse",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControlsMode.CONTROLLER": "Controller",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControlsMode.TOUCHSCREEN": "Touchscreen (Beta)",
|
|
||||||
"midnightcontrols.midnightconfig.enum.HudSide.LEFT": "Left",
|
|
||||||
"midnightcontrols.midnightconfig.enum.HudSide.RIGHT": "Right",
|
|
||||||
"midnightcontrols.midnightconfig.enum.TouchMode.CROSSHAIR": "At Crosshair",
|
|
||||||
"midnightcontrols.midnightconfig.enum.TouchMode.FINGER_POS": "Finger Position",
|
|
||||||
"midnightcontrols.midnightconfig.enum.CameraMode.FLAT": "Flat",
|
|
||||||
"midnightcontrols.midnightconfig.enum.CameraMode.ADAPTIVE": "Adaptive",
|
|
||||||
"key.midnightcontrols.look_down": "Look down",
|
"key.midnightcontrols.look_down": "Look down",
|
||||||
"key.midnightcontrols.look_left": "Look left",
|
"key.midnightcontrols.look_left": "Look left",
|
||||||
"key.midnightcontrols.look_right": "Look right",
|
"key.midnightcontrols.look_right": "Look right",
|
||||||
"key.midnightcontrols.look_up": "Look up",
|
"key.midnightcontrols.look_up": "Look up",
|
||||||
"key.midnightcontrols.ring": "Open Unbound Keybind Ring",
|
"key.midnightcontrols.ring": "Show radial menu",
|
||||||
"midnightcontrols.action.attack": "Attack",
|
"midnightcontrols.action.attack": "Attack",
|
||||||
"midnightcontrols.action.back": "Back",
|
"midnightcontrols.action.back": "Back",
|
||||||
"midnightcontrols.action.chat": "Open Chat",
|
"midnightcontrols.action.chat": "Open Chat",
|
||||||
"midnightcontrols.action.controls_ring": "Open Unbound Keybind Ring",
|
|
||||||
"midnightcontrols.action.debug_screen": "Open Debug HUD (F3)",
|
"midnightcontrols.action.debug_screen": "Open Debug HUD (F3)",
|
||||||
"midnightcontrols.action.drop_item": "Drop Item",
|
"midnightcontrols.action.drop_item": "Drop Item",
|
||||||
"midnightcontrols.action.drink": "Drink",
|
"midnightcontrols.action.exit": "Exit",
|
||||||
"midnightcontrols.action.eat": "Eat",
|
|
||||||
"midnightcontrols.action.equip": "Equip",
|
|
||||||
"midnightcontrols.action.exit": "Exit Screen",
|
|
||||||
"midnightcontrols.action.forward": "Forward",
|
"midnightcontrols.action.forward": "Forward",
|
||||||
"midnightcontrols.action.hit": "Hit",
|
"midnightcontrols.action.hit": "Hit",
|
||||||
"midnightcontrols.action.hotbar_left": "Hotbar left",
|
"midnightcontrols.action.hotbar_left": "Hotbar left",
|
||||||
@@ -107,7 +80,7 @@
|
|||||||
"midnightcontrols.axis.right_x-": "Right X-",
|
"midnightcontrols.axis.right_x-": "Right X-",
|
||||||
"midnightcontrols.axis.right_y-": "Right Y-",
|
"midnightcontrols.axis.right_y-": "Right Y-",
|
||||||
"midnightcontrols.button.unknown": "Unknown (%d)",
|
"midnightcontrols.button.unknown": "Unknown (%d)",
|
||||||
"midnightcontrols.controller.tutorial.title": "Play the game with a Controller!",
|
"midnightcontrols.controller.tutorial.title": "Play the game with a controller!",
|
||||||
"midnightcontrols.controller.tutorial.description": "Go to %s -> %s -> %s",
|
"midnightcontrols.controller.tutorial.description": "Go to %s -> %s -> %s",
|
||||||
"midnightcontrols.controller.connected": "Controller %d connected.",
|
"midnightcontrols.controller.connected": "Controller %d connected.",
|
||||||
"midnightcontrols.controller.disconnected": "Controller %d disconnected.",
|
"midnightcontrols.controller.disconnected": "Controller %d disconnected.",
|
||||||
@@ -117,118 +90,90 @@
|
|||||||
"midnightcontrols.controller.mappings.error.write": "Error while writing mappings to file.",
|
"midnightcontrols.controller.mappings.error.write": "Error while writing mappings to file.",
|
||||||
"midnightcontrols.controller.mappings.updated": "Updated mappings!",
|
"midnightcontrols.controller.mappings.updated": "Updated mappings!",
|
||||||
"midnightcontrols.controller_type.default": "Default",
|
"midnightcontrols.controller_type.default": "Default",
|
||||||
"midnightcontrols.controller_type.dualshock": "DualShock",
|
"midnightcontrols.controller_type.dualshock": "DualShock 4",
|
||||||
"midnightcontrols.controller_type.dualsense": "DualSense",
|
"midnightcontrols.controller_type.dualsense": "DualSense",
|
||||||
"midnightcontrols.controller_type.switch": "Switch/Wii Controller",
|
"midnightcontrols.controller_type.switch": "Switch (Pro) Controller",
|
||||||
"midnightcontrols.controller_type.xbox": "Xbox One/Series Controller",
|
"midnightcontrols.controller_type.xbox": "Xbox One/Series Controller",
|
||||||
"midnightcontrols.controller_type.xbox_360": "Xbox 360 Controller",
|
"midnightcontrols.controller_type.xbox_360": "Xbox 360 Controller",
|
||||||
"midnightcontrols.controller_type.steam_controller": "Steam Controller",
|
"midnightcontrols.controller_type.steam_controller": "Steam Controller",
|
||||||
"midnightcontrols.controller_type.steam_deck": "Steam Deck",
|
"midnightcontrols.controller_type.steam_deck": "Steam Deck",
|
||||||
"midnightcontrols.controller_type.ouya": "OUYA Controller",
|
"midnightcontrols.controller_type.ouya": "OUYA Controller",
|
||||||
"midnightcontrols.controller_type.numbered": "Numbered Controller",
|
|
||||||
"midnightcontrols.controls_mode.default": "Keyboard/Mouse",
|
"midnightcontrols.controls_mode.default": "Keyboard/Mouse",
|
||||||
"midnightcontrols.controls_mode.controller": "Controller",
|
"midnightcontrols.controls_mode.controller": "Controller",
|
||||||
"midnightcontrols.controls_mode.touchscreen": "Touchscreen (Beta)",
|
"midnightcontrols.controls_mode.touchscreen": "Touchscreen (WIP)",
|
||||||
"midnightcontrols.hud_side.left": "Left",
|
"midnightcontrols.hud_side.left": "Left",
|
||||||
"midnightcontrols.hud_side.right": "Right",
|
"midnightcontrols.hud_side.right": "Right",
|
||||||
"midnightcontrols.menu.analog_movement": "Analog Movement",
|
"midnightcontrols.menu.analog_movement": "Analog Movement",
|
||||||
"midnightcontrols.menu.analog_movement.tooltip": "When possible, enables analog movement.",
|
|
||||||
"midnightcontrols.menu.auto_switch_mode": "Auto Switch Mode",
|
"midnightcontrols.menu.auto_switch_mode": "Auto Switch Mode",
|
||||||
"midnightcontrols.menu.auto_switch_mode.tooltip": "Whether the controls mode should be switched to Controller automatically if one is connected.",
|
|
||||||
"midnightcontrols.menu.camera_mode": "Camera Mode",
|
|
||||||
"midnightcontrols.menu.controller": "Controller",
|
"midnightcontrols.menu.controller": "Controller",
|
||||||
"midnightcontrols.menu.controller2": "Second Controller",
|
"midnightcontrols.menu.controller2": "Second Controller",
|
||||||
"midnightcontrols.menu.controller2.tooltip": "Second controller to use, which allows (for example) Joy-Cons support.",
|
|
||||||
"midnightcontrols.menu.controller_toggle_sneak": "Toggle Sneak on Controller",
|
|
||||||
"midnightcontrols.menu.controller_toggle_sprint": "Toggle Sprint on Controller",
|
|
||||||
"midnightcontrols.menu.controller_type": "Controller Type",
|
"midnightcontrols.menu.controller_type": "Controller Type",
|
||||||
"midnightcontrols.menu.controller_type.tooltip": "The controller type you're using (needed to display the correct buttons)",
|
|
||||||
"midnightcontrols.menu.controls_mode": "Mode",
|
"midnightcontrols.menu.controls_mode": "Mode",
|
||||||
"midnightcontrols.menu.controls_mode.tooltip": "The controls mode.",
|
|
||||||
"midnightcontrols.menu.double_tap_to_sprint": "Double-Tap to Sprint",
|
"midnightcontrols.menu.double_tap_to_sprint": "Double-Tap to Sprint",
|
||||||
"midnightcontrols.menu.double_tap_to_sprint.tooltip": "Toggles whether the Walk Forwards key makes the player sprint when double-tapped quickly",
|
|
||||||
"midnightcontrols.menu.fast_block_placing": "Fast Block Placing",
|
"midnightcontrols.menu.fast_block_placing": "Fast Block Placing",
|
||||||
"midnightcontrols.menu.fast_block_placing.tooltip": "While flying in creative mode, enables fast block placing depending on your speed. §cOn some servers this might be considered as cheating.",
|
|
||||||
"midnightcontrols.menu.fly_drifting": "Fly Drifting",
|
"midnightcontrols.menu.fly_drifting": "Fly Drifting",
|
||||||
"midnightcontrols.menu.fly_drifting.tooltip": "While flying, enables Vanilla drifting/inertia.",
|
|
||||||
"midnightcontrols.menu.fly_drifting_vertical": "Vertical Fly Drifting",
|
"midnightcontrols.menu.fly_drifting_vertical": "Vertical Fly Drifting",
|
||||||
"midnightcontrols.menu.fly_drifting_vertical.tooltip": "While flying, enables Vanilla vertical drifting/intertia.",
|
|
||||||
"midnightcontrols.menu.hud_enable": "Enable HUD",
|
"midnightcontrols.menu.hud_enable": "Enable HUD",
|
||||||
"midnightcontrols.menu.hud_enable.tooltip": "Toggles the on-screen controller button indicator.",
|
|
||||||
"midnightcontrols.menu.hud_side": "HUD Side",
|
"midnightcontrols.menu.hud_side": "HUD Side",
|
||||||
"midnightcontrols.menu.hud_side.tooltip": "The position of the HUD.",
|
|
||||||
"midnightcontrols.menu.invert_right_x_axis": "Invert Right X",
|
"midnightcontrols.menu.invert_right_x_axis": "Invert Right X",
|
||||||
"midnightcontrols.menu.invert_right_y_axis": "Invert Right Y",
|
"midnightcontrols.menu.invert_right_y_axis": "Invert Right Y",
|
||||||
"midnightcontrols.menu.joystick_as_mouse": "Always use left stick as mouse",
|
|
||||||
"midnightcontrols.menu.joystick_as_mouse.tooltip": "Make the joystick behave like a mouse in every menu.",
|
|
||||||
"midnightcontrols.menu.eye_tracker_as_mouse": "Use Eye Tracker as Mouse",
|
|
||||||
"midnightcontrols.menu.eye_tracker_as_mouse.tooltip": "Replace the mouse with an eye tracking device, (for example) the Tobii 5.",
|
|
||||||
"midnightcontrols.menu.eye_tracker_deadzone": "Eye Tracker Deadzone Size",
|
|
||||||
"midnightcontrols.menu.eye_tracker_deadzone.tooltip": "Stops camera movement when looking near the cross hair",
|
|
||||||
"midnightcontrols.menu.keyboard_controls": "Keyboard Controls...",
|
"midnightcontrols.menu.keyboard_controls": "Keyboard Controls...",
|
||||||
"midnightcontrols.menu.left_dead_zone": "Left Stick Dead Zone",
|
"midnightcontrols.menu.left_dead_zone": "Left Stick Dead Zone",
|
||||||
"midnightcontrols.menu.left_dead_zone.tooltip": "The dead zone for the controller's left analog stick.",
|
|
||||||
"midnightcontrols.menu.mappings.open_input_str": "Open Mappings File Editor",
|
"midnightcontrols.menu.mappings.open_input_str": "Open Mappings File Editor",
|
||||||
"midnightcontrols.menu.max_left_x_value": "Left X Axis Max Value",
|
"midnightcontrols.menu.max_left_x_value": "Left X Axis Max Value",
|
||||||
"midnightcontrols.menu.max_left_x_value.tooltip": "Changes what the mod considers the highest value for the left X axis. Useful if your axis does not use the full range and seems slow.",
|
|
||||||
"midnightcontrols.menu.max_left_y_value": "Left Y Axis Max Value",
|
"midnightcontrols.menu.max_left_y_value": "Left Y Axis Max Value",
|
||||||
"midnightcontrols.menu.max_left_y_value.tooltip": "Changes what the mod considers the highest value for the left Y axis. Useful if your axis does not use the full range and seems slow.",
|
|
||||||
"midnightcontrols.menu.max_right_x_value": "Right X Axis Max Value",
|
"midnightcontrols.menu.max_right_x_value": "Right X Axis Max Value",
|
||||||
"midnightcontrols.menu.max_right_x_value.tooltip": "Changes what the mod considers the highest value for the right X axis. Useful if your axis does not use the full range and seems slow.",
|
|
||||||
"midnightcontrols.menu.max_right_y_value": "Right Y Axis Max Value",
|
"midnightcontrols.menu.max_right_y_value": "Right Y Axis Max Value",
|
||||||
"midnightcontrols.menu.max_right_y_value.tooltip": "Changes what the mod considers the highest value for the right Y axis. Useful if your axis does not use the full range and seems slow.",
|
|
||||||
"midnightcontrols.menu.mouse_speed": "Mouse Speed",
|
"midnightcontrols.menu.mouse_speed": "Mouse Speed",
|
||||||
"midnightcontrols.menu.mouse_speed.tooltip": "The controller's emulated mouse speed.",
|
|
||||||
"midnightcontrols.menu.move_chat": "Move chat input box to top",
|
|
||||||
"midnightcontrols.menu.move_chat.tooltip": "Moves the chat input field to the top, for better input on devices with on-screen keyboards.",
|
|
||||||
"midnightcontrols.menu.reacharound.horizontal": "Front Block Placing",
|
"midnightcontrols.menu.reacharound.horizontal": "Front Block Placing",
|
||||||
"midnightcontrols.menu.reacharound.horizontal.tooltip": "Enables front block placing, §cmight be considered cheating on some servers§r.",
|
|
||||||
"midnightcontrols.menu.reacharound.vertical": "Vertical Reacharound",
|
"midnightcontrols.menu.reacharound.vertical": "Vertical Reacharound",
|
||||||
"midnightcontrols.menu.reacharound.vertical.tooltip": "Enables vertical reacharound, §cmight be considered cheating on some servers§r.",
|
|
||||||
"midnightcontrols.menu.reload_controller_mappings": "Reload Controller Mappings",
|
"midnightcontrols.menu.reload_controller_mappings": "Reload Controller Mappings",
|
||||||
"midnightcontrols.menu.reload_controller_mappings.tooltip": "Reloads the controller mappings file.",
|
|
||||||
"midnightcontrols.menu.right_dead_zone": "Right Stick Dead Zone",
|
"midnightcontrols.menu.right_dead_zone": "Right Stick Dead Zone",
|
||||||
"midnightcontrols.menu.right_dead_zone.tooltip": "The dead zone for the controller's right analog stick.",
|
|
||||||
"midnightcontrols.menu.rotation_speed": "X Axis Rotation Speed",
|
"midnightcontrols.menu.rotation_speed": "X Axis Rotation Speed",
|
||||||
"midnightcontrols.menu.rotation_speed.tooltip": "The camera's X Axis rotation speed in controller mode.",
|
|
||||||
"midnightcontrols.menu.y_axis_rotation_speed": "Y Axis Rotation Speed",
|
"midnightcontrols.menu.y_axis_rotation_speed": "Y Axis Rotation Speed",
|
||||||
"midnightcontrols.menu.y_axis_rotation_speed.tooltip": "The camera's Y Axis rotation speed in controller mode.",
|
|
||||||
"midnightcontrols.menu.separate_controller_profile": "Separate Controller Profile",
|
|
||||||
"midnightcontrols.menu.separator.controller": "Controller",
|
"midnightcontrols.menu.separator.controller": "Controller",
|
||||||
"midnightcontrols.menu.separator.general": "General",
|
"midnightcontrols.menu.separator.general": "General",
|
||||||
"midnightcontrols.menu.title": "MidnightControls - Settings",
|
"midnightcontrols.menu.title": "MidnightControls - Settings",
|
||||||
"midnightcontrols.menu.title.controller": "Controller Options",
|
"midnightcontrols.menu.title.controller": "Controller Options",
|
||||||
"midnightcontrols.menu.title.controller_controls": "Controller Bindings",
|
"midnightcontrols.menu.title.controller_controls": "Controls",
|
||||||
"midnightcontrols.menu.title.gameplay": "Gameplay Options",
|
"midnightcontrols.menu.title.gameplay": "Gameplay Options",
|
||||||
"midnightcontrols.menu.title.general": "General Options",
|
"midnightcontrols.menu.title.general": "General Options",
|
||||||
"midnightcontrols.menu.title.hud": "HUD Options",
|
"midnightcontrols.menu.title.hud": "HUD Options",
|
||||||
"midnightcontrols.menu.title.mappings.string": "Mappings File Editor",
|
"midnightcontrols.menu.title.mappings.string": "Mappings File Editor",
|
||||||
"midnightcontrols.menu.title.touch": "Touch Options",
|
|
||||||
"midnightcontrols.menu.title.visual": "Appearance Options",
|
"midnightcontrols.menu.title.visual": "Appearance Options",
|
||||||
"midnightcontrols.menu.touch_break_delay": "Touch Break Delay",
|
|
||||||
"midnightcontrols.menu.touch_speed": "Touch Speed",
|
|
||||||
"midnightcontrols.menu.invert_touch": "Invert Touch Direction",
|
|
||||||
"midnightcontrols.menu.touch_mode": "Touch Interaction Mode",
|
|
||||||
"midnightcontrols.menu.touch_transparency": "Touch HUD Transparency",
|
|
||||||
"midnightcontrols.menu.touch_with_controller": "Touch in Controller mode",
|
|
||||||
"midnightcontrols.menu.unfocused_input": "Unfocused Input",
|
"midnightcontrols.menu.unfocused_input": "Unfocused Input",
|
||||||
"midnightcontrols.menu.unfocused_input.tooltip": "Allows controller input when the window is not focused.",
|
|
||||||
"midnightcontrols.menu.virtual_mouse": "Virtual Mouse",
|
"midnightcontrols.menu.virtual_mouse": "Virtual Mouse",
|
||||||
"midnightcontrols.menu.virtual_mouse.tooltip": "Enables the virtual mouse, which is useful during splitscreen.",
|
|
||||||
"midnightcontrols.menu.virtual_mouse.skin": "Virtual Mouse Skin",
|
"midnightcontrols.menu.virtual_mouse.skin": "Virtual Mouse Skin",
|
||||||
"midnightcontrols.menu.hide_cursor": "Hide Normal Mouse Cursor",
|
|
||||||
"midnightcontrols.menu.hide_cursor.tooltip": "Hides the normal mouse cursor, leaving only the virtual mouse visible.",
|
|
||||||
"midnightcontrols.narrator.unbound": "Unbound %s",
|
"midnightcontrols.narrator.unbound": "Unbound %s",
|
||||||
"midnightcontrols.not_bound": "Not bound",
|
"midnightcontrols.not_bound": "Not bound",
|
||||||
|
"midnightcontrols.tooltip.analog_movement": "When possible, enables analog movement.",
|
||||||
|
"midnightcontrols.tooltip.auto_switch_mode": "Whether the controls mode should be switched to Controller automatically if one is connected.",
|
||||||
|
"midnightcontrols.tooltip.controller2": "Second controller to use, which allows (for example) Joy-Cons support.",
|
||||||
|
"midnightcontrols.tooltip.controller_type": "The controller type you're using (needed to display the correct buttons)",
|
||||||
|
"midnightcontrols.tooltip.controls_mode": "The controls mode.",
|
||||||
|
"midnightcontrols.tooltip.double_tap_to_sprint": "Toggles whether the Walk Forwards key makes the player sprint when double-tapped quickly",
|
||||||
|
"midnightcontrols.tooltip.fast_block_placing": "While flying in creative mode, enables fast block placing depending on your speed. §cOn some servers this might be considered as cheating.",
|
||||||
|
"midnightcontrols.tooltip.fly_drifting": "While flying, enables Vanilla drifting/inertia.",
|
||||||
|
"midnightcontrols.tooltip.fly_drifting_vertical": "While flying, enables Vanilla vertical drifting/intertia.",
|
||||||
|
"midnightcontrols.tooltip.hud_enable": "Toggles the on-screen controller button indicator.",
|
||||||
|
"midnightcontrols.tooltip.hud_side": "The position of the HUD.",
|
||||||
|
"midnightcontrols.tooltip.left_dead_zone": "The dead zone for the controller's left analog stick.",
|
||||||
|
"midnightcontrols.tooltip.max_left_x_value": "Changes what the mod considers the highest value for the left X axis. Useful if your axis does not use the full range and seems slow.",
|
||||||
|
"midnightcontrols.tooltip.max_left_y_value": "Changes what the mod considers the highest value for the left Y axis. Useful if your axis does not use the full range and seems slow.",
|
||||||
|
"midnightcontrols.tooltip.max_right_x_value": "Changes what the mod considers the highest value for the right X axis. Useful if your axis does not use the full range and seems slow.",
|
||||||
|
"midnightcontrols.tooltip.max_right_y_value": "Changes what the mod considers the highest value for the right Y axis. Useful if your axis does not use the full range and seems slow.",
|
||||||
|
"midnightcontrols.tooltip.mouse_speed": "The controller's emulated mouse speed.",
|
||||||
|
"midnightcontrols.tooltip.reacharound.horizontal": "Enables front block placing, §cmight be considered cheating on some servers§r.",
|
||||||
|
"midnightcontrols.tooltip.reacharound.vertical": "Enables vertical reacharound, §cmight be considered cheating on some servers§r.",
|
||||||
|
"midnightcontrols.tooltip.reload_controller_mappings": "Reloads the controller mappings file.",
|
||||||
|
"midnightcontrols.tooltip.right_dead_zone": "The dead zone for the controller's right analog stick.",
|
||||||
|
"midnightcontrols.tooltip.rotation_speed": "The camera's X Axis rotation speed in controller mode.",
|
||||||
|
"midnightcontrols.tooltip.y_axis_rotation_speed": "The camera's Y Axis rotation speed in controller mode.",
|
||||||
|
"midnightcontrols.tooltip.unfocused_input": "Allows controller input when the window is not focused.",
|
||||||
|
"midnightcontrols.tooltip.virtual_mouse": "Enables the virtual mouse which is useful ie during splitscreen.",
|
||||||
"midnightcontrols.virtual_mouse.skin.default_light": "Default Light",
|
"midnightcontrols.virtual_mouse.skin.default_light": "Default Light",
|
||||||
"midnightcontrols.virtual_mouse.skin.default_dark": "Default Dark",
|
"midnightcontrols.virtual_mouse.skin.default_dark": "Default Dark",
|
||||||
"midnightcontrols.virtual_mouse.skin.second_light": "Second Light",
|
"midnightcontrols.virtual_mouse.skin.second_light": "Second Light",
|
||||||
"midnightcontrols.virtual_mouse.skin.second_dark": "Second Dark",
|
"midnightcontrols.virtual_mouse.skin.second_dark": "Second Dark",
|
||||||
"midnightcontrols.midnightconfig.category.controller": "Controller",
|
|
||||||
"midnightcontrols.midnightconfig.category.misc": "Miscellaneous",
|
|
||||||
"midnightcontrols.midnightconfig.category.screens": "Screens",
|
|
||||||
"midnightcontrols.midnightconfig.category.gameplay": "Gameplay",
|
|
||||||
"midnightcontrols.midnightconfig.category.touch": "Touch",
|
|
||||||
"midnightcontrols.midnightconfig.category.visual": "Visual",
|
|
||||||
"modmenu.descriptionTranslation.midnightcontrols": "Adds controller support and enhanced controls overall.\nForked from LambdaControls, which sadly got discontinued."
|
"modmenu.descriptionTranslation.midnightcontrols": "Adds controller support and enhanced controls overall.\nForked from LambdaControls, which sadly got discontinued."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,54 +80,32 @@
|
|||||||
"midnightcontrols.hud_side.left": "izquierda",
|
"midnightcontrols.hud_side.left": "izquierda",
|
||||||
"midnightcontrols.hud_side.right": "derecha",
|
"midnightcontrols.hud_side.right": "derecha",
|
||||||
"midnightcontrols.menu.analog_movement": "Movimiento analógico",
|
"midnightcontrols.menu.analog_movement": "Movimiento analógico",
|
||||||
"midnightcontrols.menu.analog_movement.tooltip": "Habilita el movimiento analógico cuando es posible.",
|
|
||||||
"midnightcontrols.menu.auto_switch_mode": "Cambio de modo automático",
|
"midnightcontrols.menu.auto_switch_mode": "Cambio de modo automático",
|
||||||
"midnightcontrols.menu.auto_switch_mode.tooltip": "Si el modo de controles debe cambiarse a Controlador automáticamente si hay uno conectado.",
|
|
||||||
"midnightcontrols.menu.controller": "Controlador",
|
"midnightcontrols.menu.controller": "Controlador",
|
||||||
"midnightcontrols.menu.controller2": "Segundo controlador",
|
"midnightcontrols.menu.controller2": "Segundo controlador",
|
||||||
"midnightcontrols.menu.controller2.tooltip": "Segundo controlador a uso, que permite el soporte de Joy-Cons por ejemplo.",
|
|
||||||
"midnightcontrols.menu.controller_type": "Tipo de controlador",
|
"midnightcontrols.menu.controller_type": "Tipo de controlador",
|
||||||
"midnightcontrols.menu.controller_type.tooltip": "El tipo de controlador para mostrar los botones correctos.",
|
|
||||||
"midnightcontrols.menu.controls_mode": "Modo",
|
"midnightcontrols.menu.controls_mode": "Modo",
|
||||||
"midnightcontrols.menu.controls_mode.tooltip": "El modo de controles.",
|
|
||||||
"midnightcontrols.menu.fast_block_placing": "Colocación rápida de bloques",
|
"midnightcontrols.menu.fast_block_placing": "Colocación rápida de bloques",
|
||||||
"midnightcontrols.menu.fast_block_placing.tooltip": "Mientras vuela en modo creativo, permite la colocación rápida de bloques dependiendo su velocidad. §cEn algunos servidores, esto podría considerarse como trampa.",
|
|
||||||
"midnightcontrols.menu.fly_drifting": "Volar a la deriva",
|
"midnightcontrols.menu.fly_drifting": "Volar a la deriva",
|
||||||
"midnightcontrols.menu.fly_drifting.tooltip": "Mientras vuela, habilita la deriva/inercia de vainilla.",
|
|
||||||
"midnightcontrols.menu.fly_drifting_vertical": "Volar a la deriva vertical",
|
"midnightcontrols.menu.fly_drifting_vertical": "Volar a la deriva vertical",
|
||||||
"midnightcontrols.menu.fly_drifting_vertical.tooltip": "Mientras vuela, habilita la deriva/inercia vertical de vainilla.",
|
|
||||||
"midnightcontrols.menu.hud_enable": "Habilitar HUD",
|
"midnightcontrols.menu.hud_enable": "Habilitar HUD",
|
||||||
"midnightcontrols.menu.hud_enable.tooltip": "Alterna el indicador del botón del controlador en pantalla.",
|
|
||||||
"midnightcontrols.menu.hud_side": "Lado de HUD",
|
"midnightcontrols.menu.hud_side": "Lado de HUD",
|
||||||
"midnightcontrols.menu.hud_side.tooltip": "La posición del HUD.",
|
|
||||||
"midnightcontrols.menu.invert_right_x_axis": "Invertir derecha X",
|
"midnightcontrols.menu.invert_right_x_axis": "Invertir derecha X",
|
||||||
"midnightcontrols.menu.invert_right_y_axis": "Invertir derecha Y",
|
"midnightcontrols.menu.invert_right_y_axis": "Invertir derecha Y",
|
||||||
"midnightcontrols.menu.keyboard_controls": "Controles del teclado...",
|
"midnightcontrols.menu.keyboard_controls": "Controles del teclado...",
|
||||||
"midnightcontrols.menu.left_dead_zone": "Zona muerta izquierda",
|
"midnightcontrols.menu.left_dead_zone": "Zona muerta izquierda",
|
||||||
"midnightcontrols.menu.left_dead_zone.tooltip": "La zona muerta de la palanca analógica izquierda del controlador.",
|
|
||||||
"midnightcontrols.menu.mappings.open_input_str": "Abrir el editor de archivo de asignaciones",
|
"midnightcontrols.menu.mappings.open_input_str": "Abrir el editor de archivo de asignaciones",
|
||||||
"midnightcontrols.menu.max_left_x_value": "Valor máximo del eje X izquierdo",
|
"midnightcontrols.menu.max_left_x_value": "Valor máximo del eje X izquierdo",
|
||||||
"midnightcontrols.menu.max_left_x_value.tooltip": "Cambia lo que el mod considera el valor más alto para el eje X izquierdo. Útil si su eje no usa el rango completo y parece lento.",
|
|
||||||
"midnightcontrols.menu.max_left_y_value": "Valor máximo del eje Y izquierdo",
|
"midnightcontrols.menu.max_left_y_value": "Valor máximo del eje Y izquierdo",
|
||||||
"midnightcontrols.menu.max_left_y_value.tooltip": "Cambia lo que el mod considera el valor más alto para el eje Y izquierdo. Útil si su eje no usa el rango completo y parece lento.",
|
|
||||||
"midnightcontrols.menu.max_right_x_value": "Valor máximo del eje X derecho",
|
"midnightcontrols.menu.max_right_x_value": "Valor máximo del eje X derecho",
|
||||||
"midnightcontrols.menu.max_right_x_value.tooltip": "Cambia lo que el mod considera el valor más alto para el eje X derecho. Útil si su eje no usa el rango completo y parece lento.",
|
|
||||||
"midnightcontrols.menu.max_right_y_value": "Valor máximo del eje Y derecho",
|
"midnightcontrols.menu.max_right_y_value": "Valor máximo del eje Y derecho",
|
||||||
"midnightcontrols.menu.max_right_y_value.tooltip": "Cambia lo que el mod considera el valor más alto para el eje Y derecho. Útil si su eje no usa el rango completo y parece lento.",
|
|
||||||
"midnightcontrols.menu.mouse_speed": "Velocidad del ratón",
|
"midnightcontrols.menu.mouse_speed": "Velocidad del ratón",
|
||||||
"midnightcontrols.menu.mouse_speed.tooltip": "La velocidad del ratón emulada del controlador.",
|
|
||||||
"midnightcontrols.menu.reacharound.horizontal": "Colocación de bloque frontal",
|
"midnightcontrols.menu.reacharound.horizontal": "Colocación de bloque frontal",
|
||||||
"midnightcontrols.menu.reacharound.horizontal.tooltip": "Habilita la colocación del bloque frontal, §cpodría considerarse trampa en algunos servidores§r.",
|
|
||||||
"midnightcontrols.menu.reacharound.vertical": "Alcance vertical",
|
"midnightcontrols.menu.reacharound.vertical": "Alcance vertical",
|
||||||
"midnightcontrols.menu.reacharound.vertical.tooltip": "Habilita el alcance vertical, §cpodría considerarse trampa en algunos servidores§r.",
|
|
||||||
"midnightcontrols.menu.reload_controller_mappings": "Recargar asignaciones de controlador",
|
"midnightcontrols.menu.reload_controller_mappings": "Recargar asignaciones de controlador",
|
||||||
"midnightcontrols.menu.reload_controller_mappings.tooltip": "Vuelve a cargar el archivo de asignaciones del controlador.",
|
|
||||||
"midnightcontrols.menu.right_dead_zone": "Zona muerta derecha",
|
"midnightcontrols.menu.right_dead_zone": "Zona muerta derecha",
|
||||||
"midnightcontrols.menu.right_dead_zone.tooltip": "La zona muerta de la palanca analógica derecha del controlador.",
|
|
||||||
"midnightcontrols.menu.rotation_speed": "Velocidad de rotación (eje X)",
|
"midnightcontrols.menu.rotation_speed": "Velocidad de rotación (eje X)",
|
||||||
"midnightcontrols.menu.rotation_speed.tooltip": "La velocidad de rotación de la cámara en modo controlador. (eje X)",
|
|
||||||
"midnightcontrols.menu.y_axis_rotation_speed": "Velocidad de rotación (eje Y)",
|
"midnightcontrols.menu.y_axis_rotation_speed": "Velocidad de rotación (eje Y)",
|
||||||
"midnightcontrols.menu.y_axis_rotation_speed.tooltip": "La velocidad de rotación de la cámara en modo controlador. (eje Y)",
|
|
||||||
"midnightcontrols.menu.separator.controller": "Controlador",
|
"midnightcontrols.menu.separator.controller": "Controlador",
|
||||||
"midnightcontrols.menu.separator.general": "General",
|
"midnightcontrols.menu.separator.general": "General",
|
||||||
"midnightcontrols.menu.title": "midnightcontrols - Configuraciones",
|
"midnightcontrols.menu.title": "midnightcontrols - Configuraciones",
|
||||||
@@ -139,12 +117,34 @@
|
|||||||
"midnightcontrols.menu.title.mappings.string": "Editor de archivo de asignaciones",
|
"midnightcontrols.menu.title.mappings.string": "Editor de archivo de asignaciones",
|
||||||
"midnightcontrols.menu.title.visual": "Opciones de apariencia",
|
"midnightcontrols.menu.title.visual": "Opciones de apariencia",
|
||||||
"midnightcontrols.menu.unfocused_input": "Entrada desenfocada",
|
"midnightcontrols.menu.unfocused_input": "Entrada desenfocada",
|
||||||
"midnightcontrols.menu.unfocused_input.tooltip": "Habilita entrada del controlador cuando la ventana no está enfocada.",
|
|
||||||
"midnightcontrols.menu.virtual_mouse": "Ratón virtual",
|
"midnightcontrols.menu.virtual_mouse": "Ratón virtual",
|
||||||
"midnightcontrols.menu.virtual_mouse.tooltip": "Habilite el ratón virtual que es útil en el caso de una pantalla dividida.",
|
|
||||||
"midnightcontrols.menu.virtual_mouse.skin": "Piel de ratón virtual",
|
"midnightcontrols.menu.virtual_mouse.skin": "Piel de ratón virtual",
|
||||||
"midnightcontrols.narrator.unbound": "Resetear %s",
|
"midnightcontrols.narrator.unbound": "Resetear %s",
|
||||||
"midnightcontrols.not_bound": "No ligado",
|
"midnightcontrols.not_bound": "No ligado",
|
||||||
|
"midnightcontrols.tooltip.analog_movement": "Habilita el movimiento analógico cuando es posible.",
|
||||||
|
"midnightcontrols.tooltip.auto_switch_mode": "Si el modo de controles debe cambiarse a Controlador automáticamente si hay uno conectado.",
|
||||||
|
"midnightcontrols.tooltip.controller2": "Segundo controlador a uso, que permite el soporte de Joy-Cons por ejemplo.",
|
||||||
|
"midnightcontrols.tooltip.controller_type": "El tipo de controlador para mostrar los botones correctos.",
|
||||||
|
"midnightcontrols.tooltip.controls_mode": "El modo de controles.",
|
||||||
|
"midnightcontrols.tooltip.fast_block_placing": "Mientras vuela en modo creativo, permite la colocación rápida de bloques dependiendo su velocidad. §cEn algunos servidores, esto podría considerarse como trampa.",
|
||||||
|
"midnightcontrols.tooltip.fly_drifting": "Mientras vuela, habilita la deriva/inercia de vainilla.",
|
||||||
|
"midnightcontrols.tooltip.fly_drifting_vertical": "Mientras vuela, habilita la deriva/inercia vertical de vainilla.",
|
||||||
|
"midnightcontrols.tooltip.hud_enable": "Alterna el indicador del botón del controlador en pantalla.",
|
||||||
|
"midnightcontrols.tooltip.hud_side": "La posición del HUD.",
|
||||||
|
"midnightcontrols.tooltip.left_dead_zone": "La zona muerta de la palanca analógica izquierda del controlador.",
|
||||||
|
"midnightcontrols.tooltip.max_left_x_value": "Cambia lo que el mod considera el valor más alto para el eje X izquierdo. Útil si su eje no usa el rango completo y parece lento.",
|
||||||
|
"midnightcontrols.tooltip.max_left_y_value": "Cambia lo que el mod considera el valor más alto para el eje Y izquierdo. Útil si su eje no usa el rango completo y parece lento.",
|
||||||
|
"midnightcontrols.tooltip.max_right_x_value": "Cambia lo que el mod considera el valor más alto para el eje X derecho. Útil si su eje no usa el rango completo y parece lento.",
|
||||||
|
"midnightcontrols.tooltip.max_right_y_value": "Cambia lo que el mod considera el valor más alto para el eje Y derecho. Útil si su eje no usa el rango completo y parece lento.",
|
||||||
|
"midnightcontrols.tooltip.mouse_speed": "La velocidad del ratón emulada del controlador.",
|
||||||
|
"midnightcontrols.tooltip.reacharound.horizontal": "Habilita la colocación del bloque frontal, §cpodría considerarse trampa en algunos servidores§r.",
|
||||||
|
"midnightcontrols.tooltip.reacharound.vertical": "Habilita el alcance vertical, §cpodría considerarse trampa en algunos servidores§r.",
|
||||||
|
"midnightcontrols.tooltip.reload_controller_mappings": "Vuelve a cargar el archivo de asignaciones del controlador.",
|
||||||
|
"midnightcontrols.tooltip.right_dead_zone": "La zona muerta de la palanca analógica derecha del controlador.",
|
||||||
|
"midnightcontrols.tooltip.rotation_speed": "La velocidad de rotación de la cámara en modo controlador. (eje X)",
|
||||||
|
"midnightcontrols.tooltip.y_axis_rotation_speed": "La velocidad de rotación de la cámara en modo controlador. (eje Y)",
|
||||||
|
"midnightcontrols.tooltip.unfocused_input": "Habilita entrada del controlador cuando la ventana no está enfocada.",
|
||||||
|
"midnightcontrols.tooltip.virtual_mouse": "Habilite el ratón virtual que es útil en el caso de una pantalla dividida.",
|
||||||
"midnightcontrols.virtual_mouse.skin.default_light": "Ligera por defecto",
|
"midnightcontrols.virtual_mouse.skin.default_light": "Ligera por defecto",
|
||||||
"midnightcontrols.virtual_mouse.skin.default_dark": "Oscura por defecto",
|
"midnightcontrols.virtual_mouse.skin.default_dark": "Oscura por defecto",
|
||||||
"midnightcontrols.virtual_mouse.skin.second_light": "Ligera segundario",
|
"midnightcontrols.virtual_mouse.skin.second_light": "Ligera segundario",
|
||||||
|
|||||||
@@ -64,8 +64,6 @@
|
|||||||
"midnightcontrols.axis.right_x-": "Parem X-",
|
"midnightcontrols.axis.right_x-": "Parem X-",
|
||||||
"midnightcontrols.axis.right_y-": "Parem Y-",
|
"midnightcontrols.axis.right_y-": "Parem Y-",
|
||||||
"midnightcontrols.button.unknown": "Teadmata (%d)",
|
"midnightcontrols.button.unknown": "Teadmata (%d)",
|
||||||
"midnightcontrols.controller.tutorial.title": "Mängi mängu oma juhtpuldiga!",
|
|
||||||
"midnightcontrols.controller.tutorial.description": "Mine %s -> %s -> %s",
|
|
||||||
"midnightcontrols.controller.connected": "Mängupult %d ühendatud.",
|
"midnightcontrols.controller.connected": "Mängupult %d ühendatud.",
|
||||||
"midnightcontrols.controller.disconnected": "Mängupult %d lahti ühendatud.",
|
"midnightcontrols.controller.disconnected": "Mängupult %d lahti ühendatud.",
|
||||||
"midnightcontrols.controller.mappings.1": "Mängupuldi vastenduste seadistamiseks palun kasuta %s",
|
"midnightcontrols.controller.mappings.1": "Mängupuldi vastenduste seadistamiseks palun kasuta %s",
|
||||||
@@ -77,7 +75,7 @@
|
|||||||
|
|
||||||
"midnightcontrols.controls_mode.default": "klaviatuur/hiir",
|
"midnightcontrols.controls_mode.default": "klaviatuur/hiir",
|
||||||
"midnightcontrols.controls_mode.controller": "mängupult",
|
"midnightcontrols.controls_mode.controller": "mängupult",
|
||||||
"midnightcontrols.controls_mode.touchscreen": "puuteekraan (arenduses)",
|
"midnightcontrols.controls_mode.touchscreen": "puuteekraan",
|
||||||
"midnightcontrols.hud_side.left": "vasak",
|
"midnightcontrols.hud_side.left": "vasak",
|
||||||
"midnightcontrols.hud_side.right": "parem",
|
"midnightcontrols.hud_side.right": "parem",
|
||||||
"midnightcontrols.menu.analog_movement": "Analoogliikumine",
|
"midnightcontrols.menu.analog_movement": "Analoogliikumine",
|
||||||
|
|||||||
@@ -121,30 +121,30 @@
|
|||||||
"midnightcontrols.menu.virtual_mouse.skin": "Apparence souris virtuelle",
|
"midnightcontrols.menu.virtual_mouse.skin": "Apparence souris virtuelle",
|
||||||
"midnightcontrols.narrator.unbound": "Délier %s",
|
"midnightcontrols.narrator.unbound": "Délier %s",
|
||||||
"midnightcontrols.not_bound": "Non défini",
|
"midnightcontrols.not_bound": "Non défini",
|
||||||
"midnightcontrols.menu.analog_movement.tooltip": "Active le mouvement analogique si possible.",
|
"midnightcontrols.tooltip.analog_movement": "Active le mouvement analogique si possible.",
|
||||||
"midnightcontrols.menu.auto_switch_mode.tooltip": "Détermine si le mode de contrôle doit automatiquement changer sur Manette si une manette est connectée et inversement.",
|
"midnightcontrols.tooltip.auto_switch_mode": "Détermine si le mode de contrôle doit automatiquement changer sur Manette si une manette est connectée et inversement.",
|
||||||
"midnightcontrols.menu.controller2.tooltip": "Défini une deuxième manette, utile dans le cas d'utilisation de Joy-Cons.",
|
"midnightcontrols.tooltip.controller2": "Défini une deuxième manette, utile dans le cas d'utilisation de Joy-Cons.",
|
||||||
"midnightcontrols.menu.controller_type.tooltip": "Le type de contrôle n'influe que sur les boutons affichés.",
|
"midnightcontrols.tooltip.controller_type": "Le type de contrôle n'influe que sur les boutons affichés.",
|
||||||
"midnightcontrols.menu.controls_mode.tooltip": "Change le mode de contrôle.",
|
"midnightcontrols.tooltip.controls_mode": "Change le mode de contrôle.",
|
||||||
"midnightcontrols.menu.fast_block_placing.tooltip": "Active le placement rapide de blocs en vol.",
|
"midnightcontrols.tooltip.fast_block_placing": "Active le placement rapide de blocs en vol.",
|
||||||
"midnightcontrols.menu.fly_drifting.tooltip": "Pendant que le joueur vole, active le glissement Vanilla.",
|
"midnightcontrols.tooltip.fly_drifting": "Pendant que le joueur vole, active le glissement Vanilla.",
|
||||||
"midnightcontrols.menu.fly_drifting_vertical.tooltip": "Pendant que le joueur vole, active le glissement vertical Vanilla.",
|
"midnightcontrols.tooltip.fly_drifting_vertical": "Pendant que le joueur vole, active le glissement vertical Vanilla.",
|
||||||
"midnightcontrols.menu.hud_enable.tooltip": "Détermine si l'indicateur des buttons de la manette doit être affiché ou non.",
|
"midnightcontrols.tooltip.hud_enable": "Détermine si l'indicateur des buttons de la manette doit être affiché ou non.",
|
||||||
"midnightcontrols.menu.hud_side.tooltip": "Change la position du HUD.",
|
"midnightcontrols.tooltip.hud_side": "Change la position du HUD.",
|
||||||
"midnightcontrols.menu.left_dead_zone.tooltip": "Zone morte de l'axe gauche de la manette.",
|
"midnightcontrols.tooltip.left_dead_zone": "Zone morte de l'axe gauche de la manette.",
|
||||||
"midnightcontrols.menu.max_left_x_value.tooltip": "Change ce que le mod considère comme valeur maximale pour l'axe X gauche. Utile si votre axe n'utilise pas l'entièreté de l'ensemble des valeurs et paraît lent.",
|
"midnightcontrols.tooltip.max_left_x_value": "Change ce que le mod considère comme valeur maximale pour l'axe X gauche. Utile si votre axe n'utilise pas l'entièreté de l'ensemble des valeurs et paraît lent.",
|
||||||
"midnightcontrols.menu.max_left_y_value.tooltip": "Change ce que le mod considère comme valeur maximale pour l'axe Y gauche. Utile si votre axe n'utilise pas l'entièreté de l'ensemble des valeurs et paraît lent.",
|
"midnightcontrols.tooltip.max_left_y_value": "Change ce que le mod considère comme valeur maximale pour l'axe Y gauche. Utile si votre axe n'utilise pas l'entièreté de l'ensemble des valeurs et paraît lent.",
|
||||||
"midnightcontrols.menu.max_right_x_value.tooltip": "Change ce que le mod considère comme valeur maximale pour l'axe X droit. Utile si votre axe n'utilise pas l'entièreté de l'ensemble des valeurs et paraît lent.",
|
"midnightcontrols.tooltip.max_right_x_value": "Change ce que le mod considère comme valeur maximale pour l'axe X droit. Utile si votre axe n'utilise pas l'entièreté de l'ensemble des valeurs et paraît lent.",
|
||||||
"midnightcontrols.menu.max_right_y_value.tooltip": "Change ce que le mod considère comme valeur maximale pour l'axe Y droit. Utile si votre axe n'utilise pas l'entièreté de l'ensemble des valeurs et paraît lent.",
|
"midnightcontrols.tooltip.max_right_y_value": "Change ce que le mod considère comme valeur maximale pour l'axe Y droit. Utile si votre axe n'utilise pas l'entièreté de l'ensemble des valeurs et paraît lent.",
|
||||||
"midnightcontrols.menu.mouse_speed.tooltip": "Change la vitesse de la souris émulée par la manette.",
|
"midnightcontrols.tooltip.mouse_speed": "Change la vitesse de la souris émulée par la manette.",
|
||||||
"midnightcontrols.menu.reacharound.horizontal.tooltip": "Active le placement avant de blocs, §cpeut être considérer comme de la triche sur certains serveurs§r.",
|
"midnightcontrols.tooltip.reacharound.horizontal": "Active le placement avant de blocs, §cpeut être considérer comme de la triche sur certains serveurs§r.",
|
||||||
"midnightcontrols.menu.reacharound.vertical.tooltip": "Active le placement vertical de blocs, c'est-à-dire de blocs en dessous du bloc sur lequel vous êtes placé, §cpeut être considérer comme de la triche sur certains serveurs§r.",
|
"midnightcontrols.tooltip.reacharound.vertical": "Active le placement vertical de blocs, c'est-à-dire de blocs en dessous du bloc sur lequel vous êtes placé, §cpeut être considérer comme de la triche sur certains serveurs§r.",
|
||||||
"midnightcontrols.menu.reload_controller_mappings.tooltip": "Recharge le fichier de configuration des manettes.",
|
"midnightcontrols.tooltip.reload_controller_mappings": "Recharge le fichier de configuration des manettes.",
|
||||||
"midnightcontrols.menu.right_dead_zone.tooltip": "Zone morte de l'axe droit de la manette.",
|
"midnightcontrols.tooltip.right_dead_zone": "Zone morte de l'axe droit de la manette.",
|
||||||
"midnightcontrols.menu.rotation_speed.tooltip": "Change la vitesse de rotation de la caméra. (X)",
|
"midnightcontrols.tooltip.rotation_speed": "Change la vitesse de rotation de la caméra. (X)",
|
||||||
"midnightcontrols.menu.y_axis_rotation_speed.tooltip": "Change la vitesse de rotation de la caméra. (Y)",
|
"midnightcontrols.tooltip.y_axis_rotation_speed": "Change la vitesse de rotation de la caméra. (Y)",
|
||||||
"midnightcontrols.menu.unfocused_input.tooltip": "Autorise les entrées manette quand la fenêtre n'est pas sélectionnée.",
|
"midnightcontrols.tooltip.unfocused_input": "Autorise les entrées manette quand la fenêtre n'est pas sélectionnée.",
|
||||||
"midnightcontrols.menu.virtual_mouse.tooltip": "Active la souris virtuelle qui est pratique dans le cas d'un écran partagé.",
|
"midnightcontrols.tooltip.virtual_mouse": "Active la souris virtuelle qui est pratique dans le cas d'un écran partagé.",
|
||||||
"midnightcontrols.virtual_mouse.skin.default_light": "défaut clair",
|
"midnightcontrols.virtual_mouse.skin.default_light": "défaut clair",
|
||||||
"midnightcontrols.virtual_mouse.skin.default_dark": "défaut foncé",
|
"midnightcontrols.virtual_mouse.skin.default_dark": "défaut foncé",
|
||||||
"midnightcontrols.virtual_mouse.skin.second_light": "second clair",
|
"midnightcontrols.virtual_mouse.skin.second_light": "second clair",
|
||||||
|
|||||||
@@ -121,30 +121,30 @@
|
|||||||
"midnightcontrols.menu.virtual_mouse.skin": "Apparence souris virtuelle",
|
"midnightcontrols.menu.virtual_mouse.skin": "Apparence souris virtuelle",
|
||||||
"midnightcontrols.narrator.unbound": "Délier %s",
|
"midnightcontrols.narrator.unbound": "Délier %s",
|
||||||
"midnightcontrols.not_bound": "Non défini",
|
"midnightcontrols.not_bound": "Non défini",
|
||||||
"midnightcontrols.menu.analog_movement.tooltip": "Active le mouvement analogique si possible.",
|
"midnightcontrols.tooltip.analog_movement": "Active le mouvement analogique si possible.",
|
||||||
"midnightcontrols.menu.auto_switch_mode.tooltip": "Détermine si le mode de contrôle doit automatiquement changer sur Manette si une manette est connectée et inversement.",
|
"midnightcontrols.tooltip.auto_switch_mode": "Détermine si le mode de contrôle doit automatiquement changer sur Manette si une manette est connectée et inversement.",
|
||||||
"midnightcontrols.menu.controller2.tooltip": "Défini une deuxième manette, utile dans le cas d'utilisation de Joy-Cons.",
|
"midnightcontrols.tooltip.controller2": "Défini une deuxième manette, utile dans le cas d'utilisation de Joy-Cons.",
|
||||||
"midnightcontrols.menu.controller_type.tooltip": "Le type de contrôle n'influe que sur les boutons affichés.",
|
"midnightcontrols.tooltip.controller_type": "Le type de contrôle n'influe que sur les boutons affichés.",
|
||||||
"midnightcontrols.menu.controls_mode.tooltip": "Change le mode de contrôle.",
|
"midnightcontrols.tooltip.controls_mode": "Change le mode de contrôle.",
|
||||||
"midnightcontrols.menu.fast_block_placing.tooltip": "Active le placement rapide de blocs en vol.",
|
"midnightcontrols.tooltip.fast_block_placing": "Active le placement rapide de blocs en vol.",
|
||||||
"midnightcontrols.menu.fly_drifting.tooltip": "Pendant que le joueur vole, active le glissement Vanilla.",
|
"midnightcontrols.tooltip.fly_drifting": "Pendant que le joueur vole, active le glissement Vanilla.",
|
||||||
"midnightcontrols.menu.fly_drifting_vertical.tooltip": "Pendant que le joueur vole, active le glissement vertical Vanilla.",
|
"midnightcontrols.tooltip.fly_drifting_vertical": "Pendant que le joueur vole, active le glissement vertical Vanilla.",
|
||||||
"midnightcontrols.menu.hud_enable.tooltip": "Détermine si l'indicateur des buttons de la manette doit être affiché ou non.",
|
"midnightcontrols.tooltip.hud_enable": "Détermine si l'indicateur des buttons de la manette doit être affiché ou non.",
|
||||||
"midnightcontrols.menu.hud_side.tooltip": "Change la position du HUD.",
|
"midnightcontrols.tooltip.hud_side": "Change la position du HUD.",
|
||||||
"midnightcontrols.menu.left_dead_zone.tooltip": "Zone morte de l'axe gauche de la manette.",
|
"midnightcontrols.tooltip.left_dead_zone": "Zone morte de l'axe gauche de la manette.",
|
||||||
"midnightcontrols.menu.max_left_x_value.tooltip": "Change ce que le mod considère comme valeur maximale pour l'axe X gauche. Utile si votre axe n'utilise pas l'entièreté de l'ensemble des valeurs et paraît lent.",
|
"midnightcontrols.tooltip.max_left_x_value": "Change ce que le mod considère comme valeur maximale pour l'axe X gauche. Utile si votre axe n'utilise pas l'entièreté de l'ensemble des valeurs et paraît lent.",
|
||||||
"midnightcontrols.menu.max_left_y_value.tooltip": "Change ce que le mod considère comme valeur maximale pour l'axe Y gauche. Utile si votre axe n'utilise pas l'entièreté de l'ensemble des valeurs et paraît lent.",
|
"midnightcontrols.tooltip.max_left_y_value": "Change ce que le mod considère comme valeur maximale pour l'axe Y gauche. Utile si votre axe n'utilise pas l'entièreté de l'ensemble des valeurs et paraît lent.",
|
||||||
"midnightcontrols.menu.max_right_x_value.tooltip": "Change ce que le mod considère comme valeur maximale pour l'axe X droit. Utile si votre axe n'utilise pas l'entièreté de l'ensemble des valeurs et paraît lent.",
|
"midnightcontrols.tooltip.max_right_x_value": "Change ce que le mod considère comme valeur maximale pour l'axe X droit. Utile si votre axe n'utilise pas l'entièreté de l'ensemble des valeurs et paraît lent.",
|
||||||
"midnightcontrols.menu.max_right_y_value.tooltip": "Change ce que le mod considère comme valeur maximale pour l'axe Y droit. Utile si votre axe n'utilise pas l'entièreté de l'ensemble des valeurs et paraît lent.",
|
"midnightcontrols.tooltip.max_right_y_value": "Change ce que le mod considère comme valeur maximale pour l'axe Y droit. Utile si votre axe n'utilise pas l'entièreté de l'ensemble des valeurs et paraît lent.",
|
||||||
"midnightcontrols.menu.mouse_speed.tooltip": "Change la vitesse de la souris émulée par la manette.",
|
"midnightcontrols.tooltip.mouse_speed": "Change la vitesse de la souris émulée par la manette.",
|
||||||
"midnightcontrols.menu.reacharound.horizontal.tooltip": "Active le placement avant de blocs, §cpeut être considérer comme de la triche sur certains serveurs§r.",
|
"midnightcontrols.tooltip.reacharound.horizontal": "Active le placement avant de blocs, §cpeut être considérer comme de la triche sur certains serveurs§r.",
|
||||||
"midnightcontrols.menu.reacharound.vertical.tooltip": "Active le placement vertical de blocs, c'est-à-dire de blocs en dessous du bloc sur lequel vous êtes placé, §cpeut être considérer comme de la triche sur certains serveurs§r.",
|
"midnightcontrols.tooltip.reacharound.vertical": "Active le placement vertical de blocs, c'est-à-dire de blocs en dessous du bloc sur lequel vous êtes placé, §cpeut être considérer comme de la triche sur certains serveurs§r.",
|
||||||
"midnightcontrols.menu.reload_controller_mappings.tooltip": "Recharge le fichier de configuration des manettes.",
|
"midnightcontrols.tooltip.reload_controller_mappings": "Recharge le fichier de configuration des manettes.",
|
||||||
"midnightcontrols.menu.right_dead_zone.tooltip": "Zone morte de l'axe droit de la manette.",
|
"midnightcontrols.tooltip.right_dead_zone": "Zone morte de l'axe droit de la manette.",
|
||||||
"midnightcontrols.menu.rotation_speed.tooltip": "Change la vitesse de rotation de la caméra. (X)",
|
"midnightcontrols.tooltip.rotation_speed": "Change la vitesse de rotation de la caméra. (X)",
|
||||||
"midnightcontrols.menu.y_axis_rotation_speed.tooltip": "Change la vitesse de rotation de la caméra. (Y)",
|
"midnightcontrols.tooltip.y_axis_rotation_speed": "Change la vitesse de rotation de la caméra. (Y)",
|
||||||
"midnightcontrols.menu.unfocused_input.tooltip": "Autorise les entrées manette quand la fenêtre n'est pas sélectionnée.",
|
"midnightcontrols.tooltip.unfocused_input": "Autorise les entrées manette quand la fenêtre n'est pas sélectionnée.",
|
||||||
"midnightcontrols.menu.virtual_mouse.tooltip": "Active la souris virtuelle qui est pratique dans le cas d'un écran partagé.",
|
"midnightcontrols.tooltip.virtual_mouse": "Active la souris virtuelle qui est pratique dans le cas d'un écran partagé.",
|
||||||
"midnightcontrols.virtual_mouse.skin.default_light": "défaut clair",
|
"midnightcontrols.virtual_mouse.skin.default_light": "défaut clair",
|
||||||
"midnightcontrols.virtual_mouse.skin.default_dark": "défaut foncé",
|
"midnightcontrols.virtual_mouse.skin.default_dark": "défaut foncé",
|
||||||
"midnightcontrols.virtual_mouse.skin.second_light": "second clair",
|
"midnightcontrols.virtual_mouse.skin.second_light": "second clair",
|
||||||
|
|||||||
@@ -1,203 +0,0 @@
|
|||||||
{
|
|
||||||
"midnightcontrols.midnightconfig.title": "Configurazione Avanzata MidnightControls",
|
|
||||||
"midnightcontrols.midnightconfig.enum.VirtualMouseSkin.DEFAULT_LIGHT": "Default Chiaro",
|
|
||||||
"midnightcontrols.midnightconfig.enum.VirtualMouseSkin.DEFAULT_DARK": "Default Scuro",
|
|
||||||
"midnightcontrols.midnightconfig.enum.VirtualMouseSkin.SECOND_LIGHT": "Chiaro Secondario",
|
|
||||||
"midnightcontrols.midnightconfig.enum.VirtualMouseSkin.SECOND_DARK": "Scuro secondario",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.DEFAULT": "Default",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.DUALSHOCK": "DualShock",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.DUALSENSE": "DualSense",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.SWITCH": "Controller Switch/Wii",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.XBOX": "Controller Xbox One/Series",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.XBOX_360": "Controller Xbox 360",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.STEAM_CONTROLLER": "Controller Steam",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.STEAM_DECK": "Steam Deck",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.OUYA": "Controller OUYA",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.NUMBERED": "Controller Numerato",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControlsMode.DEFAULT": "Tastiera/Mouse",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControlsMode.CONTROLLER": "Controller",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControlsMode.TOUCHSCREEN": "Touchscreen (WIP)",
|
|
||||||
"midnightcontrols.midnightconfig.enum.HudSide.LEFT": "Sinistra",
|
|
||||||
"midnightcontrols.midnightconfig.enum.HudSide.RIGHT": "Destra",
|
|
||||||
"key.midnightcontrols.look_down": "Guarda in basso",
|
|
||||||
"key.midnightcontrols.look_left": "Guarda a sinistra",
|
|
||||||
"key.midnightcontrols.look_right": "Guarda a destra",
|
|
||||||
"key.midnightcontrols.look_up": "Guarda sopra",
|
|
||||||
"key.midnightcontrols.ring": "Apri Tasti non impostati",
|
|
||||||
"midnightcontrols.action.attack": "Attacca",
|
|
||||||
"midnightcontrols.action.back": "Indietro",
|
|
||||||
"midnightcontrols.action.chat": "Apri Chat",
|
|
||||||
"midnightcontrols.action.controls_ring": "Apri Tasti non impostati",
|
|
||||||
"midnightcontrols.action.debug_screen": "Apri HUD di Debug (F3)",
|
|
||||||
"midnightcontrols.action.drop_item": "Rilascia oggetto",
|
|
||||||
"midnightcontrols.action.exit": "Esci",
|
|
||||||
"midnightcontrols.action.forward": "Avanti",
|
|
||||||
"midnightcontrols.action.hit": "Colpisci",
|
|
||||||
"midnightcontrols.action.hotbar_left": "Hotbar sinistra",
|
|
||||||
"midnightcontrols.action.hotbar_right": "Hotbar destra",
|
|
||||||
"midnightcontrols.action.inventory": "Inventario",
|
|
||||||
"midnightcontrols.action.jump": "Salta",
|
|
||||||
"midnightcontrols.action.left": "Sinistra",
|
|
||||||
"midnightcontrols.action.pause_game": "Pausa il gioco",
|
|
||||||
"midnightcontrols.action.pick_block": "Prendi Blocco",
|
|
||||||
"midnightcontrols.action.pickup": "Raccogli",
|
|
||||||
"midnightcontrols.action.pickup_all": "Raccogli Tutto",
|
|
||||||
"midnightcontrols.action.place": "Piazza",
|
|
||||||
"midnightcontrols.action.player_list": "Lista Giocatori",
|
|
||||||
"midnightcontrols.action.quick_move": "Muovi veloce",
|
|
||||||
"midnightcontrols.action.right": "Destra",
|
|
||||||
"midnightcontrols.action.screenshot": "Fai uno Screenshot",
|
|
||||||
"midnightcontrols.action.slot_up": "Muovi slot sopra",
|
|
||||||
"midnightcontrols.action.slot_down": "Muovi slot sotto",
|
|
||||||
"midnightcontrols.action.slot_left": "Muovi slot a sinistra",
|
|
||||||
"midnightcontrols.action.slot_right": "Muovi slot a destra",
|
|
||||||
"midnightcontrols.action.sneak": "Accovaccia",
|
|
||||||
"midnightcontrols.action.sprint": "Corri",
|
|
||||||
"midnightcontrols.action.swap_hands": "Scambia le mani",
|
|
||||||
"midnightcontrols.action.toggle_perspective": "Cambia la prospettiva",
|
|
||||||
"midnightcontrols.action.toggle_smooth_camera": "Cambia Camera Cinematica",
|
|
||||||
"midnightcontrols.action.page_back": "Pagina precedente",
|
|
||||||
"midnightcontrols.action.page_next": "Pagina Successica",
|
|
||||||
"midnightcontrols.action.tab_back": "Tab Precedente",
|
|
||||||
"midnightcontrols.action.tab_next": "Tab Successiva",
|
|
||||||
"midnightcontrols.action.take": "Prendi Item",
|
|
||||||
"midnightcontrols.action.take_all": "Prendi Stack",
|
|
||||||
"midnightcontrols.action.use": "Usa",
|
|
||||||
"midnightcontrols.action.zoom": "Zoom",
|
|
||||||
"midnightcontrols.action.zoom_in": "Aumenta Zoom",
|
|
||||||
"midnightcontrols.action.zoom_out": "Diminuisci Zoom",
|
|
||||||
"midnightcontrols.action.zoom_reset": "Resetta Zoom",
|
|
||||||
"midnightcontrols.action.emi_page_left": "Pagina Precedente",
|
|
||||||
"midnightcontrols.action.emi_page_right": "Pagina Successiva",
|
|
||||||
"midnightcontrols.category.emi": "EMI",
|
|
||||||
"midnightcontrols.button.a": "A",
|
|
||||||
"midnightcontrols.button.b": "B",
|
|
||||||
"midnightcontrols.button.x": "X",
|
|
||||||
"midnightcontrols.button.y": "Y",
|
|
||||||
"midnightcontrols.button.left_bumper": "Bumper Destro",
|
|
||||||
"midnightcontrols.button.right_bumper": "Bumper Sinistro",
|
|
||||||
"midnightcontrols.button.back": "Indietro",
|
|
||||||
"midnightcontrols.button.start": "Avvia",
|
|
||||||
"midnightcontrols.button.guide": "Guida",
|
|
||||||
"midnightcontrols.button.left_thumb": "Pollice Sinistro",
|
|
||||||
"midnightcontrols.button.right_thumb": "Pollice Destro",
|
|
||||||
"midnightcontrols.button.dpad_up": "DPAD Sopra",
|
|
||||||
"midnightcontrols.button.dpad_right": "DPAD Destra",
|
|
||||||
"midnightcontrols.button.dpad_down": "DPAD Sotto",
|
|
||||||
"midnightcontrols.button.dpad_left": "DPAD Sinistra",
|
|
||||||
"midnightcontrols.button.l4": "L4",
|
|
||||||
"midnightcontrols.button.l5": "L5",
|
|
||||||
"midnightcontrols.button.r4": "R4",
|
|
||||||
"midnightcontrols.button.r5": "L5",
|
|
||||||
"midnightcontrols.axis.left_x+": "Sinistra X+",
|
|
||||||
"midnightcontrols.axis.left_y+": "Sinistra Y+",
|
|
||||||
"midnightcontrols.axis.right_x+": "Destra X+",
|
|
||||||
"midnightcontrols.axis.right_y+": "Destra Y+",
|
|
||||||
"midnightcontrols.axis.left_trigger": "Trigger Sinistro",
|
|
||||||
"midnightcontrols.axis.right_trigger": "Trigger Destro",
|
|
||||||
"midnightcontrols.axis.left_x-": "Sinistra X-",
|
|
||||||
"midnightcontrols.axis.left_y-": "Sinistra Y-",
|
|
||||||
"midnightcontrols.axis.right_x-": "Destra X-",
|
|
||||||
"midnightcontrols.axis.right_y-": "Destra Y-",
|
|
||||||
"midnightcontrols.button.unknown": "Sconosciuto",
|
|
||||||
"midnightcontrols.controller.tutorial.title": "Gioca il gioco con un Controller!",
|
|
||||||
"midnightcontrols.controller.tutorial.description": "Vai a %s -> %s -> %s",
|
|
||||||
"midnightcontrols.controller.connected": "Controller %d connesso.",
|
|
||||||
"midnightcontrols.controller.disconnected": "Controller %d disconnesso",
|
|
||||||
"midnightcontrols.controller.mappings.1": "Per configurare le mappature dei controller, per favore usa %s",
|
|
||||||
"midnightcontrols.controller.mappings.3": "e incolla le mappature nel file editor.",
|
|
||||||
"midnightcontrols.controller.mappings.error": "Errore durante il caricamento delle mappature",
|
|
||||||
"midnightcontrols.controller.mappings.error.write": "Errore durante la scrittura delle mappature su file",
|
|
||||||
"midnightcontrols.controller.mappings.updated": "Aggiornate le mappature!",
|
|
||||||
"midnightcontrols.controller_type.default": "Default",
|
|
||||||
"midnightcontrols.controller_type.dualshock": "DualShock",
|
|
||||||
"midnightcontrols.controller_type.dualsense": "DualSense",
|
|
||||||
"midnightcontrols.controller_type.switch": "Controller Switch/Wii",
|
|
||||||
"midnightcontrols.controller_type.xbox": "Controller Xbox One/Series",
|
|
||||||
"midnightcontrols.controller_type.xbox_360": "Controller Xbox 360",
|
|
||||||
"midnightcontrols.controller_type.steam_controller": "Controller Steam",
|
|
||||||
"midnightcontrols.controller_type.steam_deck": "Steam Deck",
|
|
||||||
"midnightcontrols.controller_type.ouya": "Controller OUYA",
|
|
||||||
"midnightcontrols.controller_type.numbered": "Controller Numerato",
|
|
||||||
"midnightcontrols.controls_mode.default": "Tastiera/Mouse",
|
|
||||||
"midnightcontrols.controls_mode.controller": "Controller",
|
|
||||||
"midnightcontrols.controls_mode.touchscreen": "Touchscreen (WIP)",
|
|
||||||
"midnightcontrols.hud_side.left": "Left",
|
|
||||||
"midnightcontrols.hud_side.right": "Destra",
|
|
||||||
"midnightcontrols.menu.analog_movement": "Movimento Analogo",
|
|
||||||
"midnightcontrols.menu.auto_switch_mode": "Modalità Cambio Automatico",
|
|
||||||
"midnightcontrols.menu.controller": "Controller",
|
|
||||||
"midnightcontrols.menu.controller2": "Controller Secondario",
|
|
||||||
"midnightcontrols.menu.controller_toggle_sneak": "Attiva/Disattiva Accovacciamento su Controller",
|
|
||||||
"midnightcontrols.menu.controller_toggle_sprint": "Attiva/Disattiva Correre su Controller",
|
|
||||||
"midnightcontrols.menu.controller_type": "Tipo di Controller",
|
|
||||||
"midnightcontrols.menu.controls_mode": "Modalità",
|
|
||||||
"midnightcontrols.menu.double_tap_to_sprint": "Doppio Tap per Sprintare",
|
|
||||||
"midnightcontrols.menu.fast_block_placing": "Veloce Piazzamento di Blocchi",
|
|
||||||
"midnightcontrols.menu.fly_drifting": "Drift in Volo",
|
|
||||||
"midnightcontrols.menu.fly_drifting_vertical": "Drift in Volo Verticale",
|
|
||||||
"midnightcontrols.menu.hud_enable": "Attiva HUD",
|
|
||||||
"midnightcontrols.menu.hud_side": "Lato HUD",
|
|
||||||
"midnightcontrols.menu.invert_right_x_axis": "Inverti Destro X",
|
|
||||||
"midnightcontrols.menu.invert_right_y_axis": "Inverti Destro Y",
|
|
||||||
"midnightcontrols.menu.keyboard_controls": "Controlli da Tastiera...",
|
|
||||||
"midnightcontrols.menu.left_dead_zone": "Zona Morta dello Stick Sinistro",
|
|
||||||
"midnightcontrols.menu.mappings.open_input_str": "Apri il File Editor delle Mappature",
|
|
||||||
"midnightcontrols.menu.max_left_x_value": "Asse X Sinistro Massimo Valore",
|
|
||||||
"midnightcontrols.menu.max_left_y_value": "Asse Y Sinistro Massimo Valore",
|
|
||||||
"midnightcontrols.menu.max_right_x_value": "Asse Destro X Massimo Valore",
|
|
||||||
"midnightcontrols.menu.max_right_y_value": "Asse Destro Y Massimo Valore",
|
|
||||||
"midnightcontrols.menu.mouse_speed": "Velocità Mouse",
|
|
||||||
"midnightcontrols.menu.reacharound.horizontal": "Piazza blocchi Davanti",
|
|
||||||
"midnightcontrols.menu.reacharound.vertical": "Reach Verticale",
|
|
||||||
"midnightcontrols.menu.reload_controller_mappings": "Ricarica Mappature del Controller",
|
|
||||||
"midnightcontrols.menu.right_dead_zone": "Zona Morta Stick Destro",
|
|
||||||
"midnightcontrols.menu.rotation_speed": "Velocità di rotazione dell'Asse X",
|
|
||||||
"midnightcontrols.menu.y_axis_rotation_speed": "Velocità di rotazione dell'Asse Y",
|
|
||||||
"midnightcontrols.menu.separate_controller_profile": "Profilo Controller Separato",
|
|
||||||
"midnightcontrols.menu.separator.controller": "Controller",
|
|
||||||
"midnightcontrols.menu.separator.general": "Generale",
|
|
||||||
"midnightcontrols.menu.title": "MidnightControls - Impostazioni",
|
|
||||||
"midnightcontrols.menu.title.controller": "Opzioni Controller",
|
|
||||||
"midnightcontrols.menu.title.controller_controls": "Tasti Controller",
|
|
||||||
"midnightcontrols.menu.title.gameplay": "Opzioni del Gameplay",
|
|
||||||
"midnightcontrols.menu.title.general": "Impostazioni Generali",
|
|
||||||
"midnightcontrols.menu.title.hud": "Opzioni della HUD",
|
|
||||||
"midnightcontrols.menu.title.mappings.string": "Editor di file delle Mappature",
|
|
||||||
"midnightcontrols.menu.title.visual": "Aspetto",
|
|
||||||
"midnightcontrols.menu.unfocused_input": "Input non a fuoco",
|
|
||||||
"midnightcontrols.menu.virtual_mouse": "Mouse Virtuale",
|
|
||||||
"midnightcontrols.menu.virtual_mouse.skin": "Aspetto Mouse Virtuale",
|
|
||||||
"midnightcontrols.narrator.unbound": "Disimpostato %s",
|
|
||||||
"midnightcontrols.not_bound": "Non Impostato",
|
|
||||||
"midnightcontrols.menu.analog_movement.tooltip": "Quando possibile, attiva movimento analogo.",
|
|
||||||
"midnightcontrols.menu.auto_switch_mode.tooltip": "Quando la modalità controlli dovrebbe passare a Controller automaticamente se uno è connesso",
|
|
||||||
"midnightcontrols.menu.controller2.tooltip": "Secondo controller da usare, che permette (per esempio) Supporto dei Joy-Cons.",
|
|
||||||
"midnightcontrols.menu.controller_type.tooltip": "Il tipo di controller che stai usando (usato per mostrare i pulsanti corretti)",
|
|
||||||
"midnightcontrols.menu.controls_mode.tooltip": "Modalita controlli.",
|
|
||||||
"midnightcontrols.menu.double_tap_to_sprint.tooltip": "Attiva quando il tasto \"Cammina Avanti\" fa correre il giocatore con doppio tap velocemente",
|
|
||||||
"midnightcontrols.menu.fast_block_placing.tooltip": "Quando si vola in creativa, attiva il movimento veloce dei blocchi in base alla tua velocità. §cSu alcuni server potrebbe essere considerato un cheat.§r",
|
|
||||||
"midnightcontrols.menu.fly_drifting.tooltip": "Quando si vola, attiva L'inerzia del Vanilla",
|
|
||||||
"midnightcontrols.menu.fly_drifting_vertical.tooltip": "Quando si vola, attiva l'inerzia verticale Vanilla",
|
|
||||||
"midnightcontrols.menu.hud_enable.tooltip": "Attiva gli indicatori dei pulsanti dei controller sullo schermo.",
|
|
||||||
"midnightcontrols.menu.hud_side.tooltip": "La posizione della HUD",
|
|
||||||
"midnightcontrols.menu.left_dead_zone.tooltip": "La zona morta per lo stick sinistro del controller.",
|
|
||||||
"midnightcontrols.menu.max_left_x_value.tooltip": "Cambia cosa la mod considera il più alto valore per l'asse X sinistro. Utile se il tuo asse non usa il range massimo e sembra lento",
|
|
||||||
"midnightcontrols.menu.max_left_y_value.tooltip": "Cambia cosa la mod considera il più alto valore per l'asse Y sinistro. Utile se il tuo asse non usa il range massimo e sembra lento",
|
|
||||||
"midnightcontrols.menu.max_right_x_value.tooltip": "Cambia cosa la mod considera il più alto valore per l'asse X Destro. Utile se il tuo asse non usa il range massimo e sembra lento.",
|
|
||||||
"midnightcontrols.menu.max_right_y_value.tooltip": "Cambia cosa la mod considera il più alto valore per l'asse Y Destro. Utile se il tuo asse non usa il range massimo e sembra lento.",
|
|
||||||
"midnightcontrols.menu.mouse_speed.tooltip": "La velocità del controller emulato.",
|
|
||||||
"midnightcontrols.menu.reacharound.horizontal.tooltip": "Attiva il piazzare blocchi davanti, Potrebbe essere considerato un cheat su alcuni server.",
|
|
||||||
"midnightcontrols.menu.reacharound.vertical.tooltip": "Attiva il reach verticale, potrebbe essere considerato cheating su alcuni server",
|
|
||||||
"midnightcontrols.menu.reload_controller_mappings.tooltip": "Riavvia il file dlle mappature del controller",
|
|
||||||
"midnightcontrols.menu.right_dead_zone.tooltip": "La zona morta per lo stick destro del controller",
|
|
||||||
"midnightcontrols.menu.rotation_speed.tooltip": "L'asse X della velocità di rotazione della camera im modalità controller",
|
|
||||||
"midnightcontrols.menu.y_axis_rotation_speed.tooltip": "L'asse Y della velocità di rotazione della camera im modalità controller",
|
|
||||||
"midnightcontrols.menu.unfocused_input.tooltip": "Permette imput dei controller quando la finestra non è messa a fuoco",
|
|
||||||
"midnightcontrols.menu.virtual_mouse.tooltip": "Attiva il mouse virtuale, che può essere utile nello schermo diviso.",
|
|
||||||
"midnightcontrols.virtual_mouse.skin.default_light": "Chiaro Default",
|
|
||||||
"midnightcontrols.virtual_mouse.skin.default_dark": "Scuro Default",
|
|
||||||
"midnightcontrols.virtual_mouse.skin.second_light": "Chiaro Secondario",
|
|
||||||
"midnightcontrols.virtual_mouse.skin.second_dark": "Scuro Secondario",
|
|
||||||
"modmenu.descriptionTranslation.midnightcontrols": "Aggiunge supporto e controlli migliorati in generale. \\nProveniente da LambdaControls, che è stato rimosso."
|
|
||||||
}
|
|
||||||
@@ -1,24 +1,5 @@
|
|||||||
{
|
{
|
||||||
"midnightcontrols.midnightconfig.title": "MidnightControls 고급 설정",
|
"midnightcontrols.midnightconfig.title": "MidnightControls 고급 설정",
|
||||||
"midnightcontrols.midnightconfig.enum.VirtualMouseSkin.DEFAULT_LIGHT": "기본 밝게",
|
|
||||||
"midnightcontrols.midnightconfig.enum.VirtualMouseSkin.DEFAULT_DARK": "기본 어둡게",
|
|
||||||
"midnightcontrols.midnightconfig.enum.VirtualMouseSkin.SECOND_LIGHT": "두 번째 밝게",
|
|
||||||
"midnightcontrols.midnightconfig.enum.VirtualMouseSkin.SECOND_DARK": "두 번째 어둡게",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.DEFAULT": "기본값값",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.DUALSHOCK": "듀얼쇼크",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.DUALSENSE": "듀얼센스",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.SWITCH": "Switch/Wii 컨트롤러",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.XBOX": "엑스박스 원/시리즈 컨트롤러",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.XBOX_360": "엑스박스 360 컨트롤러",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.STEAM_CONTROLLER": "스팀 컨트롤러",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.STEAM_DECK": "스팀 덱",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.OUYA": "OUYA 컨트롤러",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControllerType.NUMBERED": "숫자 컨트롤러",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControlsMode.DEFAULT": "키보드/마우스",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControlsMode.CONTROLLER": "컨트롤러",
|
|
||||||
"midnightcontrols.midnightconfig.enum.ControlsMode.TOUCHSCREEN": "터치스크린 (미완성)",
|
|
||||||
"midnightcontrols.midnightconfig.enum.HudSide.LEFT": "왼쪽",
|
|
||||||
"midnightcontrols.midnightconfig.enum.HudSide.RIGHT": "오른쪽",
|
|
||||||
"key.midnightcontrols.look_down": "아래쪽 보기",
|
"key.midnightcontrols.look_down": "아래쪽 보기",
|
||||||
"key.midnightcontrols.look_left": "왼쪽 보기",
|
"key.midnightcontrols.look_left": "왼쪽 보기",
|
||||||
"key.midnightcontrols.look_right": "오른쪽 보기",
|
"key.midnightcontrols.look_right": "오른쪽 보기",
|
||||||
@@ -27,7 +8,6 @@
|
|||||||
"midnightcontrols.action.attack": "공격",
|
"midnightcontrols.action.attack": "공격",
|
||||||
"midnightcontrols.action.back": "뒤로",
|
"midnightcontrols.action.back": "뒤로",
|
||||||
"midnightcontrols.action.chat": "채팅 열기",
|
"midnightcontrols.action.chat": "채팅 열기",
|
||||||
"midnightcontrols.action.debug_screen": "디버그 HUD 열기 (F3)",
|
|
||||||
"midnightcontrols.action.drop_item": "아이템 버리기",
|
"midnightcontrols.action.drop_item": "아이템 버리기",
|
||||||
"midnightcontrols.action.exit": "종료",
|
"midnightcontrols.action.exit": "종료",
|
||||||
"midnightcontrols.action.forward": "앞으로",
|
"midnightcontrols.action.forward": "앞으로",
|
||||||
@@ -147,32 +127,32 @@
|
|||||||
"midnightcontrols.menu.virtual_mouse.skin": "가상 마우스 스킨",
|
"midnightcontrols.menu.virtual_mouse.skin": "가상 마우스 스킨",
|
||||||
"midnightcontrols.narrator.unbound": "%s 해제됨",
|
"midnightcontrols.narrator.unbound": "%s 해제됨",
|
||||||
"midnightcontrols.not_bound": "바인딩되지 않음",
|
"midnightcontrols.not_bound": "바인딩되지 않음",
|
||||||
"midnightcontrols.menu.analog_movement.tooltip": "가능한 경우 아날로그 움직임을 사용합니다.",
|
"midnightcontrols.tooltip.analog_movement": "가능한 경우 아날로그 움직임을 사용합니다.",
|
||||||
"midnightcontrols.menu.auto_switch_mode.tooltip": "컨트롤러가 연결되면 자동으로 컨트롤 모드가 컨트롤러로 전환됩니다.",
|
"midnightcontrols.tooltip.auto_switch_mode": "컨트롤러가 연결되면 자동으로 컨트롤 모드가 컨트롤러로 전환됩니다.",
|
||||||
"midnightcontrols.menu.controller2.tooltip": "보조 컨트롤러를 사용하려면 Joy-Cons 지원을 허용하세요.",
|
"midnightcontrols.tooltip.controller2": "보조 컨트롤러를 사용하려면 Joy-Cons 지원을 허용하세요.",
|
||||||
"midnightcontrols.menu.controller_type.tooltip": "올바른 버튼을 표시할 컨트롤러 종류입니다.",
|
"midnightcontrols.tooltip.controller_type": "올바른 버튼을 표시할 컨트롤러 종류입니다.",
|
||||||
"midnightcontrols.menu.controls_mode.tooltip": "컨트롤 모드.",
|
"midnightcontrols.tooltip.controls_mode": "컨트롤 모드.",
|
||||||
"midnightcontrols.menu.fast_block_placing.tooltip": "크리에이티브 모드에서 비행하는 동안 사용자 속도에 따른 빠른 블록 배치를 사용합니다. §c일부 서버에선 치팅 행위로 취급될 수 있습니다.",
|
"midnightcontrols.tooltip.fast_block_placing": "크리에이티브 모드에서 비행하는 동안 사용자 속도에 따른 빠른 블록 배치를 사용합니다. §c일부 서버에선 치팅 행위로 취급될 수 있습니다.",
|
||||||
"midnightcontrols.menu.fly_drifting.tooltip": "비행하는 동안 바닐라처럼 관성을 적용합니다.",
|
"midnightcontrols.tooltip.fly_drifting": "비행하는 동안 바닐라처럼 관성을 적용합니다.",
|
||||||
"midnightcontrols.menu.fly_drifting_vertical.tooltip": "비행하는 동안 바닐라처럼 수직 관성을 적용합니다.",
|
"midnightcontrols.tooltip.fly_drifting_vertical": "비행하는 동안 바닐라처럼 수직 관성을 적용합니다.",
|
||||||
"midnightcontrols.menu.hud_enable.tooltip": "화면 컨트롤러 버튼 표시기 토글",
|
"midnightcontrols.tooltip.hud_enable": "화면 컨트롤러 버튼 표시기 토글",
|
||||||
"midnightcontrols.menu.hud_side.tooltip": "HUD 위치.",
|
"midnightcontrols.tooltip.hud_side": "HUD 위치.",
|
||||||
"midnightcontrols.menu.left_dead_zone.tooltip": "컨트롤러 왼쪽 아날로그 스틱 데드 존.",
|
"midnightcontrols.tooltip.left_dead_zone": "컨트롤러 왼쪽 아날로그 스틱 데드 존.",
|
||||||
"midnightcontrols.menu.max_left_x_value.tooltip": "모드가 인식하는 왼쪽 X 축 최댓값을 변경합니다. 사용자의 축이 전체 범위를 사용하지 않고 느리게 보일 경우 유용합니다.",
|
"midnightcontrols.tooltip.max_left_x_value": "모드가 인식하는 왼쪽 X 축 최댓값을 변경합니다. 사용자의 축이 전체 범위를 사용하지 않고 느리게 보일 경우 유용합니다.",
|
||||||
"midnightcontrols.menu.max_left_y_value.tooltip": "모드가 인식하는 왼쪽 Y 축 최댓값을 변경합니다. 사용자의 축이 전체 범위를 사용하지 않고 느리게 보일 경우 유용합니다.",
|
"midnightcontrols.tooltip.max_left_y_value": "모드가 인식하는 왼쪽 Y 축 최댓값을 변경합니다. 사용자의 축이 전체 범위를 사용하지 않고 느리게 보일 경우 유용합니다.",
|
||||||
"midnightcontrols.menu.max_right_x_value.tooltip": "모드가 인식하는 오른쪽 X 축 최댓값을 변경합니다. 사용자의 축이 전체 범위를 사용하지 않고 느리게 보일 경우 유용합니다.",
|
"midnightcontrols.tooltip.max_right_x_value": "모드가 인식하는 오른쪽 X 축 최댓값을 변경합니다. 사용자의 축이 전체 범위를 사용하지 않고 느리게 보일 경우 유용합니다.",
|
||||||
"midnightcontrols.menu.max_right_y_value.tooltip": "모드가 인식하는 오른쪽 Y 축 최댓값을 변경합니다. 사용자의 축이 전체 범위를 사용하지 않고 느리게 보일 경우 유용합니다.",
|
"midnightcontrols.tooltip.max_right_y_value": "모드가 인식하는 오른쪽 Y 축 최댓값을 변경합니다. 사용자의 축이 전체 범위를 사용하지 않고 느리게 보일 경우 유용합니다.",
|
||||||
"midnightcontrols.menu.mouse_speed.tooltip": "컨트롤러의 에뮬레이트된 마우스 속도.",
|
"midnightcontrols.tooltip.mouse_speed": "컨트롤러의 에뮬레이트된 마우스 속도.",
|
||||||
"midnightcontrols.menu.reacharound.horizontal.tooltip": "블록 전면 배치를 사용합니다. §c일부 서버에선 치팅 행위로 취급될 수 있습니다§r.",
|
"midnightcontrols.tooltip.reacharound.horizontal": "블록 전면 배치를 사용합니다. §c일부 서버에선 치팅 행위로 취급될 수 있습니다§r.",
|
||||||
"midnightcontrols.menu.reacharound.vertical.tooltip": "블록 수직 배치를 사용합니다. 블록 아래에 다른 블록을 배치할 수 있습니다. §c일부 서버에선 치팅 행위로 취급될 수 있습니다§r.",
|
"midnightcontrols.tooltip.reacharound.vertical": "블록 수직 배치를 사용합니다. 블록 아래에 다른 블록을 배치할 수 있습니다. §c일부 서버에선 치팅 행위로 취급될 수 있습니다§r.",
|
||||||
"midnightcontrols.menu.reload_controller_mappings.tooltip": "컨트롤러 매핑 파일을 다시 불러옵니다.",
|
"midnightcontrols.tooltip.reload_controller_mappings": "컨트롤러 매핑 파일을 다시 불러옵니다.",
|
||||||
"midnightcontrols.menu.right_dead_zone.tooltip": "컨트롤러 오른쪽 아날로그 스틱 데드 존",
|
"midnightcontrols.tooltip.right_dead_zone": "컨트롤러 오른쪽 아날로그 스틱 데드 존",
|
||||||
"midnightcontrols.menu.rotation_speed.tooltip": "컨트롤러 모드에서 적용되는 카메라 회전 속도.",
|
"midnightcontrols.tooltip.rotation_speed": "컨트롤러 모드에서 적용되는 카메라 회전 속도.",
|
||||||
"midnightcontrols.menu.unfocused_input.tooltip": "창이 활성화된 상태가 아니여도 컨트롤러 입력 허용.",
|
"midnightcontrols.tooltip.unfocused_input": "창이 활성화된 상태가 아니여도 컨트롤러 입력 허용.",
|
||||||
"midnightcontrols.menu.virtual_mouse.tooltip": "분할 화면에선 도움 되는 가상 마우스를 사용합니다.",
|
"midnightcontrols.tooltip.virtual_mouse": "분할 화면에선 도움 되는 가상 마우스를 사용합니다.",
|
||||||
"midnightcontrols.virtual_mouse.skin.default_light": "기본 밝게",
|
"midnightcontrols.virtual_mouse.skin.default_light": "기본 라이트",
|
||||||
"midnightcontrols.virtual_mouse.skin.default_dark": "기본 어둡게",
|
"midnightcontrols.virtual_mouse.skin.default_dark": "기본 다크",
|
||||||
"midnightcontrols.virtual_mouse.skin.second_light": "두 번째 밝게",
|
"midnightcontrols.virtual_mouse.skin.second_light": "두 번째 라이트",
|
||||||
"midnightcontrols.virtual_mouse.skin.second_dark": "두 번째 어둡게",
|
"midnightcontrols.virtual_mouse.skin.second_dark": "두 번째 다크",
|
||||||
"modmenu.descriptionTranslation.midnightcontrols": "컨트롤러 제어 및 전반적인 향상된 제어 기능을 추가합니다.\n안타깝게도 업데이트가 끊긴 LambdaControls의 Fork 버전입니다."
|
"modmenu.descriptionTranslation.midnightcontrols": "컨트롤러 제어 및 전반적인 향상된 제어 기능을 추가합니다.\n안타깝게도 업데이트가 끊긴 LambdaControls의 Fork 버전입니다."
|
||||||
}
|
}
|
||||||
@@ -144,31 +144,31 @@
|
|||||||
"midnightcontrols.menu.virtual_mouse.skin": "Дизайн Виртуальной Мышки",
|
"midnightcontrols.menu.virtual_mouse.skin": "Дизайн Виртуальной Мышки",
|
||||||
"midnightcontrols.narrator.unbound": "Освобождённый %s",
|
"midnightcontrols.narrator.unbound": "Освобождённый %s",
|
||||||
"midnightcontrols.not_bound": "Не Назначанно",
|
"midnightcontrols.not_bound": "Не Назначанно",
|
||||||
"midnightcontrols.menu.analog_movement.tooltip": "Включает аналоговое движение, когда это возможно.",
|
"midnightcontrols.tooltip.analog_movement": "Включает аналоговое движение, когда это возможно.",
|
||||||
"midnightcontrols.menu.auto_switch_mode.tooltip": "Автоматическое переключение на новый, только подключенный контроллер.",
|
"midnightcontrols.tooltip.auto_switch_mode": "Автоматическое переключение на новый, только подключенный контроллер.",
|
||||||
"midnightcontrols.menu.controller2.tooltip": "Дополнительный контроллер, например для Джой-конов.",
|
"midnightcontrols.tooltip.controller2": "Дополнительный контроллер, например для Джой-конов.",
|
||||||
"midnightcontrols.menu.controller_type.tooltip": "Тип контроллера, чтобы правильно сопоставить иконки кнопок.",
|
"midnightcontrols.tooltip.controller_type": "Тип контроллера, чтобы правильно сопоставить иконки кнопок.",
|
||||||
"midnightcontrols.menu.controls_mode.tooltip": "Тип контроля над игрой.",
|
"midnightcontrols.tooltip.controls_mode": "Тип контроля над игрой.",
|
||||||
"midnightcontrols.menu.double_tap_to_sprint.tooltip": "При двойном перемещением на левый стик, персонаж начинает бежать.",
|
"midnightcontrols.tooltip.double_tap_to_sprint": "При двойном перемещением на левый стик, персонаж начинает бежать.",
|
||||||
"midnightcontrols.menu.fast_block_placing.tooltip": "Во время полета в творческом режиме позволяет быстро размещать блоки в зависимости от вашей скорости. §cНа некоторых серверах это может расцениваться как читерство.§r",
|
"midnightcontrols.tooltip.fast_block_placing": "Во время полета в творческом режиме позволяет быстро размещать блоки в зависимости от вашей скорости. §cНа некоторых серверах это может расцениваться как читерство.§r",
|
||||||
"midnightcontrols.menu.fly_drifting.tooltip": "Во время полета включает ванильную инерцию.",
|
"midnightcontrols.tooltip.fly_drifting": "Во время полета включает ванильную инерцию.",
|
||||||
"midnightcontrols.menu.fly_drifting_vertical.tooltip": "Во время полета включает ванильную вертикальную инерцию.",
|
"midnightcontrols.tooltip.fly_drifting_vertical": "Во время полета включает ванильную вертикальную инерцию.",
|
||||||
"midnightcontrols.menu.hud_enable.tooltip": "Переключает видение иконок кнопок контроллера на экране.",
|
"midnightcontrols.tooltip.hud_enable": "Переключает видение иконок кнопок контроллера на экране.",
|
||||||
"midnightcontrols.menu.hud_side.tooltip": "Расположение интерфейса в определённую сторону.",
|
"midnightcontrols.tooltip.hud_side": "Расположение интерфейса в определённую сторону.",
|
||||||
"midnightcontrols.menu.left_dead_zone.tooltip": "Мертвая зона для левого аналогового стика контроллера.",
|
"midnightcontrols.tooltip.left_dead_zone": "Мертвая зона для левого аналогового стика контроллера.",
|
||||||
"midnightcontrols.menu.max_left_x_value.tooltip": "Изменяет то, что мод в итоге считает максимальным значением для левой оси X. Полезно, если ваша ось не использует весь диапазон и кажется медленной.",
|
"midnightcontrols.tooltip.max_left_x_value": "Изменяет то, что мод в итоге считает максимальным значением для левой оси X. Полезно, если ваша ось не использует весь диапазон и кажется медленной.",
|
||||||
"midnightcontrols.menu.max_left_y_value.tooltip": "Изменяет то, что мод в итоге считает максимальным значением для левой оси Y. Полезно, если ваша ось не использует весь диапазон и кажется медленной.",
|
"midnightcontrols.tooltip.max_left_y_value": "Изменяет то, что мод в итоге считает максимальным значением для левой оси Y. Полезно, если ваша ось не использует весь диапазон и кажется медленной.",
|
||||||
"midnightcontrols.menu.max_right_x_value.tooltip": "Изменяет то, что мод в итоге считает максимальным значением для правой оси X. Полезно, если ваша ось не использует весь диапазон и кажется медленной.",
|
"midnightcontrols.tooltip.max_right_x_value": "Изменяет то, что мод в итоге считает максимальным значением для правой оси X. Полезно, если ваша ось не использует весь диапазон и кажется медленной.",
|
||||||
"midnightcontrols.menu.max_right_y_value.tooltip": "Изменяет то, что мод в итоге считает максимальным значением для правой оси Y. Полезно, если ваша ось не использует весь диапазон и кажется медленной.",
|
"midnightcontrols.tooltip.max_right_y_value": "Изменяет то, что мод в итоге считает максимальным значением для правой оси Y. Полезно, если ваша ось не использует весь диапазон и кажется медленной.",
|
||||||
"midnightcontrols.menu.mouse_speed.tooltip": "Скорость мыши, эмулируемая контроллером.",
|
"midnightcontrols.tooltip.mouse_speed": "Скорость мыши, эмулируемая контроллером.",
|
||||||
"midnightcontrols.menu.reacharound.horizontal.tooltip": "Позволяет размещать передний блок перед собой. §cМожет рассматриваться как читерство на некоторых серверах§r.",
|
"midnightcontrols.tooltip.reacharound.horizontal": "Позволяет размещать передний блок перед собой. §cМожет рассматриваться как читерство на некоторых серверах§r.",
|
||||||
"midnightcontrols.menu.reacharound.vertical.tooltip": "Обеспечивает вертикальный охват. §cМожет рассматриваться как мошенничество на некоторых серверах§r.",
|
"midnightcontrols.tooltip.reacharound.vertical": "Обеспечивает вертикальный охват. §cМожет рассматриваться как мошенничество на некоторых серверах§r.",
|
||||||
"midnightcontrols.menu.reload_controller_mappings.tooltip": "Перезагружает файл раскладки контроллеров.",
|
"midnightcontrols.tooltip.reload_controller_mappings": "Перезагружает файл раскладки контроллеров.",
|
||||||
"midnightcontrols.menu.right_dead_zone.tooltip": "Мертвая зона для правого аналогового стика контроллера.",
|
"midnightcontrols.tooltip.right_dead_zone": "Мертвая зона для правого аналогового стика контроллера.",
|
||||||
"midnightcontrols.menu.rotation_speed.tooltip": "Скорость вращения камеры по оси X в режиме контроллера.",
|
"midnightcontrols.tooltip.rotation_speed": "Скорость вращения камеры по оси X в режиме контроллера.",
|
||||||
"midnightcontrols.menu.y_axis_rotation_speed.tooltip": "Скорость вращения камеры по оси Y в режиме контроллера.",
|
"midnightcontrols.tooltip.y_axis_rotation_speed": "Скорость вращения камеры по оси Y в режиме контроллера.",
|
||||||
"midnightcontrols.menu.unfocused_input.tooltip": "Разрешить ввод с контроллера, даже если игра на сфокусирована.",
|
"midnightcontrols.tooltip.unfocused_input": "Разрешить ввод с контроллера, даже если игра на сфокусирована.",
|
||||||
"midnightcontrols.menu.virtual_mouse.tooltip": "Включить виртуальную мышь, очень полезно при игре двоём на одном компьютере.",
|
"midnightcontrols.tooltip.virtual_mouse": "Включить виртуальную мышь, очень полезно при игре двоём на одном компьютере.",
|
||||||
"midnightcontrols.virtual_mouse.skin.default_light": "Обычный Светлый",
|
"midnightcontrols.virtual_mouse.skin.default_light": "Обычный Светлый",
|
||||||
"midnightcontrols.virtual_mouse.skin.default_dark": "Обычный Тёмный",
|
"midnightcontrols.virtual_mouse.skin.default_dark": "Обычный Тёмный",
|
||||||
"midnightcontrols.virtual_mouse.skin.second_light": "Дополнительный Светлый",
|
"midnightcontrols.virtual_mouse.skin.second_light": "Дополнительный Светлый",
|
||||||
|
|||||||
@@ -112,23 +112,23 @@
|
|||||||
"midnightcontrols.menu.virtual_mouse.skin": "Sanal Fare Görünümü",
|
"midnightcontrols.menu.virtual_mouse.skin": "Sanal Fare Görünümü",
|
||||||
"midnightcontrols.narrator.unbound": "%s Atanmamış",
|
"midnightcontrols.narrator.unbound": "%s Atanmamış",
|
||||||
"midnightcontrols.not_bound": "Tuş ataması yok",
|
"midnightcontrols.not_bound": "Tuş ataması yok",
|
||||||
"midnightcontrols.menu.auto_switch_mode.tooltip": "Eğer bir tanesi bağlandıysa, kontrol modu Oyun Kolu olarak değişmeli.",
|
"midnightcontrols.tooltip.auto_switch_mode": "Eğer bir tanesi bağlandıysa, kontrol modu Oyun Kolu olarak değişmeli.",
|
||||||
"midnightcontrols.menu.controller2.tooltip": "Kullanılacak ikinci oyun kolu, örnek olarak Joy-Con desteği de mümkün.",
|
"midnightcontrols.tooltip.controller2": "Kullanılacak ikinci oyun kolu, örnek olarak Joy-Con desteği de mümkün.",
|
||||||
"midnightcontrols.menu.controller_type.tooltip": "Doğru tuşları göstermesi için oyun kolu türü.",
|
"midnightcontrols.tooltip.controller_type": "Doğru tuşları göstermesi için oyun kolu türü.",
|
||||||
"midnightcontrols.menu.controls_mode.tooltip": "Kontrol Modu",
|
"midnightcontrols.tooltip.controls_mode": "Kontrol Modu",
|
||||||
"midnightcontrols.menu.fast_block_placing.tooltip": "Yaratıcı modda uçarken, hızına bağlı olarak hızlı blok koymayı etkinleştirir. §cBazı sunucular bunun hile olduğunu düşünebilir.",
|
"midnightcontrols.tooltip.fast_block_placing": "Yaratıcı modda uçarken, hızına bağlı olarak hızlı blok koymayı etkinleştirir. §cBazı sunucular bunun hile olduğunu düşünebilir.",
|
||||||
"midnightcontrols.menu.fly_drifting.tooltip": "Uçarken, Vanilla'daki gibi ani duruşlarda kayma efektini etkinleştirir.",
|
"midnightcontrols.tooltip.fly_drifting": "Uçarken, Vanilla'daki gibi ani duruşlarda kayma efektini etkinleştirir.",
|
||||||
"midnightcontrols.menu.fly_drifting_vertical.tooltip": "Yukarı/aşağı uçarken, Vanilla'daki gibi ani duruşlarda kayma efektini etkinleştirir.",
|
"midnightcontrols.tooltip.fly_drifting_vertical": "Yukarı/aşağı uçarken, Vanilla'daki gibi ani duruşlarda kayma efektini etkinleştirir.",
|
||||||
"midnightcontrols.menu.hud_enable.tooltip": "Ekranın üstünde oyun kolu tuşu göstergesini açar/kapatır.",
|
"midnightcontrols.tooltip.hud_enable": "Ekranın üstünde oyun kolu tuşu göstergesini açar/kapatır.",
|
||||||
"midnightcontrols.menu.hud_side.tooltip": "HUD'un konumu",
|
"midnightcontrols.tooltip.hud_side": "HUD'un konumu",
|
||||||
"midnightcontrols.menu.mouse_speed.tooltip": "Oyun kolunun taklit edilen fare hızı.",
|
"midnightcontrols.tooltip.mouse_speed": "Oyun kolunun taklit edilen fare hızı.",
|
||||||
"midnightcontrols.menu.reacharound.horizontal.tooltip": "Hızlı blok koymayı etkinleştirir. §cBazı sunucular bunun hile olduğunu düşünebilir.§r.",
|
"midnightcontrols.tooltip.reacharound.horizontal": "Hızlı blok koymayı etkinleştirir. §cBazı sunucular bunun hile olduğunu düşünebilir.§r.",
|
||||||
"midnightcontrols.menu.reacharound.vertical.tooltip": "En alta blok koymayı etkinleştirir. §cBazı sunucular bunun hile olduğunu düşünebilir.§r.",
|
"midnightcontrols.tooltip.reacharound.vertical": "En alta blok koymayı etkinleştirir. §cBazı sunucular bunun hile olduğunu düşünebilir.§r.",
|
||||||
"midnightcontrols.menu.reload_controller_mappings.tooltip": "Oyun kolu için eşleştirme dosyasını yeniler.",
|
"midnightcontrols.tooltip.reload_controller_mappings": "Oyun kolu için eşleştirme dosyasını yeniler.",
|
||||||
"midnightcontrols.menu.rotation_speed.tooltip": "Oyun kolu modunda olan kamera dönme hızı (X)",
|
"midnightcontrols.tooltip.rotation_speed": "Oyun kolu modunda olan kamera dönme hızı (X)",
|
||||||
"midnightcontrols.menu.y_axis_rotation_speed.tooltip": "Oyun kolu modunda olan kamera dönme hızı (Y)",
|
"midnightcontrols.tooltip.y_axis_rotation_speed": "Oyun kolu modunda olan kamera dönme hızı (Y)",
|
||||||
"midnightcontrols.menu.unfocused_input.tooltip": "Oyun penceresinde değilken oyun kolu girişine izine verir.",
|
"midnightcontrols.tooltip.unfocused_input": "Oyun penceresinde değilken oyun kolu girişine izine verir.",
|
||||||
"midnightcontrols.menu.virtual_mouse.tooltip": "Sanal fareyi etkinleştirir. Çift ekran oynanılacağı zaman işe yarar.",
|
"midnightcontrols.tooltip.virtual_mouse": "Sanal fareyi etkinleştirir. Çift ekran oynanılacağı zaman işe yarar.",
|
||||||
"midnightcontrols.virtual_mouse.skin.default_light": "Varsayılan Aydınlık Tema",
|
"midnightcontrols.virtual_mouse.skin.default_light": "Varsayılan Aydınlık Tema",
|
||||||
"midnightcontrols.virtual_mouse.skin.default_dark": "Varsayılan Karanlık Tema",
|
"midnightcontrols.virtual_mouse.skin.default_dark": "Varsayılan Karanlık Tema",
|
||||||
"midnightcontrols.virtual_mouse.skin.second_light": "İkincil Aydınlık Tema",
|
"midnightcontrols.virtual_mouse.skin.second_light": "İkincil Aydınlık Tema",
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user