Compare commits

..

83 Commits

Author SHA1 Message Date
Motschen
dd173836ff MidnightControls 1.6.0 - Stability, QoL, Cleanup & Compat
- Fixed camera choppiness (especially noticeable on low framerates, closes #38)
- Asset improvements kindly contributed by @spudpiggy
- Button tips now adjust properly to the scaled width of the window (closes #95)
- Make 'Back' binding configurable (closes #93)
- Add config option to disable the button in the controls screen (closes #97)
- Add compatibility with the Inventory Tabs mod (closes #100)
- Improve Emotecraft compatibility
- Add radial menu listing unbound keys (closes #101)
- Fix disabling the HUD not hiding the tips in container screens (closes #104)
- Fix 'Back' button not working correctly
- Fix recipe book not switching tab via shoulder buttons in Crafting Table and Furnace screens
- Support scrolling in Stonecutter
2022-09-21 20:58:27 +02:00
Motschen
203fd6cdb6 First 1.6.0 changes
Way too many changes & fixes to list here, still got some work to do, but this is coming along great already
2022-09-18 20:20:10 +02:00
Martin Prokoph
003f79d405 Merge pull request #98 from TrueHorse/feature/useBuildInScroll
Use build in scrollInHotbar
2022-09-06 17:03:23 +00:00
Martin Prokoph
f48527402a Merge pull request #83 from Madis0/patch-3
Update et_ee.json
2022-09-06 16:47:02 +00:00
Paul Roß
8c4b705e65 use build in scrollInHotbar 2022-09-04 14:17:36 +02:00
Madis Otenurm
1def693ae8 Update et_ee.json 2022-08-03 14:45:03 +03:00
Madis Otenurm
cfd05bb7b6 Update et_ee.json 2022-08-03 14:44:32 +03:00
Motschen
2e861470d8 MidnightControls 1.5.0 - Hints, Legacy Icons, LibGUI
- Add hints when controller is available, but not enabled (Closes #81)
- Add optional Legacy controller icon pack (thanks @Ivanoks)
- Add LibGUI compatibility
- Fix #75 (Swift Sneak enchantment not working, thanks @andrewaramsay)
- Fix crawling being too fast
- Minify assets by @Madis0 and @RaptaG
2022-08-03 12:19:33 +02:00
Motschen
e87ed53485 Push 1.4.2 progress to GitHub (not finished yet) 2022-07-23 13:47:57 +02:00
Martin Prokoph
8847c7f499 Merge pull request #78 from RaptaG/fixed-png-name
Fix wrong name on `controller-buttons.png`
2022-07-22 14:24:10 +00:00
RaptaG
da2773b1e9 Fix wrong name (you're welcome @Madis0) 2022-07-22 14:22:52 +03:00
Martin Prokoph
3650e756c3 Merge pull request #76 from Madis0/compress
Minified images
2022-07-22 09:27:54 +00:00
Madis
6b885beede Minified images 2022-07-20 22:15:41 +03:00
Martin Prokoph
abb3d1de3c Merge pull request #62 from RaptaG/patch-1
Improve README and update the screenshots
2022-07-18 08:41:16 +00:00
Martin Prokoph
a8cdfeeba9 Merge pull request #67 from Ivanoks/1.19
Updated to 1.4.0 format!
2022-07-18 08:40:27 +00:00
Ivan
ed4d310565 Update ru_ru.json 2022-07-09 21:29:11 +06:00
Ivan
ac73c99506 1.4.0 2022-07-09 21:23:11 +06:00
Ivan
d45eeac6dc 1.4.0 new update format. 2022-07-09 20:57:47 +06:00
RaptaG
77ff589544 Actually update screenshots 2022-07-07 16:35:58 +03:00
RaptaG
ce5c0b22db Delete controller_options.png 2022-07-07 13:34:53 +00:00
RaptaG
98af13fd0b Delete 2022-07-07_14.35.12.png 2022-07-07 13:34:11 +00:00
RaptaG
2387444d3a Delete 2022-07-07_14.34.52.png 2022-07-07 13:34:04 +00:00
RaptaG
57860490c8 Updated screenshots 2022-07-07 16:33:35 +03:00
RaptaG
f46aa175a4 Delete controller_controls.png 2022-07-07 13:32:29 +00:00
RaptaG
78390ca02f Modrinth downloads and improve CF downloads 2022-07-07 13:31:57 +00:00
RaptaG
31821b4833 Add the icon 2022-07-07 12:37:01 +00:00
RaptaG
e34ba6025a More improvements 2022-07-07 12:34:57 +00:00
Motschen
9891cd2977 MidnightControls 1.4.1 - Fix tooltips getting displaced
Fixes tooltips in inventories getting displaced when having the GUI scale set to something above 4.
2022-07-06 14:14:25 +02:00
RaptaG
8566e859e3 Improve README 2022-07-06 09:25:51 +00:00
Motschen
735b9e8718 MidnightControls 1.4.0 - Many Improvements and Fixes
- EMI compat! (Switch page keybinds & more)
- Expose more keybindings
- Fix Compatibility with Quilt Creative Extension
- Improve Auto Switch mode (Automatically switch gamepad on connection changes)
- Fix triggers not working on some (slightly broken) controllers
- Fix #57 (Broken stack pickup)
- Fix #56 (Unused language strings)
- Fix #52 (Rebound perspective button blocking actions)
- Fix #46 (Button overlap with Crawl mod)
- Fix #59 (D-Pad can switch EMI buttons when in Inventories)
2022-07-05 21:15:31 +02:00
Martin Prokoph
71ee3d8e0a Merge pull request #55 from Madis0/patch-2
Estonian translation
2022-07-04 18:24:31 +00:00
Martin Prokoph
11f102759c Merge pull request #54 from Madis0/patch-1
Fix missing tooltip
2022-07-04 18:23:47 +00:00
Martin Prokoph
02dd543027 Merge pull request #53 from Ivanoks/1.19
Added Russian Language.
2022-07-04 18:22:39 +00:00
KiskaUWU
c247e51d00 Update ru_ru.json 2022-07-03 00:58:28 +10:00
KiskaUWU
e3052343d3 Update ru_ru.json 2022-07-03 00:57:17 +10:00
KiskaUWU
9e879f9230 Update ru_ru.json 2022-07-03 00:50:56 +10:00
Ivan
bda436d863 Update ru_ru.json
Fix the 128 ",".
2022-07-02 20:42:13 +06:00
KiskaUWU
98d2cdae63 Update ru_ru.json 2022-07-03 00:39:28 +10:00
Ivan
8e0e444d15 Update ru_ru.json
Changed the word format in line 99.
2022-07-02 20:07:07 +06:00
Madis Otenurm
f586647e07 Update et_ee.json 2022-07-02 17:02:47 +03:00
Ivan
73ab8456e7 Update ru_ru.json
Added subtitle about double-tap for run.
+ fix the extra characters in line 165.
2022-07-02 20:00:45 +06:00
Madis Otenurm
1a3d7ce225 Create et_ee.json 2022-07-02 16:42:40 +03:00
Madis Otenurm
965ab57159 Oops 2022-07-02 16:12:47 +03:00
Madis Otenurm
c8dba43b90 Update en_us.json 2022-07-02 12:44:08 +03:00
Ivan
dd8e62c73e Update ru_ru.json 2022-07-02 03:03:52 +06:00
Ivan
b24a158b9b Add files via upload 2022-07-02 02:12:07 +06:00
Motschen
df7c7bbdad MidnightControls 1.3.0 - Fixes and Improvements
- Merge #48 (Split rotation speed in X and Y, thanks to @ronniedude)
- Merge #47 (Korean translations by @gyular)
- Fix #50 (Stack pick-up problems in survival mode)
- Add some compatibility measures for EMI (Will likely be improved further in the future)
- Remove all REI-related code (not working anyway, EMI is better)
- Possibly fix #41 (Random crashes when changing keybinds)
2022-06-30 21:29:59 +02:00
Martin Prokoph
3ddae57eab Merge pull request #47 from gyular/ko_kr
Added Korean Translation
2022-06-30 19:20:55 +00:00
Martin Prokoph
a0701f55f6 Merge pull request #48 from ronniedude/1.19
Split rotationspeed option to allow for separate horizontal and vertical speeds (controller)
2022-06-30 15:03:02 +00:00
ronniedude
b15766dfdb Split rotationspeed option to allow for separate horizontal and vertical speed configurations (controller) 2022-06-29 16:55:15 -04:00
gyular
19ed068da9 Added Korean Translation 2022-06-28 01:53:56 +09:00
Motschen
d2e21f8723 MidnightControls 1.2.2 - Important Bugfix
Fix #45
Fix #44
2022-06-27 14:10:03 +02:00
Motschen
b3f7350de9 MidnightControls 1.2.1 - Fix log spam 2022-06-25 22:21:51 +02:00
Motschen
34408d7a2a MidnightControls 1.2.0 - Touchscreen, Modded Keybinds, Bugfixes
- Added #40 (Modded keybind support)
- Added #20 (Touchscreen support)
- Improved #13 (Sodium screen controller support)
- Attempt to fix #31 & #38 (Jittery input on low FPS)
- Fixed #35 (Front placing being broken)
- Fixed #32 (Option to disable double tap to sprint)
- Fixed #27 (Auto-adapt controller icons)
- Fixed #19 (HUD-scaling on big scales)
- Fixed #36 (Crash on game load)
- Fixed reset option
- Fixed scrolling in trading screens
- Disable features that might be considered as cheats (install MidnightControlsExtra to enable)
2022-06-25 21:23:25 +02:00
Motschen
6e64c7c97d MidnightControls 1.1.0 - 1.19, Inventory Improvements
- Update to 1.19
- Make buttons for Item/Stack Grabbing and Quick Moving configurable
- Add Keybinds for moving between Fabric Creative Inventory Pages
2022-06-09 21:59:26 +02:00
Martin Prokoph
bca73c93cc Merge pull request #29 from akemin-dayo/1.18
OkZoomerCompat, MidnightControlsCompat: Added compatibility with Ok Zoomer 5.0.0-beta.7 (Quilt).
2022-06-09 14:30:39 +00:00
Karen/あけみ
913e79fe5b OkZoomerCompat, MidnightControlsCompat: Added some more comments in the code. 2022-06-08 20:45:50 -07:00
Karen/あけみ
b1334a0455 OkZoomerCompat, MidnightControlsCompat: Added compatibility with Ok Zoomer 5.0.0-beta.7 (Quilt). Tested with Minecraft 1.18.2, Ok Zoomer 5.0.0-beta.7, quilted-fabric-api/QSL 1.1.0-beta.17 (implementing Fabric API 0.55.1 and QFAPI 1.0.0-beta.19), and Quilt Loader 0.17.0-beta.2. And yes, MidnightControls works with Quilt. 2022-06-08 20:40:35 -07:00
Motschen
ce9495c79c Fix vanilla mouseScreens not working in production 2022-05-08 19:42:41 +02:00
Motschen
ff8270d18a MidnightControls 1.0.0 - Bedrock icon resourcepack
- Bring back Lambda-style XBox icons and add optional resourcepack for Bedrock-style icons (Closes #16)
- Make screens on which the controller behaves like a mouse configurable in the advanced config.
2022-05-08 18:46:46 +02:00
Martin Prokoph
3f33549760 Merge pull request #18 from akemin-dayo/1.18
MidnightControlsSettingsScreen: Fix midnightcontrols.tooltip.controls_mode localisation key, which somehow got clobbered in commit SHA1 0226bfc62f.
2022-05-03 20:59:43 +02:00
Karen/あけみ
d034607032 Merge branch '1.18' of https://github.com/TeamMidnightDust/MidnightControls into 1.18
* '1.18' of https://github.com/TeamMidnightDust/MidnightControls:
  Fix crash on resizing options screen
  MidnightControls 0.3.0 - Automatic mapping downloading
2022-05-03 11:54:22 -07:00
Karen/あけみ
e9a11c0ab9 MidnightControlsSettingsScreen: Fix midnightcontrols.tooltip.controls_mode localisation key, which somehow got clobbered in commit SHA1 0226bfc62f. 2022-05-03 11:50:00 -07:00
Motschen
e0d90fc56a Fix crash on resizing options screen 2022-05-03 20:41:24 +02:00
Motschen
cac23d12a1 MidnightControls 0.3.0 - Automatic mapping downloading
- Automatic downloading of mappings from https://github.com/gabomdq/SDL_GameControllerDB
- Change some default settings
- Fix OkZoomer compat by @akemin-dayo
- German translations (by myself)
- Add contributors to fabric.mod.json
- Fix some issues
2022-05-03 20:29:29 +02:00
Martin Prokoph
b982772d31 Merge pull request #17 from akemin-dayo/akemi-ok-zoomer-compat
OkZoomerCompat, MidnightControlsCompat: Major rewrite that now adds compatibility with both 5.0.0-beta Ok Zoomer API versions via Reflection.
2022-05-03 17:23:59 +02:00
Martin Prokoph
e4ca0db2a2 Merge pull request #15 from akemin-dayo/1.18
Added an option to always show the HUD while in Controller Mode, matching the legacy behaviour of LambdaControls. Also changed some default settings to be "safe" in the sense that the features that can be considered "cheating" in multiplayer servers are now disabled by default.
2022-05-03 17:23:45 +02:00
Karen/あけみ
f0cd2a51d1 build.gradle, gradle.properties: Temporarily comment out Ok Zoomer and LibZoomer dependencies, since we don't use them right now as OkZoomerCompat uses Reflection at runtime instead to deal with the current API incompatibility situation. 2022-05-03 07:50:08 -07:00
Karen/あけみ
9d37862144 OkZoomerCompat, MidnightControlsCompat: Major rewrite that now adds compatibility with both 5.0.0-beta Ok Zoomer API versions via Reflection. This fully fixes all current Ok Zoomer-related crashing issues, such as those encountered in #3. Tested with Minecraft 1.18.2 (5.0.0-beta.6) and Minecraft 1.18.1 (5.0.0-beta.3). 2022-05-03 07:43:06 -07:00
Karen/あけみ
c31fb76215 MidnightControlsConfig: Changed some default settings to be "safe" in the sense that the features that can be considered "cheating" in multiplayer servers are now disabled by default. 2022-05-03 05:02:23 -07:00
Karen/あけみ
b6563af2b1 hud_always_show: Add untranslated strings to es_mx, fr_ca, fr_ft, tr_tr, and zh_cn. 2022-05-03 04:54:07 -07:00
Karen/あけみ
1a0030a680 Added an option to always show the HUD while in Controller Mode, matching the legacy behaviour of LambdaControls. This option is enabled by default so that users migrating from LambdaControls will have a consistent experience. 2022-05-03 04:53:45 -07:00
Motschen
78c858b753 Refresh MidnightControlsFeature state on config change 2022-05-03 12:59:08 +02:00
Martin Prokoph
24288b3ebd Update README.md 2022-05-03 10:25:09 +00:00
Motschen
0226bfc62f MidnightControls 0.2.0 - Fixes, improvements, compat
- Fix #4
- Fix #3 (maybe?)
- No longer break OptiFabric
- Better XBox controller icons (#7) by @Ivanoks
- Start of reimplementing REI compat
- Hide HUD when controller is missing
2022-05-03 12:22:20 +02:00
Martin Prokoph
28d92a65d4 Merge pull request #8 from DioEgizio/patch-1
fix links in fmj
2022-04-29 18:28:19 +02:00
DioEgizio
132bdc0cc5 fix links in fmj
fix links in fabric.mod.json
2022-04-21 16:48:43 +02:00
Motschen
bdffef681f Update CHANGELOG.md 2022-03-16 16:40:57 +01:00
Motschen
a49a64ef44 Update README.md 2022-03-12 23:12:17 +01:00
Motschen
0e192b2af4 Merge branch '1.18' of https://github.com/Motschen/LambdaControls into 1.18 2022-03-12 23:10:33 +01:00
Motschen
6dd654f2f5 Update metafiles 2022-03-12 23:10:29 +01:00
Motschen
eb406a4681 Update README.md 2022-03-12 23:02:55 +01:00
Motschen
d386e3d9a2 Update README.md 2022-03-12 23:02:10 +01:00
102 changed files with 3117 additions and 1544 deletions

View File

@@ -1,5 +1,21 @@
# Changelog # Changelog
# MidnightControls
## 0.1.0
First beta!
Changes from LambdaControls:
- Support for Steam Deck and Dualsense
- Support for L4, L5, R4, R5 buttons
- Updated Libraries
- New Logo and Name
- Lots of Bugfixes
- MidnightConfig backend
# LambdaControls
## 1.0.0 ## 1.0.0
:tada: First release! :tada: :tada: First release! :tada:
@@ -14,11 +30,11 @@
### 1.0.1 ### 1.0.1
- Fixed tutorial toast to look around not affected by camera movement done with a controller. ([#2](https://github.com/LambdAurora/midnightcontrols/issues/2)) - Fixed tutorial toast to look around not affected by camera movement done with a controller. ([#2](https://github.com/LambdAurora/LambdaControls/issues/2))
### 1.0.2 (Unofficial) ### 1.0.2 (Unofficial)
This update was never pushed but was aiming to fix [#4](https://github.com/LambdAurora/midnightcontrols/issues/4). This update was never pushed but was aiming to fix [#4](https://github.com/LambdAurora/LambdaControls/issues/4).
- Fixed the toggle sneak button binding. - Fixed the toggle sneak button binding.
- Fixed broken chat arrow keys. - Fixed broken chat arrow keys.
@@ -26,17 +42,17 @@ This update was never pushed but was aiming to fix [#4](https://github.com/Lambd
## 1.1.0 - Chording update ## 1.1.0 - Chording update
This update also has a backport 1.14.4 version ([#9](https://github.com/LambdAurora/midnightcontrols/issues/9)). This update also has a backport 1.14.4 version ([#9](https://github.com/LambdAurora/LambdaControls/issues/9)).
- Rewrote everything (almost). - Rewrote everything (almost).
- Added [networking](https://github.com/LambdAurora/midnightcontrols/wiki/midnightcontrols-Networking) for some features. - Added [networking](https://github.com/LambdAurora/LambdaControls/wiki/LambdaControls-Networking) for some features.
- Added second controller support (Joycons supported now hopefully). - Added second controller support (Joycons supported now hopefully).
- Added chording. - Added chording.
- Added better developer API - Added better developer API
- Added hover messages ([#5](https://github.com/LambdAurora/midnightcontrols/issues/5)). - Added hover messages ([#5](https://github.com/LambdAurora/LambdaControls/issues/5)).
- Added hotbar button bindings ([#7](https://github.com/LambdAurora/midnightcontrols/issues/7)). - Added hotbar button bindings ([#7](https://github.com/LambdAurora/LambdaControls/issues/7)).
- Added front block placing feature ([#8](https://github.com/LambdAurora/midnightcontrols/issues/8)). - Added front block placing feature ([#8](https://github.com/LambdAurora/LambdaControls/issues/8)).
- Added no creative fly drifting ([#8](https://github.com/LambdAurora/midnightcontrols/issues/8)). - Added no creative fly drifting ([#8](https://github.com/LambdAurora/LambdaControls/issues/8)).
- Added option to enable controller focus. - Added option to enable controller focus.
- Added [OkZoomer](https://github.com/joaoh1/OkZoomer) compatibility. - Added [OkZoomer](https://github.com/joaoh1/OkZoomer) compatibility.
- Added D-pad movements in inventories. - Added D-pad movements in inventories.
@@ -50,10 +66,10 @@ This update also has a backport 1.14.4 version ([#9](https://github.com/LambdAur
## 1.2.0-1.3.0 ## 1.2.0-1.3.0
- Improved rotation algorithm ([#11](https://github.com/LambdAurora/midnightcontrols/issues/11)). - Improved rotation algorithm ([#11](https://github.com/LambdAurora/LambdaControls/issues/11)).
- Added virtual mouse. - Added virtual mouse.
- Added outline on front block placing. - Added outline on front block placing.
- Added fast block placement ([#8](https://github.com/LambdAurora/midnightcontrols/issues/8)). - Added fast block placement ([#8](https://github.com/LambdAurora/LambdaControls/issues/8)).
- Added [REI](https://www.curseforge.com/minecraft/mc-mods/roughly-enough-items) compatibility. - Added [REI](https://www.curseforge.com/minecraft/mc-mods/roughly-enough-items) compatibility.
- Improved HUD. - Improved HUD.
- Added recipe book control. - Added recipe book control.
@@ -62,7 +78,7 @@ This update also has a backport 1.14.4 version ([#9](https://github.com/LambdAur
### 1.3.1 ### 1.3.1
- Fixed broken inventory interactions ([#13](https://github.com/LambdAurora/midnightcontrols/issues/13)) - Fixed broken inventory interactions ([#13](https://github.com/LambdAurora/LambdaControls/issues/13))
- Fixed virtual mouse preventing continuous attack (thus making breaking blocks impossible). - Fixed virtual mouse preventing continuous attack (thus making breaking blocks impossible).
- Added support for [ModUpdater](https://gitea.thebrokenrail.com/TheBrokenRail/ModUpdater) hopefully. - Added support for [ModUpdater](https://gitea.thebrokenrail.com/TheBrokenRail/ModUpdater) hopefully.
- Updated [SpruceUI](https://github.com/LambdAurora/SpruceUI) to 1.5.2. - Updated [SpruceUI](https://github.com/LambdAurora/SpruceUI) to 1.5.2.
@@ -76,7 +92,7 @@ This update also has a backport 1.14.4 version ([#9](https://github.com/LambdAur
## 1.4.0 ## 1.4.0
- Added analog movements ([#10](https://github.com/LambdAurora/midnightcontrols/issues/10)). - Added analog movements ([#10](https://github.com/LambdAurora/LambdaControls/issues/10)).
- Improved Ok Zoomer compability. - Improved Ok Zoomer compability.
- Updated [SpruceUI](https://github.com/LambdAurora/SpruceUI) to 1.5.8 to ensure 1.16.2 compability. - Updated [SpruceUI](https://github.com/LambdAurora/SpruceUI) to 1.5.8 to ensure 1.16.2 compability.
- Internal changes: - Internal changes:
@@ -84,7 +100,7 @@ This update also has a backport 1.14.4 version ([#9](https://github.com/LambdAur
- Replace lot of strings with Texts. - Replace lot of strings with Texts.
- Improved block outline rendering injection. - Improved block outline rendering injection.
- Shadow library jars instead of Jar-in-Jar. - Shadow library jars instead of Jar-in-Jar.
- Fixed crash in inventory ([#16](https://github.com/LambdAurora/midnightcontrols/issues/16)) - Fixed crash in inventory ([#16](https://github.com/LambdAurora/LambdaControls/issues/16))
- WIP: - WIP:
- Started to work on action ring. - Started to work on action ring.
- Will allow for better compability with other mods. - Will allow for better compability with other mods.
@@ -97,8 +113,8 @@ This update also has a backport 1.14.4 version ([#9](https://github.com/LambdAur
## 1.5.0 ## 1.5.0
- Added mappings string editor screen. - Added mappings string editor screen.
- Added Simplified Chinese translations ([#18](https://github.com/LambdAurora/midnightcontrols/pull/18)). - Added Simplified Chinese translations ([#18](https://github.com/LambdAurora/LambdaControls/pull/18)).
- Added Mexican Spanish translations ([#22](https://github.com/LambdAurora/midnightcontrols/pull/22)). - Added Mexican Spanish translations ([#22](https://github.com/LambdAurora/LambdaControls/pull/22)).
- Added Xbox 360 button skin and overhauled Xbox button skin. - Added Xbox 360 button skin and overhauled Xbox button skin.
- Added debug option. - Added debug option.
- Respect toggle setting in Accessibility screen. - Respect toggle setting in Accessibility screen.
@@ -114,17 +130,17 @@ This update also has a backport 1.14.4 version ([#9](https://github.com/LambdAur
## 1.6.0 ## 1.6.0
- Reworked entirely the settings screen. - Reworked entirely the settings screen.
- Added independent stick dead zones. ([#32](https://github.com/LambdAurora/midnightcontrols/issues/32)) - Added independent stick dead zones. ([#32](https://github.com/LambdAurora/LambdaControls/issues/32))
- Added max values range. ([#41](https://github.com/LambdAurora/midnightcontrols/issues/41)) - Added max values range. ([#41](https://github.com/LambdAurora/LambdaControls/issues/41))
- Updated [SpruceUI] and fix related crashes due to incompatible versions ([#40](https://github.com/LambdAurora/midnightcontrols/issues/40), [#48](https://github.com/LambdAurora/midnightcontrols/issues/48)). - Updated [SpruceUI] and fix related crashes due to incompatible versions ([#40](https://github.com/LambdAurora/LambdaControls/issues/40), [#48](https://github.com/LambdAurora/LambdaControls/issues/48)).
- Fix boat control issues ([#37](https://github.com/LambdAurora/midnightcontrols/issues/37)). - Fix boat control issues ([#37](https://github.com/LambdAurora/LambdaControls/issues/37)).
- Fix incompatibilities with mods using night-config. Now shadowing properly night-config. ([#33](https://github.com/LambdAurora/midnightcontrols/issues/33), [#39](https://github.com/LambdAurora/midnightcontrols/issues/39)) - Fix incompatibilities with mods using night-config. Now shadowing properly night-config. ([#33](https://github.com/LambdAurora/LambdaControls/issues/33), [#39](https://github.com/LambdAurora/LambdaControls/issues/39))
## 1.7.0 ## 1.7.0
- Updated to 1.17. - Updated to 1.17.
- Small improvements to the codebase thanks to Java 16. - Small improvements to the codebase thanks to Java 16.
- Fix controller bindings not being saved ([#31](https://github.com/LambdAurora/midnightcontrols/issues/31), [#55](https://github.com/LambdAurora/midnightcontrols/issues/55)). - Fix controller bindings not being saved ([#31](https://github.com/LambdAurora/LambdaControls/issues/31), [#55](https://github.com/LambdAurora/LambdaControls/issues/55)).
- Dropped entirely Touchscreen Input Mode. - Dropped entirely Touchscreen Input Mode.
- Dropped Roughly Enough Items compatibility. - Dropped Roughly Enough Items compatibility.
@@ -132,4 +148,4 @@ This update also has a backport 1.14.4 version ([#9](https://github.com/LambdAur
- Fix crash at startup. - Fix crash at startup.
[SpruceUI]: https://github.com/LambdAurora/SpruceUI [SpruceUI]: https://github.com/LambdAurora/SpruceUI

View File

@@ -2,7 +2,7 @@
:tada: First of all, thanks for taking time to contribute! :tada: :tada: First of all, thanks for taking time to contribute! :tada:
The following is a set of guidelines for contributing to midnightcontrols. The following is a set of guidelines for contributing to MidnightControls.
Feel free to propose changes to this document in a pull request. Feel free to propose changes to this document in a pull request.
**Table of Contents** **Table of Contents**
@@ -18,7 +18,7 @@ Feel free to propose changes to this document in a pull request.
## Code of Conduct ## Code of Conduct
This project and everyone participating in it is governed by the [Code of Conduct](https://github.com/LambdAurora/midnightcontrols/blob/master/CODE_OF_CONDUCT.md). This project and everyone participating in it is governed by the [Code of Conduct](https://github.com/LambdAurora/midnightcontrols/blob/master/CODE_OF_CONDUCT.md).
By participating, you are expected to uphold this code. Please report unacceptable behavior at [aurora42lambda@gmail.com](mailto:aurora42lambda@gmail.com). By participating, you are expected to uphold this code. Please report unacceptable behavior at [motschen@midnightdust.eu](mailto:motschen@midnightdust.eu).
## What should I know before I get started? ## What should I know before I get started?
@@ -26,9 +26,9 @@ By participating, you are expected to uphold this code. Please report unacceptab
[Fabric](https://fabricmc.net/) is the mod loader and the software which allows Gradle to setup the workspace. [Fabric](https://fabricmc.net/) is the mod loader and the software which allows Gradle to setup the workspace.
### Java 16 ### Java 17
Java is the main language used to make midnightcontrols alive. Java is the main language used to make MidnightControls alive.
Knowing how to code in Java is necessary if you contribute to the code. Knowing how to code in Java is necessary if you contribute to the code.
### Minecraft ### Minecraft
@@ -60,12 +60,12 @@ Git commits should be signed.
#### How do I submit a bug report? #### How do I submit a bug report?
Go in the issues tab in GitHub and read the [bug report guide](https://github.com/LambdAurora/midnightcontrols/blob/1.17/.github/ISSUE_TEMPLATE/bug_report.md) Go in the issues tab in GitHub and read the [bug report guide](https://github.com/TeamMidnightDust/MidnightControls/blob/1.18/.github/ISSUE_TEMPLATE/bug_report.md)
### Suggesting enhancements ### Suggesting enhancements
Enhancement suggestions are tracked as [GitHub issues](https://github.com/LambdAurora/midnightcontrols/issues). Enhancement suggestions are tracked as [GitHub issues](https://github.com/TeamMidnightDust/MidnightControls/issues).
Check out the [feature request](https://github.com/LambdAurora/midnightcontrols/blob/1.17/.github/ISSUE_TEMPLATE/feature_request.md) guide. Check out the [feature request](https://github.com/TeamMidnightDust/MidnightControls/blob/1.17/.github/ISSUE_TEMPLATE/feature_request.md) guide.
### Do pull requests ### Do pull requests

5
HEADER
View File

@@ -1,6 +1,7 @@
Copyright © 2021 LambdAurora <aurora42lambda@gmail.com> Copyright © 2021 LambdAurora <aurora42lambda@gmail.com>
Copyright © 2022 Motschen <motschen@midnightdust.eu>
This file is part of midnightcontrols. This file is part of MidnightControls.
Licensed under the MIT license. For more information, Licensed under the MIT license. For more information,
see the LICENSE file. see the LICENSE file.

View File

@@ -1,6 +1,7 @@
MIT License MIT License
Copyright © 2021 LambdAurora <aurora42lambda@gmail.com> Copyright © 2021 LambdAurora <aurora42lambda@gmail.com>
Copyright © 2022 Motschen <motschen@midnightdust.eu>
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
@@ -18,4 +19,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.

View File

@@ -1,28 +1,29 @@
# midnightcontrols <div align="center">
<img src=https://github.com/TeamMidnightDust/MidnightControls/blob/1.19/src/main/resources/assets/midnightcontrols/icon.png>
<!-- modrinth_exclude.start --> # MidnightControls
![Java 16](https://img.shields.io/badge/language-Java%2016-9B599A.svg?style=flat-square) <!-- modrinth_exclude.end -->
[![GitHub license](https://img.shields.io/github/license/LambdAurora/midnightcontrols?style=flat-square)](https://raw.githubusercontent.com/LambdAurora/midnightcontrols/master/LICENSE)
![Environment: Client](https://img.shields.io/badge/environment-client-1976d2?style=flat-square)
[![Mod loader: Fabric]][fabric] <!-- modrinth_exclude.start -->
![Version](https://img.shields.io/github/v/tag/LambdAurora/midnightcontrols?label=version&style=flat-square)
[![CurseForge](http://cf.way2muchnoise.eu/title/354231.svg)](https://www.curseforge.com/minecraft/mc-mods/midnightcontrols)
<!-- modrinth_exclude.end -->
A Fabric Minecraft mod which adds better controls, reach-around and controller support. [![CurseForge](https://cf.way2muchnoise.eu/full_midnightcontrols_downloads%20on%20CurseForge.svg?badge_style=round)](https://www.curseforge.com/minecraft/mc-mods/midnightcontrols)
[![Modrinth]](https://modrinth.com/mod/midnightcontrols)
[![Version](https://img.shields.io/github/v/tag/TeamMidnightDust/MidnightControls?label=version&style=round)](https://github.com/TeamMidnightDust/MidnightControls/releases)
![Environment: Client](https://img.shields.io/badge/environment-client-1976d2?style=round)
[![Mod loader: Quilt/Fabric]][Quilt]
[![Java 17](https://img.shields.io/badge/language-Java%2017-9B599A.svg?style=round)](https://www.oracle.com/java/technologies/downloads/#java17)
[![GitHub license](https://img.shields.io/github/license/TeamMidnightDust/MidnightControls?style=round)](LICENSE)
A Fabric Minecraft mod which adds better controls, reach-around and controller support.
Forked from [LambdaControls](https://github.com/LambdAurora/LambdaControls) by the amazing [LambdAurora](https://github.com/LambdAurora), which was sadly discontinued.
</div>
## What's this mod? ## What's this mod?
This mod adds better controls, reach-around features, etc. MidnightControls is a mod which provides controller and touchscreen support in Minecraft: Java Edition.<br />It also includes some Bedrock Edition parity and reach-around features!
Haven't you dreamed to travel in your modded Minecraft world with your controller? Yes? Then this mod is made for you! ## Features:
This mod also adds controller support.
## ✅ Features:
- Controller support - Controller support
- Touchscreen support (very experimental and buggy). - Touchscreen support
- Keyboard controls to look around. - Keyboard controls to look around.
- Toggleable on screen button indicator (like in Bedrock Edition). - Toggleable on screen button indicator (like in Bedrock Edition).
- Vertical reach-around. - Vertical reach-around.
@@ -31,27 +32,38 @@ This mod also adds controller support.
- Front block placing (be careful with this one) - Front block placing (be careful with this one)
- New controls settings! - New controls settings!
- Many options in config to change to your liking. - Many options in config to change to your liking.
- Many controllers supported and in a simply way your own controller mappings. - Many controllers supported and in a simple way your own controller mappings.
- An easy API for developers to add their own button bindings. - An easy API for developers to add their own button bindings.
## 🎮 Supported Controllers: ## 🎮 Supported Controllers:
- Dualshock controllers - DualShock controllers
- DualSense controllers
- Xbox controllers - Xbox controllers
- Switch Pro controllers - Switch Pro controllers
- Joycons - Joy-Cons
- Steam controller and Steam Deck (WIP)
- And many more! - And many more!
## Screenshots ## Screenshots
![controller_controls](images/controller_controls.png) ![Controller_Controls](images/controller_controls.png)
![controller_options](images/controller_options.png) ![Controller_Options](images/controller_options.png)
<!-- modrinth_exclude.start -->
## Build ## Build
Just do `./gradlew build` and everything should build just fine! Clone the repo with:
<!-- modrinth_exclude.end --> ```
git clone https://github.com/TeamMidnightDust/MidnightControls
```
Enter the folder created and run:
```
./gradlew build
```
After this is done, everything should be built just fine!
[fabric]: https://fabricmc.net [Quilt]: https://quiltmc.org
[Mod loader: Fabric]: https://img.shields.io/badge/modloader-Fabric-1976d2?style=flat-square&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFHGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDIgNzkuMTYwOTI0LCAyMDE3LzA3LzEzLTAxOjA2OjM5ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE4LTEyLTE2VDE2OjU0OjE3LTA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0wNy0yOFQyMToxNzo0OC0wNzowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0wNy0yOFQyMToxNzo0OC0wNzowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowZWRiMWMyYy1mZjhjLWU0NDEtOTMxZi00OTVkNGYxNGM3NjAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MGVkYjFjMmMtZmY4Yy1lNDQxLTkzMWYtNDk1ZDRmMTRjNzYwIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6MGVkYjFjMmMtZmY4Yy1lNDQxLTkzMWYtNDk1ZDRmMTRjNzYwIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDowZWRiMWMyYy1mZjhjLWU0NDEtOTMxZi00OTVkNGYxNGM3NjAiIHN0RXZ0OndoZW49IjIwMTgtMTItMTZUMTY6NTQ6MTctMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE4IChXaW5kb3dzKSIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4/HiGMAAAAtUlEQVRYw+XXrQqAMBQF4D2P2eBL+QIG8RnEJFaNBjEum+0+zMQLtwwv+wV3ZzhhMDgfJ0wUSinxZUQWgKos1JP/AbD4OneIDyQPwCFniA+EJ4CaXm4TxAXCC0BNHgLhAdAnx9hC8PwGSRtAFVMQjF7cNTWED8B1cgwW20yfJgAvrssAsZ1cB3g/xckAxr6FmCDU5N6f488BrpCQ4rQBJkiMYh4ACmLzwOQF0CExinkCsvw7vgGikl+OotaKRwAAAABJRU5ErkJggg==
[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==
[Modrinth]: https://img.shields.io/modrinth/dt/bXX9h73M?logoColor=white&logo=data:image/svg%2bxml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNTEyIDUxNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTUwMy4xNiAzMjMuNTZDNTE0LjU1IDI4MS40NyA1MTUuMzIgMjM1LjkxIDUwMy4yIDE5MC43NkM0NjYuNTcgNTQuMjI5OSAzMjYuMDQgLTI2LjgwMDEgMTg5LjMzIDkuNzc5OTFDODMuODEwMSAzOC4wMTk5IDExLjM4OTkgMTI4LjA3IDAuNjg5OTQxIDIzMC40N0g0My45OUM1NC4yOSAxNDcuMzMgMTEzLjc0IDc0LjcyOTggMTk5Ljc1IDUxLjcwOThDMzA2LjA1IDIzLjI1OTggNDE1LjEzIDgwLjY2OTkgNDUzLjE3IDE4MS4zOEw0MTEuMDMgMTkyLjY1QzM5MS42NCAxNDUuOCAzNTIuNTcgMTExLjQ1IDMwNi4zIDk2LjgxOThMMjk4LjU2IDE0MC42NkMzMzUuMDkgMTU0LjEzIDM2NC43MiAxODQuNSAzNzUuNTYgMjI0LjkxQzM5MS4zNiAyODMuOCAzNjEuOTQgMzQ0LjE0IDMwOC41NiAzNjkuMTdMMzIwLjA5IDQxMi4xNkMzOTAuMjUgMzgzLjIxIDQzMi40IDMxMC4zIDQyMi40MyAyMzUuMTRMNDY0LjQxIDIyMy45MUM0NjguOTEgMjUyLjYyIDQ2Ny4zNSAyODEuMTYgNDYwLjU1IDMwOC4wN0w1MDMuMTYgMzIzLjU2WiIgZmlsbD0iIzMwYjI3YiIvPgogIDxwYXRoIGQ9Ik0zMjEuOTkgNTA0LjIyQzE4NS4yNyA1NDAuOCA0NC43NTAxIDQ1OS43NyA4LjExMDExIDMyMy4yNEMzLjg0MDExIDMwNy4zMSAxLjE3IDI5MS4zMyAwIDI3NS40Nkg0My4yN0M0NC4zNiAyODcuMzcgNDYuNDY5OSAyOTkuMzUgNDkuNjc5OSAzMTEuMjlDNTMuMDM5OSAzMjMuOCA1Ny40NSAzMzUuNzUgNjIuNzkgMzQ3LjA3TDEwMS4zOCAzMjMuOTJDOTguMTI5OSAzMTYuNDIgOTUuMzkgMzA4LjYgOTMuMjEgMzAwLjQ3QzY5LjE3IDIxMC44NyAxMjIuNDEgMTE4Ljc3IDIxMi4xMyA5NC43NjAxQzIyOS4xMyA5MC4yMTAxIDI0Ni4yMyA4OC40NDAxIDI2Mi45MyA4OS4xNTAxTDI1NS4xOSAxMzNDMjQ0LjczIDEzMy4wNSAyMzQuMTEgMTM0LjQyIDIyMy41MyAxMzcuMjVDMTU3LjMxIDE1NC45OCAxMTguMDEgMjIyLjk1IDEzNS43NSAyODkuMDlDMTM2Ljg1IDI5My4xNiAxMzguMTMgMjk3LjEzIDEzOS41OSAzMDAuOTlMMTg4Ljk0IDI3MS4zOEwxNzQuMDcgMjMxLjk1TDIyMC42NyAxODQuMDhMMjc5LjU3IDE3MS4zOUwyOTYuNjIgMTkyLjM4TDI2OS40NyAyMTkuODhMMjQ1Ljc5IDIyNy4zM0wyMjguODcgMjQ0LjcyTDIzNy4xNiAyNjcuNzlDMjM3LjE2IDI2Ny43OSAyNTMuOTUgMjg1LjYzIDI1My45OCAyODUuNjRMMjc3LjcgMjc5LjMzTDI5NC41OCAyNjAuNzlMMzMxLjQ0IDI0OS4xMkwzNDIuNDIgMjczLjgyTDMwNC4zOSAzMjAuNDVMMjQwLjY2IDM0MC42M0wyMTIuMDggMzA4LjgxTDE2Mi4yNiAzMzguN0MxODcuOCAzNjcuNzggMjI2LjIgMzgzLjkzIDI2Ni4wMSAzODAuNTZMMjc3LjU0IDQyMy41NUMyMTguMTMgNDMxLjQxIDE2MC4xIDQwNi44MiAxMjQuMDUgMzYxLjY0TDg1LjYzOTkgMzg0LjY4QzEzNi4yNSA0NTEuMTcgMjIzLjg0IDQ4NC4xMSAzMDkuNjEgNDYxLjE2QzM3MS4zNSA0NDQuNjQgNDE5LjQgNDAyLjU2IDQ0NS40MiAzNDkuMzhMNDg4LjA2IDM2NC44OEM0NTcuMTcgNDMxLjE2IDM5OC4yMiA0ODMuODIgMzIxLjk5IDUwNC4yMloiIGZpbGw9IiMzMGIyN2IiLz4KPC9zdmc+

View File

@@ -1,13 +1,11 @@
plugins { plugins {
id 'fabric-loom' version '0.11-SNAPSHOT' id 'fabric-loom' version '0.12-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 'org.cadixdev.licenser' version '0.6.1'
id 'com.modrinth.minotaur' version '1.2.+' id 'com.modrinth.minotaur' version '1.2.+'
} }
import net.fabricmc.loom.task.RemapJarTask
import com.google.gson.GsonBuilder import com.google.gson.GsonBuilder
import com.google.gson.JsonObject import com.google.gson.JsonObject
import com.modrinth.minotaur.TaskModrinthUpload import com.modrinth.minotaur.TaskModrinthUpload
@@ -41,14 +39,6 @@ String getMCVersionString() {
return version[0] + '.' + version[1] return version[0] + '.' + version[1]
} }
String getTerraformersMCMaven() {
def terraformersUrl = 'https://maven.terraformersmc.com/'
if (pingUrl(terraformersUrl))
return terraformersUrl
else
return 'https://maven.kotlindiscord.com/repository/terraformers/'
}
boolean pingUrl(String address) { boolean pingUrl(String address) {
try { try {
def conn = (HttpURLConnection) new URL(address).openConnection() def conn = (HttpURLConnection) new URL(address).openConnection()
@@ -65,7 +55,6 @@ String parseReadme() {
def readme = (String) file('README.md').text def readme = (String) file('README.md').text
readme = readme.replaceAll(excludeRegex, '') readme = readme.replaceAll(excludeRegex, '')
readme = readme.replaceAll(linkRegex, '![$1](https://raw.githubusercontent.com/LambdAurora/midnightcontrols/1.17/$2)')
return readme return readme
} }
@@ -79,21 +68,16 @@ repositories {
url 'https://maven.gegy.dev' url 'https://maven.gegy.dev'
} }
maven { maven {
name 'CottonMC' name = "CottonMC"
url 'https://server.bbkr.space/artifactory/libs-snapshot' url = "https://server.bbkr.space/artifactory/libs-release"
}
maven {
name 'TerraformersMC'
url getTerraformersMCMaven()
content {
includeGroup 'dev.emi'
includeGroup 'com.terraformersmc'
}
} }
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" }
maven { url 'https://maven.quiltmc.org/repository/release'}
} }
configurations { configurations {
@@ -121,18 +105,30 @@ dependencies {
modImplementation "com.terraformersmc:modmenu:${project.modmenu_version}" modImplementation "com.terraformersmc:modmenu:${project.modmenu_version}"
// Compatibility mods // Compatibility mods
modImplementation("com.github.EnnuiL:okzoomer:e6a801b1a3") {
exclude group: 'com.terraformersmc' // 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.
exclude group: 'dev.lambdaurora' // modImplementation("maven.modrinth:ok-zoomer:${project.ok_zoomer_version}")
} // modImplementation "io.github.ennuil:LibZoomer:${project.libzoomer_version}"
modImplementation "io.github.cottonmc:LibGui:${project.libgui_version}"
modImplementation "org.quiltmc:quilt-json5:1.0.0"
modCompileOnly "maven.modrinth:sodium:${project.sodium_version}"
modImplementation("maven.modrinth:emi:${project.emi_version}")
modImplementation "maven.modrinth:emotecraft:${project.emotecraft_version}" modImplementation "maven.modrinth:emotecraft:${project.emotecraft_version}"
modImplementation "io.github.kosmx:bendy-lib:${project.bendylib_version}" modImplementation "io.github.kosmx:bendy-lib:${project.bendylib_version}"
modImplementation "dev.isxander:yet-another-config-lib:${project.yacl_version}"
modImplementation "maven.modrinth:inventory-tabs-updated:${project.inventorytabs_version}"
// Required for Inventory Tabs
modApi("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}"
shadow 'com.electronwill.night-config:core:3.6.3' shadow 'com.electronwill.night-config:core:3.6.3'
shadow 'com.electronwill.night-config:toml:3.6.3' shadow 'com.electronwill.night-config:toml:3.6.3'
apply plugin: 'java-library'
} }
loom { loom {
accessWidenerPath = file("src/main/resources/midnightcontrols.accesswidener") accessWidenerPath = file("src/main/resources/midnightcontrols.accesswidener")
@@ -159,17 +155,6 @@ processResources {
} }
} }
jar {
from('LICENSE') {
rename { "${it}_${project.archivesBaseName}" }
}
}
license {
header file('HEADER')
include '**/*.java'
}
task publishModrinth(type: TaskModrinthUpload) { task publishModrinth(type: TaskModrinthUpload) {
dependsOn(build) dependsOn(build)
onlyIf { onlyIf {

269
controller_banner.svg Normal file
View File

@@ -0,0 +1,269 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="1920"
height="1080"
viewBox="0 0 1920 1080"
version="1.1"
id="SVGRoot"
sodipodi:docname="controller_banner.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
inkscape:export-filename="/home/martin/Bilder/Bilder/MidnightControlsBanner.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview893"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:document-units="px"
showgrid="true"
inkscape:zoom="0.40120419"
inkscape:cx="928.45492"
inkscape:cy="816.29258"
inkscape:window-width="1920"
inkscape:window-height="1050"
inkscape:window-x="1920"
inkscape:window-y="30"
inkscape:window-maximized="1"
inkscape:current-layer="layer1">
<inkscape:grid
type="xygrid"
id="grid956" />
</sodipodi:namedview>
<defs
id="defs888">
<linearGradient
inkscape:collect="always"
id="linearGradient2059">
<stop
style="stop-color:#ed02a0;stop-opacity:0.72909278"
offset="0"
id="stop2055" />
<stop
style="stop-color:#8900cb;stop-opacity:0.73234183"
offset="1"
id="stop2057" />
</linearGradient>
<inkscape:path-effect
effect="powerclip"
id="path-effect904"
is_visible="true"
lpeversion="1"
inverse="true"
flatten="false"
hide_clip="false"
message="Füllregel Gerade-Ungerade im &lt;b&gt;Füllung und Kontur&lt;/b&gt;-Dialog verwenden, wenn das Anwenden des Ausschnitts mit nachfolgendem Umwandeln in Pfade kein Ergebnis bringt" />
<inkscape:path-effect
effect="powerclip"
id="path-effect900"
is_visible="true"
lpeversion="1"
inverse="true"
flatten="false"
hide_clip="false"
message="Füllregel Gerade-Ungerade im &lt;b&gt;Füllung und Kontur&lt;/b&gt;-Dialog verwenden, wenn das Anwenden des Ausschnitts mit nachfolgendem Umwandeln in Pfade kein Ergebnis bringt" />
<inkscape:path-effect
effect="powerclip"
id="path-effect896"
is_visible="true"
lpeversion="1"
inverse="true"
flatten="false"
hide_clip="false"
message="Füllregel Gerade-Ungerade im &lt;b&gt;Füllung und Kontur&lt;/b&gt;-Dialog verwenden, wenn das Anwenden des Ausschnitts mit nachfolgendem Umwandeln in Pfade kein Ergebnis bringt" />
<rect
x="500"
y="800"
width="840"
height="220"
id="rect7833" />
<linearGradient
inkscape:collect="always"
id="linearGradient1152">
<stop
style="stop-color:#ed02a0;stop-opacity:1"
offset="0"
id="stop1148" />
<stop
style="stop-color:#8900cb;stop-opacity:1"
offset="1"
id="stop1150" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2059"
id="linearGradient1154"
x1="0"
y1="0"
x2="1920"
y2="1080"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient1152"
id="linearGradient4289"
x1="-398"
y1="56"
x2="1522"
y2="1136"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(398,-56)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient1152"
id="linearGradient7579"
x1="-398"
y1="56"
x2="1522"
y2="1136"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(398,-56)" />
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath878">
<path
id="path880"
style="display:none;fill:url(#linearGradient882);stroke-width:1.00028"
d="m 1170.0221,-4.111892 a 21.817197,20.751893 3.393352 0 0 -8.3753,3.68511674 21.817197,20.751893 3.393352 0 0 -4.1775,28.99380526 l 0.2304,0.284584 a 21.817197,20.751893 3.393352 0 0 30.5488,3.770316 21.817197,20.751893 3.393352 0 0 3.9128,-29.0289691 21.817197,20.751893 3.393352 0 0 -22.1392,-7.7048529 z M 858.04762,85.714292 c -7.15183,1.731644 -11.32417,8.932859 -9.35312,16.146398 l 22.2005,81.24794 c 1.97106,7.21354 9.31675,11.62594 16.46858,9.8943 L 1086.714,144.73497 c 7.1518,-1.73163 11.3223,-8.9324 9.3512,-16.14595 l -22.2005,-81.247936 c -1.971,-7.213536 -9.3149,-11.626381 -16.4667,-9.894748 z M 756.02165,124.73884 a 50.906793,48.421082 3.3933293 0 0 -19.54511,8.59585 50.906793,48.421082 3.3933293 0 0 -9.74699,67.65414 l 0.53564,0.66651 a 50.906793,48.421082 3.3933293 0 0 71.28286,8.79621 50.906793,48.421082 3.3933293 0 0 9.13065,-67.73384 50.906793,48.421082 3.3933293 0 0 -51.65705,-17.97887 z M 1139.8366,44.661798 a 21.817197,20.751893 3.393352 0 0 -8.3752,3.685094 21.817197,20.751893 3.393352 0 0 -4.1775,28.993805 l 0.2304,0.284584 a 21.817197,20.751893 3.393352 0 0 30.5487,3.770339 21.817197,20.751893 3.393352 0 0 3.9147,-29.029436 21.817197,20.751893 3.393352 0 0 -22.1411,-7.704386 z m 84.4396,-20.445031 a 21.817197,20.751893 3.393352 0 0 -8.3754,3.685117 21.817197,20.751893 3.393352 0 0 -4.1774,28.993806 l 0.2285,0.285027 a 21.817197,20.751893 3.393352 0 0 30.5488,3.77034 21.817197,20.751893 3.393352 0 0 3.9147,-29.02946 21.817197,20.751893 3.393352 0 0 -22.1392,-7.70483 z M 1193.05,74.672751 a 21.817197,20.751893 3.393352 0 0 -8.3759,3.68321 21.817197,20.751893 3.393352 0 0 -4.1769,28.995709 l 0.2303,0.28458 a 21.817197,20.751893 3.393352 0 0 30.5488,3.77035 21.817197,20.751893 3.393352 0 0 3.9128,-29.029006 21.817197,20.751893 3.393352 0 0 -22.1391,-7.704843 z M 865.52481,226.88685 c -7.36616,1.78355 -11.66248,9.20165 -9.63236,16.63136 l 5.86309,21.45735 -27.90161,6.7557 c -7.15183,1.73165 -11.32229,8.9324 -9.35123,16.14595 l 2.77837,10.1681 c 1.97106,7.21354 9.31487,11.6264 16.46669,9.89476 l 27.90161,-6.75571 6.22966,22.7989 c 2.03012,7.42971 9.59558,11.97577 16.96174,10.19223 l 8.59091,-2.08008 c 7.36616,-1.78354 11.6606,-9.2012 9.63048,-16.63091 l -6.22966,-22.7989 23.68151,-5.73391 c 7.15183,-1.73165 11.32229,-8.93242 9.35123,-16.14595 l -2.77837,-10.16811 c -1.97106,-7.21354 -9.31486,-11.62639 -16.46669,-9.89474 l -23.68151,5.73391 -5.86309,-21.45735 c -2.03012,-7.42971 -9.5937,-11.97623 -16.95987,-10.19269 z m 272.15169,-63.56116 a 50.906793,48.421082 3.3933293 0 0 -19.5432,8.59539 50.906793,48.421082 3.3933293 0 0 -9.747,67.65414 l 0.5356,0.66651 a 50.906793,48.421082 3.3933293 0 0 71.2829,8.79621 50.906793,48.421082 3.3933293 0 0 9.1307,-67.73384 50.906793,48.421082 3.3933293 0 0 -51.659,-17.97841 z" />
<path
id="lpe_path-effect896"
style="fill:url(#linearGradient882);stroke-width:1.00028"
class="powerclip"
d="M 636.0108,56.943474 H 846.95389 V 569.86886 H 636.0108 Z m 534.0113,-61.055366 a 21.817197,20.751893 3.393352 0 0 -8.3753,3.68511674 21.817197,20.751893 3.393352 0 0 -4.1775,28.99380526 l 0.2304,0.284584 a 21.817197,20.751893 3.393352 0 0 30.5488,3.770316 21.817197,20.751893 3.393352 0 0 3.9128,-29.0289691 21.817197,20.751893 3.393352 0 0 -22.1392,-7.7048529 z M 858.04762,85.714292 c -7.15183,1.731644 -11.32417,8.932859 -9.35312,16.146398 l 22.2005,81.24794 c 1.97106,7.21354 9.31675,11.62594 16.46858,9.8943 L 1086.714,144.73497 c 7.1518,-1.73163 11.3223,-8.9324 9.3512,-16.14595 l -22.2005,-81.247936 c -1.971,-7.213536 -9.3149,-11.626381 -16.4667,-9.894748 z M 756.02165,124.73884 a 50.906793,48.421082 3.3933293 0 0 -19.54511,8.59585 50.906793,48.421082 3.3933293 0 0 -9.74699,67.65414 l 0.53564,0.66651 a 50.906793,48.421082 3.3933293 0 0 71.28286,8.79621 50.906793,48.421082 3.3933293 0 0 9.13065,-67.73384 50.906793,48.421082 3.3933293 0 0 -51.65705,-17.97887 z M 1139.8366,44.661798 a 21.817197,20.751893 3.393352 0 0 -8.3752,3.685094 21.817197,20.751893 3.393352 0 0 -4.1775,28.993805 l 0.2304,0.284584 a 21.817197,20.751893 3.393352 0 0 30.5487,3.770339 21.817197,20.751893 3.393352 0 0 3.9147,-29.029436 21.817197,20.751893 3.393352 0 0 -22.1411,-7.704386 z m 84.4396,-20.445031 a 21.817197,20.751893 3.393352 0 0 -8.3754,3.685117 21.817197,20.751893 3.393352 0 0 -4.1774,28.993806 l 0.2285,0.285027 a 21.817197,20.751893 3.393352 0 0 30.5488,3.77034 21.817197,20.751893 3.393352 0 0 3.9147,-29.02946 21.817197,20.751893 3.393352 0 0 -22.1392,-7.70483 z M 1193.05,74.672751 a 21.817197,20.751893 3.393352 0 0 -8.3759,3.68321 21.817197,20.751893 3.393352 0 0 -4.1769,28.995709 l 0.2303,0.28458 a 21.817197,20.751893 3.393352 0 0 30.5488,3.77035 21.817197,20.751893 3.393352 0 0 3.9128,-29.029006 21.817197,20.751893 3.393352 0 0 -22.1391,-7.704843 z M 865.52481,226.88685 c -7.36616,1.78355 -11.66248,9.20165 -9.63236,16.63136 l 5.86309,21.45735 -27.90161,6.7557 c -7.15183,1.73165 -11.32229,8.9324 -9.35123,16.14595 l 2.77837,10.1681 c 1.97106,7.21354 9.31487,11.6264 16.46669,9.89476 l 27.90161,-6.75571 6.22966,22.7989 c 2.03012,7.42971 9.59558,11.97577 16.96174,10.19223 l 8.59091,-2.08008 c 7.36616,-1.78354 11.6606,-9.2012 9.63048,-16.63091 l -6.22966,-22.7989 23.68151,-5.73391 c 7.15183,-1.73165 11.32229,-8.93242 9.35123,-16.14595 l -2.77837,-10.16811 c -1.97106,-7.21354 -9.31486,-11.62639 -16.46669,-9.89474 l -23.68151,5.73391 -5.86309,-21.45735 c -2.03012,-7.42971 -9.5937,-11.97623 -16.95987,-10.19269 z m 272.15169,-63.56116 a 50.906793,48.421082 3.3933293 0 0 -19.5432,8.59539 50.906793,48.421082 3.3933293 0 0 -9.747,67.65414 l 0.5356,0.66651 a 50.906793,48.421082 3.3933293 0 0 71.2829,8.79621 50.906793,48.421082 3.3933293 0 0 9.1307,-67.73384 50.906793,48.421082 3.3933293 0 0 -51.659,-17.97841 z" />
</clipPath>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient1152"
id="linearGradient882"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.96459266,-0.23355313,0.26584317,0.97291549,369.02066,-147.43741)"
x1="-398"
y1="56"
x2="1522"
y2="1136" />
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath884">
<path
id="path886"
style="display:none;fill:url(#linearGradient888);stroke-width:1.00027"
d="m 1026.6374,528.82806 a 20.752793,21.815894 86.926601 0 0 -9.2243,-0.58528 20.752793,21.815894 86.926601 0 0 -18.53105,23.48045 l 0.0557,0.35396 a 20.752793,21.815894 86.926601 0 0 24.81605,17.20206 20.752793,21.815894 86.926601 0 0 18.3173,-23.63171 20.752793,21.815894 86.926601 0 0 -15.4337,-16.81948 z M 707.37883,465.4963 c -7.15078,-1.7386 -14.49832,2.66675 -16.47273,9.87849 l -22.23828,81.2277 c -1.97441,7.21175 2.19438,14.41711 9.34515,16.15571 l 199.32113,48.46175 c 7.15073,1.73859 14.49643,-2.66722 16.47084,-9.87896 l 22.23828,-81.2277 c 1.97441,-7.21174 -2.19254,-14.41666 -9.34327,-16.15524 z M 598.02135,453.23104 a 48.423182,50.903752 86.926623 0 0 -21.5241,-1.36927 48.423182,50.903752 86.926623 0 0 -43.23978,54.7896 l 0.12713,0.82721 a 48.423182,50.903752 86.926623 0 0 57.90649,40.13811 48.423182,50.903752 86.926623 0 0 42.74098,-55.13985 48.423182,50.903752 86.926623 0 0 -36.01072,-39.2458 z m 377.16446,104.5578 a 20.752793,21.815894 86.926601 0 0 -9.22414,-0.58526 20.752793,21.815894 86.926601 0 0 -18.53108,23.48045 l 0.0557,0.35396 a 20.752793,21.815894 86.926601 0 0 24.8159,17.20204 20.752793,21.815894 86.926601 0 0 18.31921,-23.63124 20.752793,21.815894 86.926601 0 0 -15.43563,-16.81995 z m 84.42719,20.52712 a 20.752793,21.815894 86.926601 0 0 -9.2243,-0.58529 20.752793,21.815894 86.926601 0 0 -18.531,23.48045 l 0.054,0.35352 a 20.752793,21.815894 86.926601 0 0 24.8159,17.20204 20.752793,21.815894 86.926601 0 0 18.3193,-23.63122 20.752793,21.815894 86.926601 0 0 -15.4338,-16.8195 z m -53.2258,29.9599 a 20.752793,21.815894 86.926601 0 0 -9.22373,-0.58718 20.752793,21.815894 86.926601 0 0 -18.53161,23.48235 l 0.0557,0.35395 a 20.752793,21.815894 86.926601 0 0 24.81584,17.20205 20.752793,21.815894 86.926601 0 0 18.3174,-23.63169 20.752793,21.815894 86.926601 0 0 -15.4337,-16.81948 z M 641.50831,592.48259 c -7.36508,-1.79069 -14.93245,2.74811 -16.96603,10.17597 l -5.87307,21.452 -27.8975,-6.78283 c -7.15078,-1.7386 -14.49644,2.6672 -16.47085,9.87895 l -2.7831,10.16557 c -1.97441,7.21174 2.1925,14.41666 9.34328,16.15525 l 27.8975,6.78284 -6.24026,22.79322 c -2.03358,7.42786 2.25909,14.85024 9.62417,16.64094 l 8.58964,2.08844 c 7.36508,1.7907 14.93057,-2.74856 16.96415,-10.17642 l 6.24026,-22.79322 23.67803,5.75693 c 7.15078,1.7386 14.49644,-2.66722 16.47085,-9.87896 l 2.7831,-10.16557 c 1.97441,-7.21175 -2.1925,-14.41665 -9.34328,-16.15525 l -23.67803,-5.75693 5.87307,-21.45201 c 2.03358,-7.42785 -2.25721,-14.84978 -9.62229,-16.64048 z m 270.91446,68.20272 a 48.423182,50.903752 86.926623 0 0 -21.52221,-1.3688 48.423182,50.903752 86.926623 0 0 -43.23975,54.78961 l 0.12708,0.8272 a 48.423182,50.903752 86.926623 0 0 57.90652,40.13811 48.423182,50.903752 86.926623 0 0 42.74097,-55.13984 48.423182,50.903752 86.926623 0 0 -36.01261,-39.24628 z" />
<path
id="lpe_path-effect900"
style="fill:url(#linearGradient888);stroke-width:1.00027"
class="powerclip"
d="M 912.35657,483.93158 H 1121.6656 V 998.54486 H 912.35657 Z m 114.28083,44.89648 a 20.752793,21.815894 86.926601 0 0 -9.2243,-0.58528 20.752793,21.815894 86.926601 0 0 -18.53105,23.48045 l 0.0557,0.35396 a 20.752793,21.815894 86.926601 0 0 24.81605,17.20206 20.752793,21.815894 86.926601 0 0 18.3173,-23.63171 20.752793,21.815894 86.926601 0 0 -15.4337,-16.81948 z M 707.37883,465.4963 c -7.15078,-1.7386 -14.49832,2.66675 -16.47273,9.87849 l -22.23828,81.2277 c -1.97441,7.21175 2.19438,14.41711 9.34515,16.15571 l 199.32113,48.46175 c 7.15073,1.73859 14.49643,-2.66722 16.47084,-9.87896 l 22.23828,-81.2277 c 1.97441,-7.21174 -2.19254,-14.41666 -9.34327,-16.15524 z M 598.02135,453.23104 a 48.423182,50.903752 86.926623 0 0 -21.5241,-1.36927 48.423182,50.903752 86.926623 0 0 -43.23978,54.7896 l 0.12713,0.82721 a 48.423182,50.903752 86.926623 0 0 57.90649,40.13811 48.423182,50.903752 86.926623 0 0 42.74098,-55.13985 48.423182,50.903752 86.926623 0 0 -36.01072,-39.2458 z m 377.16446,104.5578 a 20.752793,21.815894 86.926601 0 0 -9.22414,-0.58526 20.752793,21.815894 86.926601 0 0 -18.53108,23.48045 l 0.0557,0.35396 a 20.752793,21.815894 86.926601 0 0 24.8159,17.20204 20.752793,21.815894 86.926601 0 0 18.31921,-23.63124 20.752793,21.815894 86.926601 0 0 -15.43563,-16.81995 z m 84.42719,20.52712 a 20.752793,21.815894 86.926601 0 0 -9.2243,-0.58529 20.752793,21.815894 86.926601 0 0 -18.531,23.48045 l 0.054,0.35352 a 20.752793,21.815894 86.926601 0 0 24.8159,17.20204 20.752793,21.815894 86.926601 0 0 18.3193,-23.63122 20.752793,21.815894 86.926601 0 0 -15.4338,-16.8195 z m -53.2258,29.9599 a 20.752793,21.815894 86.926601 0 0 -9.22373,-0.58718 20.752793,21.815894 86.926601 0 0 -18.53161,23.48235 l 0.0557,0.35395 a 20.752793,21.815894 86.926601 0 0 24.81584,17.20205 20.752793,21.815894 86.926601 0 0 18.3174,-23.63169 20.752793,21.815894 86.926601 0 0 -15.4337,-16.81948 z M 641.50831,592.48259 c -7.36508,-1.79069 -14.93245,2.74811 -16.96603,10.17597 l -5.87307,21.452 -27.8975,-6.78283 c -7.15078,-1.7386 -14.49644,2.6672 -16.47085,9.87895 l -2.7831,10.16557 c -1.97441,7.21174 2.1925,14.41666 9.34328,16.15525 l 27.8975,6.78284 -6.24026,22.79322 c -2.03358,7.42786 2.25909,14.85024 9.62417,16.64094 l 8.58964,2.08844 c 7.36508,1.7907 14.93057,-2.74856 16.96415,-10.17642 l 6.24026,-22.79322 23.67803,5.75693 c 7.15078,1.7386 14.49644,-2.66722 16.47085,-9.87896 l 2.7831,-10.16557 c 1.97441,-7.21175 -2.1925,-14.41665 -9.34328,-16.15525 l -23.67803,-5.75693 5.87307,-21.45201 c 2.03358,-7.42785 -2.25721,-14.84978 -9.62229,-16.64048 z m 270.91446,68.20272 a 48.423182,50.903752 86.926623 0 0 -21.52221,-1.3688 48.423182,50.903752 86.926623 0 0 -43.23975,54.78961 l 0.12708,0.8272 a 48.423182,50.903752 86.926623 0 0 57.90652,40.13811 48.423182,50.903752 86.926623 0 0 42.74097,-55.13984 48.423182,50.903752 86.926623 0 0 -36.01261,-39.24628 z" />
</clipPath>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient1152"
id="linearGradient888"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.96445087,0.23449084,-0.26629564,0.97267307,398.764,38.857662)"
x1="-398"
y1="56"
x2="1522"
y2="1136" />
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath890">
<path
id="path892"
style="display:none;fill:url(#linearGradient894)"
d="m 1138.793,269.14648 a 21.88452,20.676565 0 0 0 -9.1231,1.59766 21.88452,20.676565 0 0 0 -11.7656,26.97656 l 0.1484,0.32813 a 21.88452,20.676565 0 0 0 28.7032,10.76562 21.88452,20.676565 0 0 0 11.5175,-27.07226 21.88452,20.676565 0 0 0 -19.4804,-12.59571 z m -327.22269,13.7754 c -7.41435,0 -13.38476,5.96846 -13.38476,13.38281 v 83.50976 c 0,7.41436 5.97041,13.38282 13.38476,13.38282 h 206.66799 c 7.4143,0 13.3828,-5.96846 13.3828,-13.38282 v -83.50976 c 0,-7.41435 -5.9685,-13.38281 -13.3828,-13.38281 z m -109.57617,13.80664 a 51.063881,48.245316 0 0 0 -21.28906,3.7246 51.063881,48.245316 0 0 0 -27.45313,62.94727 l 0.34375,0.76758 a 51.063881,48.245316 0 0 0 66.97657,25.11914 51.063881,48.245316 0 0 0 26.875,-63.16797 51.063881,48.245316 0 0 0 -45.45313,-29.39062 z m 394.48826,12.39257 a 21.88452,20.676565 0 0 0 -9.123,1.59766 21.88452,20.676565 0 0 0 -11.7656,26.97656 l 0.1484,0.32813 a 21.88452,20.676565 0 0 0 28.7031,10.76562 21.88452,20.676565 0 0 0 11.5195,-27.07226 21.88452,20.676565 0 0 0 -19.4824,-12.59571 z m 87.5391,0 a 21.88452,20.676565 0 0 0 -9.1231,1.59766 21.88452,20.676565 0 0 0 -11.7656,26.97656 l 0.1465,0.32813 a 21.88452,20.676565 0 0 0 28.7031,10.76562 21.88452,20.676565 0 0 0 11.5196,-27.07226 21.88452,20.676565 0 0 0 -19.4805,-12.59571 z m -43.7695,41.35352 a 21.88452,20.676565 0 0 0 -9.1231,1.5957 21.88452,20.676565 0 0 0 -11.7656,26.97852 l 0.1484,0.32812 a 21.88452,20.676565 0 0 0 28.7031,10.76563 21.88452,20.676565 0 0 0 11.5176,-27.07227 21.88452,20.676565 0 0 0 -19.4804,-12.5957 z m -358.91997,70.29101 c -7.63655,10e-6 -13.78515,6.14862 -13.78515,13.78516 v 22.05469 h -28.92579 c -7.41435,0 -13.38281,5.96845 -13.38281,13.38281 v 10.45117 c 0,7.41435 5.96846,13.38282 13.38281,13.38282 h 28.92579 v 23.43359 c 0,7.63654 6.1486,13.78516 13.78515,13.78516 h 8.90625 c 7.63655,0 13.7832,-6.14862 13.7832,-13.78516 v -23.43359 h 24.55079 c 7.41435,0 13.38281,-5.96847 13.38281,-13.38282 v -10.45117 c 0,-7.41436 -5.96846,-13.38281 -13.38281,-13.38281 h -24.55079 v -22.05469 c 0,-7.63654 -6.14665,-13.78516 -13.7832,-13.78516 z m 281.52147,2.25 a 51.063881,48.245316 0 0 0 -21.2871,3.72461 51.063881,48.245316 0 0 0 -27.4531,62.94727 l 0.3437,0.76758 a 51.063881,48.245316 0 0 0 66.9766,25.11914 51.063881,48.245316 0 0 0 26.875,-63.16797 51.063881,48.245316 0 0 0 -45.4551,-29.39063 z" />
<path
id="lpe_path-effect904"
style="fill:url(#linearGradient894)"
class="powerclip"
d="M 571.42297,222.78436 H 1252.5483 V 563.60941 H 571.42297 Z m 567.37003,46.36212 a 21.88452,20.676565 0 0 0 -9.1231,1.59766 21.88452,20.676565 0 0 0 -11.7656,26.97656 l 0.1484,0.32813 a 21.88452,20.676565 0 0 0 28.7032,10.76562 21.88452,20.676565 0 0 0 11.5175,-27.07226 21.88452,20.676565 0 0 0 -19.4804,-12.59571 z m -327.22269,13.7754 c -7.41435,0 -13.38476,5.96846 -13.38476,13.38281 v 83.50976 c 0,7.41436 5.97041,13.38282 13.38476,13.38282 h 206.66799 c 7.4143,0 13.3828,-5.96846 13.3828,-13.38282 v -83.50976 c 0,-7.41435 -5.9685,-13.38281 -13.3828,-13.38281 z m -109.57617,13.80664 a 51.063881,48.245316 0 0 0 -21.28906,3.7246 51.063881,48.245316 0 0 0 -27.45313,62.94727 l 0.34375,0.76758 a 51.063881,48.245316 0 0 0 66.97657,25.11914 51.063881,48.245316 0 0 0 26.875,-63.16797 51.063881,48.245316 0 0 0 -45.45313,-29.39062 z m 394.48826,12.39257 a 21.88452,20.676565 0 0 0 -9.123,1.59766 21.88452,20.676565 0 0 0 -11.7656,26.97656 l 0.1484,0.32813 a 21.88452,20.676565 0 0 0 28.7031,10.76562 21.88452,20.676565 0 0 0 11.5195,-27.07226 21.88452,20.676565 0 0 0 -19.4824,-12.59571 z m 87.5391,0 a 21.88452,20.676565 0 0 0 -9.1231,1.59766 21.88452,20.676565 0 0 0 -11.7656,26.97656 l 0.1465,0.32813 a 21.88452,20.676565 0 0 0 28.7031,10.76562 21.88452,20.676565 0 0 0 11.5196,-27.07226 21.88452,20.676565 0 0 0 -19.4805,-12.59571 z m -43.7695,41.35352 a 21.88452,20.676565 0 0 0 -9.1231,1.5957 21.88452,20.676565 0 0 0 -11.7656,26.97852 l 0.1484,0.32812 a 21.88452,20.676565 0 0 0 28.7031,10.76563 21.88452,20.676565 0 0 0 11.5176,-27.07227 21.88452,20.676565 0 0 0 -19.4804,-12.5957 z m -358.91997,70.29101 c -7.63655,10e-6 -13.78515,6.14862 -13.78515,13.78516 v 22.05469 h -28.92579 c -7.41435,0 -13.38281,5.96845 -13.38281,13.38281 v 10.45117 c 0,7.41435 5.96846,13.38282 13.38281,13.38282 h 28.92579 v 23.43359 c 0,7.63654 6.1486,13.78516 13.78515,13.78516 h 8.90625 c 7.63655,0 13.7832,-6.14862 13.7832,-13.78516 v -23.43359 h 24.55079 c 7.41435,0 13.38281,-5.96847 13.38281,-13.38282 v -10.45117 c 0,-7.41436 -5.96846,-13.38281 -13.38281,-13.38281 h -24.55079 v -22.05469 c 0,-7.63654 -6.14665,-13.78516 -13.7832,-13.78516 z m 281.52147,2.25 a 51.063881,48.245316 0 0 0 -21.2871,3.72461 51.063881,48.245316 0 0 0 -27.4531,62.94727 l 0.3437,0.76758 a 51.063881,48.245316 0 0 0 66.9766,25.11914 51.063881,48.245316 0 0 0 26.875,-63.16797 51.063881,48.245316 0 0 0 -45.4551,-29.39063 z" />
</clipPath>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient1152"
id="linearGradient894"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(398,-56)"
x1="-398"
y1="56"
x2="1522"
y2="1136" />
</defs>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1">
<rect
style="fill:url(#linearGradient1154);fill-opacity:1"
id="rect1033"
width="1920"
height="1080"
x="0"
y="0"
rx="0"
ry="0" />
<path
style="fill:#ffffff;fill-opacity:1;stroke-width:1.41813"
id="rect2078"
width="671.12531"
height="330.82504"
x="576.42297"
y="227.78436"
ry="110.27502"
sodipodi:type="rect"
clip-path="url(#clipPath890)"
inkscape:path-effect="#path-effect904"
d="m 686.69799,227.78436 h 450.57531 c 61.0923,0 110.275,49.18266 110.275,110.27502 v 110.27501 c 0,61.09236 -49.1827,110.27502 -110.275,110.27502 H 686.69799 c -61.09236,0 -110.27502,-49.18266 -110.27502,-110.27502 V 338.05938 c 0,-61.09236 49.18266,-110.27502 110.27502,-110.27502 z" />
<path
style="fill:#ffffff;fill-opacity:1;stroke-width:1.41852"
id="rect2146"
width="199.30905"
height="504.61328"
x="917.35657"
y="488.93158"
ry="97.030388"
transform="matrix(0.97214881,-0.23436445,0.26615211,0.96393104,0,0)"
sodipodi:type="rect"
clip-path="url(#clipPath884)"
inkscape:path-effect="#path-effect900"
d="m 1014.387,488.93158 h 5.2482 c 53.7549,0 97.0304,43.27555 97.0304,97.03039 v 310.5525 c 0,53.75484 -43.2755,97.03039 -97.0304,97.03039 h -5.2482 c -53.75488,0 -97.03043,-43.27555 -97.03043,-97.03039 v -310.5525 c 0,-53.75484 43.27555,-97.03039 97.03043,-97.03039 z" />
<path
style="fill:#ffffff;fill-opacity:1;stroke-width:1.41852"
id="rect2146-3"
width="200.94308"
height="502.92538"
x="641.0108"
y="61.943474"
ry="97.050156"
transform="matrix(0.97237519,0.23342343,-0.26569554,0.96405699,0,0)"
sodipodi:type="rect"
clip-path="url(#clipPath878)"
inkscape:path-effect="#path-effect896"
d="m 738.06096,61.943474 h 6.84277 c 53.76579,0 97.05016,43.284366 97.05016,97.050156 V 467.8187 c 0,53.76579 -43.28437,97.05016 -97.05016,97.05016 h -6.84277 c -53.76579,0 -97.05016,-43.28437 -97.05016,-97.05016 V 158.99363 c 0,-53.76579 43.28437,-97.050156 97.05016,-97.050156 z" />
<rect
style="fill:#ffffff;fill-opacity:1;stroke-width:1.41813"
id="rect2384"
width="87.538078"
height="55.137505"
x="649.37134"
y="214"
ry="27.568752" />
<rect
style="fill:#ffffff;fill-opacity:1;stroke-width:1.41813"
id="rect2384-6"
width="87.538078"
height="55.137505"
x="1089.9797"
y="214"
ry="27.568752" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -3,21 +3,31 @@ 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.18.1 minecraft_version=1.19.2
yarn_mappings=1.18.1+build.22 yarn_mappings=1.19.2+build.9
loader_version=0.13.3 loader_version=0.14.9
# Mod Properties # Mod Properties
mod_version = 0.1.0 mod_version = 1.6.0
maven_group = eu.midnightdust maven_group = eu.midnightdust
archives_base_name = midnightcontrols archives_base_name = midnightcontrols
modrinth_id=W1D3UXEc modrinth_id=bXX9h73M
# 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.46.6+1.18 fabric_version=0.60.0+1.19.2
spruceui_version=3.3.2+1.17 sodium_version=mc1.19.2-0.4.4
midnightlib_version=0.4.0 spruceui_version=4.0.0+1.19
modmenu_version=2.0.2 midnightlib_version=0.6.1
emotecraft_version=2.1-MC1.18.1-fabric modmenu_version=4.0.6
emotecraft_version=2.1.3-SNAPSHOT-build.29-MC1.19-fabric
bendylib_version=2.0.+ bendylib_version=2.0.+
emi_version=0.4.0+1.19
libgui_version=6.0.0+1.19
inventorytabs_version=inventorytabs-0.9.beta-1.19.x
clothconfig_version=7.0.72
yacl_version=0.1.2
# 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
# libzoomer_version=0.3.0+1.17.1

BIN
icon.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 184 KiB

View File

@@ -24,7 +24,8 @@ import java.util.Optional;
*/ */
public enum ControlsMode implements Nameable { public enum ControlsMode implements Nameable {
DEFAULT, DEFAULT,
CONTROLLER; CONTROLLER,
TOUCHSCREEN;
/** /**
* Returns the next controls mode available. * Returns the next controls mode available.

View File

@@ -9,6 +9,7 @@
package eu.midnightdust.midnightcontrols; package eu.midnightdust.midnightcontrols;
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
import eu.midnightdust.midnightcontrols.event.PlayerChangeControlsModeCallback; import eu.midnightdust.midnightcontrols.event.PlayerChangeControlsModeCallback;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
import net.fabricmc.api.ModInitializer; import net.fabricmc.api.ModInitializer;
@@ -16,7 +17,6 @@ import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.ModContainer;
import net.minecraft.network.PacketByteBuf; import net.minecraft.network.PacketByteBuf;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Identifier; 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;
@@ -26,10 +26,10 @@ import java.util.Objects;
import java.util.Optional; import java.util.Optional;
/** /**
* Represents the midnightcontrols mod. * Represents the MidnightControls mod.
* *
* @author LambdAurora * @author LambdAurora & Motschen
* @version 1.7.0 * @version 1.8.0
* @since 1.0.0 * @since 1.0.0
*/ */
public class MidnightControls implements ModInitializer { public class MidnightControls implements ModInitializer {
@@ -37,15 +37,15 @@ public class MidnightControls implements ModInitializer {
public static final Identifier CONTROLS_MODE_CHANNEL = new Identifier(MidnightControlsConstants.CONTROLS_MODE_CHANNEL.toString()); public static final Identifier CONTROLS_MODE_CHANNEL = new Identifier(MidnightControlsConstants.CONTROLS_MODE_CHANNEL.toString());
public static final Identifier FEATURE_CHANNEL = new Identifier(MidnightControlsConstants.FEATURE_CHANNEL.toString()); public static final Identifier FEATURE_CHANNEL = new Identifier(MidnightControlsConstants.FEATURE_CHANNEL.toString());
public static final Identifier HELLO_CHANNEL = new Identifier(MidnightControlsConstants.HELLO_CHANNEL.toString()); public static final Identifier HELLO_CHANNEL = new Identifier(MidnightControlsConstants.HELLO_CHANNEL.toString());
public static boolean isExtrasLoaded;
public static final TranslatableText NOT_BOUND_TEXT = new TranslatableText("midnightcontrols.not_bound"); public final Logger logger = LogManager.getLogger("MidnightControls");
public final Logger logger = LogManager.getLogger("midnightcontrols");
@Override @Override
public void onInitialize() { public void onInitialize() {
INSTANCE = this; INSTANCE = this;
this.log("Initializing midnightcontrols..."); isExtrasLoaded = FabricLoader.getInstance().isModLoaded("midnightcontrols-extra");
this.log("Initializing MidnightControls...");
ServerPlayNetworking.registerGlobalReceiver(HELLO_CHANNEL, (server, player, handler, buf, responseSender) -> { ServerPlayNetworking.registerGlobalReceiver(HELLO_CHANNEL, (server, player, handler, buf, responseSender) -> {
String version = buf.readString(32); String version = buf.readString(32);
@@ -68,7 +68,7 @@ public class MidnightControls implements ModInitializer {
* @param info the message to print * @param info the message to print
*/ */
public void log(String info) { public void log(String info) {
this.logger.info("[midnightcontrols] " + info); this.logger.info("[MidnightControls] " + info);
} }
/** /**
@@ -77,7 +77,7 @@ public class MidnightControls implements ModInitializer {
* @param warning the warning to print * @param warning the warning to print
*/ */
public void warn(String warning) { public void warn(String warning) {
this.logger.info("[midnightcontrols] " + warning); this.logger.info("[MidnightControls] " + warning);
} }
/** /**
@@ -119,9 +119,9 @@ public class MidnightControls implements ModInitializer {
} }
/** /**
* Gets the midnightcontrols instance. * Gets the MidnightControls instance.
* *
* @return the midnightcontrols instance * @return the MidnightControls instance
*/ */
public static MidnightControls get() { public static MidnightControls get() {
return INSTANCE; return INSTANCE;

View File

@@ -13,7 +13,7 @@ package eu.midnightdust.midnightcontrols;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
/** /**
* Represents the constants used by midnightcontrols. * Represents the constants used by MidnightControls.
* *
* @author LambdAurora * @author LambdAurora
* @version 1.1.0 * @version 1.1.0
@@ -23,5 +23,5 @@ public class MidnightControlsConstants {
public static final String NAMESPACE = "midnightcontrols"; public static final String NAMESPACE = "midnightcontrols";
public static final Identifier CONTROLS_MODE_CHANNEL = new Identifier(NAMESPACE, "controls_mode"); public static final Identifier CONTROLS_MODE_CHANNEL = new Identifier(NAMESPACE, "controls_mode");
public static final Identifier FEATURE_CHANNEL = new Identifier(NAMESPACE, "feature"); public static final Identifier FEATURE_CHANNEL = new Identifier(NAMESPACE, "feature");
public static final Identifier HELLO_CHANNEL = new Identifier(NAMESPACE, "hello"); public static final Identifier HELLO_CHANNEL = new Identifier("lambdacontrols", "hello");
} }

View File

@@ -61,7 +61,7 @@ public class MidnightControlsFeature implements Nameable {
* @return {@code true} if this feature is allowed, else {@code false} * @return {@code true} if this feature is allowed, else {@code false}
*/ */
public boolean isAllowed() { public boolean isAllowed() {
return this.allowed; return MidnightControls.isExtrasLoaded && this.allowed;
} }
/** /**
@@ -98,6 +98,15 @@ public class MidnightControlsFeature implements Nameable {
this.enabled = enabled; this.enabled = enabled;
} }
/**
* Refreshes the enabled values from the config.
*/
public static void refreshEnabled() {
MidnightControlsFeature.VERTICAL_REACHAROUND.setEnabled(MidnightControlsConfig.verticalReacharound);
MidnightControlsFeature.FAST_BLOCK_PLACING.setEnabled(MidnightControlsConfig.fastBlockPlacing);
MidnightControlsFeature.HORIZONTAL_REACHAROUND.setEnabled(MidnightControlsConfig.horizontalReacharound);
}
/** /**
* Returns whether this feature is available or not. * Returns whether this feature is available or not.
* *

View File

@@ -9,9 +9,7 @@
package eu.midnightdust.midnightcontrols.client; package eu.midnightdust.midnightcontrols.client;
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;
@@ -26,22 +24,22 @@ import java.util.Optional;
* @since 1.0.0 * @since 1.0.0
*/ */
public enum ControllerType implements Nameable { public enum ControllerType implements Nameable {
DEFAULT(0, new LiteralText("Default")), DEFAULT(0),
DUALSHOCK(1, new LiteralText("Dualshock")), DUALSHOCK(1),
DUALSENSE(2, new LiteralText("Dualsense")), DUALSENSE(2),
SWITCH(3, new LiteralText("Switch")), SWITCH(3),
XBOX_360(4, new LiteralText("Xbox 360")), XBOX_360(4),
XBOX(5, new LiteralText("Xbox")), XBOX(5),
STEAM_DECK(6, new LiteralText("Steam Deck")), STEAM_DECK(6),
STEAM_CONTROLLER(7, new LiteralText("Steam Controller")), STEAM_CONTROLLER(7),
OUYA(8, new LiteralText("Ouya")); OUYA(8);
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 = new TranslatableText("midnightcontrols.controller_type." + this.getName()); this.text = Text.translatable("midnightcontrols.controller_type." + this.getName());
} }
ControllerType(int id, @NotNull Text text) { ControllerType(int id, @NotNull Text text) {

View File

@@ -10,7 +10,6 @@
package eu.midnightdust.midnightcontrols.client; 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;
@@ -31,7 +30,7 @@ public enum HudSide implements Nameable {
private final Text text; private final Text text;
HudSide() { HudSide() {
this.text = new TranslatableText(this.getTranslationKey()); this.text = Text.translatable(this.getTranslationKey());
} }
/** /**

View File

@@ -16,11 +16,14 @@ import eu.midnightdust.midnightcontrols.MidnightControlsConstants;
import eu.midnightdust.midnightcontrols.MidnightControlsFeature; import eu.midnightdust.midnightcontrols.MidnightControlsFeature;
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.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.ring.KeyBindingRingAction; import eu.midnightdust.midnightcontrols.client.mixin.KeyBindingRegistryImplAccessor;
import eu.midnightdust.midnightcontrols.client.ring.ButtonBindingRingAction;
import eu.midnightdust.midnightcontrols.client.ring.MidnightRing; import eu.midnightdust.midnightcontrols.client.ring.MidnightRing;
import dev.lambdaurora.spruceui.hud.HudManager; import dev.lambdaurora.spruceui.hud.HudManager;
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ClientModInitializer;
@@ -28,18 +31,22 @@ 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;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.resource.ResourceManagerHelper;
import net.fabricmc.fabric.api.resource.ResourcePackActivationType;
import net.fabricmc.loader.api.FabricLoader;
import net.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.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.Timer;
import java.util.TimerTask;
/** /**
* Represents the midnightcontrols client mod. * Represents the midnightcontrols client mod.
@@ -49,6 +56,7 @@ import java.io.File;
* @since 1.1.0 * @since 1.1.0
*/ */
public class MidnightControlsClient extends MidnightControls implements ClientModInitializer { public class MidnightControlsClient extends MidnightControls implements ClientModInitializer {
public static boolean lateInitDone = false;
private static MidnightControlsClient INSTANCE; private static MidnightControlsClient INSTANCE;
public static final KeyBinding BINDING_LOOK_UP = InputManager.makeKeyBinding(new Identifier(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");
@@ -58,13 +66,13 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
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(new Identifier(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(new Identifier(midnightcontrolsConstants.NAMESPACE, "ring"), public static final KeyBinding BINDING_RING = InputManager.makeKeyBinding(new Identifier(MidnightControlsConstants.NAMESPACE, "ring"),
InputUtil.Type.MOUSE, GLFW.GLFW_MOUSE_BUTTON_5, "key.categories.misc");*/ InputUtil.Type.KEYSYM, InputUtil.UNKNOWN_KEY.getCode(), "key.categories.misc");
public static final Identifier CONTROLLER_BUTTONS = new Identifier(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 = new Identifier(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 = new Identifier(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 = new Identifier(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/gamecontrollerdb.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);
public final MidnightReacharound reacharound = new MidnightReacharound(); public final MidnightReacharound reacharound = new MidnightReacharound();
@@ -78,13 +86,12 @@ 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("keybinding", KeyBindingRingAction.FACTORY); this.ring.registerAction("buttonbinding", ButtonBindingRingAction.FACTORY);
ClientPlayNetworking.registerGlobalReceiver(CONTROLS_MODE_CHANNEL, (client, handler, buf, responseSender) -> { ClientPlayNetworking.registerGlobalReceiver(CONTROLS_MODE_CHANNEL, (client, handler, buf, responseSender) ->
responseSender.sendPacket(CONTROLS_MODE_CHANNEL, this.makeControlsModeBuffer(MidnightControlsConfig.controlsMode)); responseSender.sendPacket(CONTROLS_MODE_CHANNEL, this.makeControlsModeBuffer(MidnightControlsConfig.controlsMode)));
});
ClientPlayNetworking.registerGlobalReceiver(FEATURE_CHANNEL, (client, handler, buf, responseSender) -> { ClientPlayNetworking.registerGlobalReceiver(FEATURE_CHANNEL, (client, handler, buf, responseSender) -> {
int features = buf.readVarInt(); int features = buf.readVarInt();
for (int i = 0; i < features; i++) { for (int i = 0; i < features; i++) {
@@ -100,20 +107,32 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
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.END_CLIENT_TICK.register(this::onTick); ClientTickEvents.START_CLIENT_TICK.register(this::onTick);
OpenScreenCallback.EVENT.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());
// client.skipGameRender = false; client.skipGameRender = false;
// client.currentScreen = screen; client.currentScreen = screen;
// } else if (screen != null) { } else if (screen != null) {
this.input.onScreenOpen(client, client.getWindow().getWidth(), client.getWindow().getHeight()); this.input.onScreenOpen(client, client.getWindow().getWidth(), client.getWindow().getHeight());
//} }
}); });
HudManager.register(this.hud = new MidnightControlsHud(this)); HudManager.register(this.hud = new MidnightControlsHud(this));
FabricLoader.getInstance().getModContainer("midnightcontrols").ifPresent(modContainer -> {
ResourceManagerHelper.registerBuiltinResourcePack(new Identifier("midnightcontrols","bedrock"), modContainer, ResourcePackActivationType.NORMAL);
ResourceManagerHelper.registerBuiltinResourcePack(new Identifier("midnightcontrols","legacy"), modContainer, ResourcePackActivationType.NORMAL);
});
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(MinecraftClient.getInstance());
}
}, delay, period);
} }
/** /**
@@ -127,10 +146,10 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
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.TUTORIAL_HINT, 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.TUTORIAL_HINT, Text.translatable("midnightcontrols.controller.disconnected", jid),
null)); null));
} }
@@ -139,6 +158,35 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
MidnightControlsCompat.init(this); MidnightControlsCompat.init(this);
} }
ButtonCategory category;
/**
* This method is called to initialize keybindings
*/
public void initKeybindings() {
if (lateInitDone) return;
if (KeyBindingRegistryImplAccessor.getModdedKeyBindings() == null || KeyBindingRegistryImplAccessor.getModdedKeyBindings().isEmpty()) return;
for (int i = 0; i < KeyBindingRegistryImplAccessor.getModdedKeyBindings().size(); ++i) {
KeyBinding keyBinding = KeyBindingRegistryImplAccessor.getModdedKeyBindings().get(i);
if (!keyBinding.getTranslationKey().contains("midnightcontrols") && !keyBinding.getTranslationKey().contains("ok_zoomer") && !keyBinding.getTranslationKey().contains("okzoomer")) {
category = null;
InputManager.streamCategories().forEach(buttonCategory -> {
if (buttonCategory.getIdentifier().equals(new org.aperlambda.lambdacommon.Identifier("minecraft", keyBinding.getCategory())))
category = buttonCategory;
});
if (category == null) {
category = new ButtonCategory(new org.aperlambda.lambdacommon.Identifier("minecraft", keyBinding.getCategory()));
InputManager.registerCategory(category);
}
ButtonBinding buttonBinding = new ButtonBinding.Builder(keyBinding.getTranslationKey()).category(category).linkKeybind(keyBinding).register();
if (MidnightControlsConfig.debug) {
logger.info(keyBinding.getTranslationKey());
logger.info(buttonBinding);
}
}
}
InputManager.loadButtonBindings();
lateInitDone = true;
}
/** /**
* This method is called every Minecraft tick. * This method is called every Minecraft tick.
@@ -146,17 +194,25 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
* @param client the client instance * @param client the client instance
*/ */
public void onTick(@NotNull MinecraftClient client) { public void onTick(@NotNull MinecraftClient client) {
this.initKeybindings();
this.input.tick(client); this.input.tick(client);
if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && (client.isWindowFocused() || MidnightControlsConfig.unfocusedInput)) if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && (client.isWindowFocused() || MidnightControlsConfig.unfocusedInput))
this.input.tickController(client); this.input.tickController(client);
/*if (BINDING_RING.wasPressed()) { if (BINDING_RING.wasPressed()) {
client.openScreen(new RingScreen()); ring.loadFromUnbound();
}*/ client.setScreen(new RingScreen());
}
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"),
Text.translatable("midnightcontrols.controller.tutorial.description", Text.translatable("options.title"), Text.translatable("controls.title"),
Text.translatable("midnightcontrols.menu.title.controller"))));
MidnightControlsConfig.enableHints = false;
MidnightControlsConfig.save();
}
} }
public void onRender(MinecraftClient client) { public void onRender(MinecraftClient client) {
this.input.onRender(client.getTickDelta(), client); //this.input.onRender(client);
} }
/** /**

View File

@@ -9,11 +9,14 @@
package eu.midnightdust.midnightcontrols.client; package eu.midnightdust.midnightcontrols.client;
import com.google.common.collect.Lists;
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.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 net.minecraft.client.MinecraftClient;
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;
@@ -21,55 +24,58 @@ import org.lwjgl.glfw.GLFW;
import java.util.*; import java.util.*;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import static org.lwjgl.glfw.GLFW.GLFW_GAMEPAD_AXIS_LEFT_X; import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.glfw.GLFW.GLFW_GAMEPAD_AXIS_LEFT_Y;
/** /**
* Represents MidnightControls configuration. * Represents MidnightControls configuration.
*/ */
public class MidnightControlsConfig extends MidnightConfig { public class MidnightControlsConfig extends MidnightConfig {
public static boolean isEditing = false;
@Hidden @Entry public static int configVersion = 1;
// General // General
@Entry public static ControlsMode controlsMode = ControlsMode.DEFAULT; @Entry(name = "midnightcontrols.menu.controls_mode") public static ControlsMode controlsMode = ControlsMode.DEFAULT;
@Entry public static boolean autoSwitchMode = false; @Entry(name = "midnightcontrols.menu.auto_switch_mode") public static boolean autoSwitchMode = true;
@Entry public static boolean debug = false; @Entry(name = "Debug") public static boolean debug = false;
// HUD // HUD
@Entry public static boolean hudEnable = true; @Entry(name = "midnightcontrols.menu.hud_enable") public static boolean hudEnable = true;
@Entry public static HudSide hudSide = HudSide.LEFT; @Entry(name = "midnightcontrols.menu.hud_side") public static HudSide hudSide = HudSide.LEFT;
// Gameplay // Gameplay
@Entry public static boolean analogMovement = true; @Entry(name = "midnightcontrols.menu.analog_movement") public static boolean analogMovement = true;
@Entry public static boolean fastBlockPlacing = true; @Entry(name = "midnightcontrols.menu.double_tap_to_sprint") public static boolean doubleTapToSprint = true;
@Entry public static boolean flyDrifting = false; @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 public static boolean verticalFlyDrifting = true; @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 public static boolean horizontalReacharound = false; @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 public static boolean verticalReacharound = false; @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 public static boolean shouldRenderReacharoundOutline = true; @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 public static int[] reacharoundOutlineColor = new int[]{255, 255, 255, 102}; @Entry(name = "Reacharound Outline") public static boolean shouldRenderReacharoundOutline = true;
// Controller @Entry(name = "Reacharound Outline Color (WIP)", isColor = true) public static String reacharoundOutlineColorHex = "#ffffff";
@Entry public static ControllerType controllerType = ControllerType.DEFAULT; @Entry(name = "Reacharound Outline Alpha", min = 0, max = 255) public static int reacharoundOutlineColorAlpha = 102;
//private static final double DEFAULT_DEAD_ZONE = 0.25; @Entry(name = "midnightcontrols.menu.right_dead_zone") public static double rightDeadZone = 0.25;
@Entry public static double rightDeadZone = 0.25; @Entry(name = "midnightcontrols.menu.left_dead_zone") public static double leftDeadZone = 0.25;
@Entry public static double leftDeadZone = 0.25; @Entry(name = "midnightcontrols.menu.invert_right_y_axis") public static boolean invertRightYAxis = false;
@Entry public static boolean invertRightYAxis = false; @Entry(name = "midnightcontrols.menu.invert_right_x_axis") public static boolean invertRightXAxis = false;
@Entry public static boolean invertRightXAxis = false; @Entry(name = "midnightcontrols.menu.rotation_speed") public static double rotationSpeed = 40.0; //used for x-axis, name kept for compatability
@Entry public static double DEFAULT_MAX_VALUE = 1; @Entry(name = "midnightcontrols.menu.y_axis_rotation_speed") public static double yAxisRotationSpeed = rotationSpeed;
@Entry public static double rotationSpeed = 40.0; @Entry(name = "midnightcontrols.menu.mouse_speed") public static double mouseSpeed = 25.0;
@Entry public static double mouseSpeed = 25.0; @Entry(name = "midnightcontrols.menu.unfocused_input") public static boolean unfocusedInput = false;
@Entry public static boolean unfocusedInput = false; @Entry(name = "midnightcontrols.menu.virtual_mouse") public static boolean virtualMouse = false;
@Entry public static boolean virtualMouse = false; @Entry(name = "midnightcontrols.menu.virtual_mouse.skin") public static VirtualMouseSkin virtualMouseSkin = VirtualMouseSkin.DEFAULT_LIGHT;
@Entry public static VirtualMouseSkin virtualMouseSkin = VirtualMouseSkin.DEFAULT_LIGHT; @Entry(name = "Controller ID") public static Object controllerID = 0;
// @Entry public static List<Pages> ringPages = new ArrayList<String>(); @Entry(name = "2nd Controller ID") public static Object secondControllerID = -1;
// @Entry public static double maxAnalog1 = 1; @Entry(name = "midnightcontrols.menu.controller_type") public static ControllerType controllerType = ControllerType.DEFAULT;
// @Entry public static double maxAnalog2 = 1; @Entry(name = "Mouse screens") public static List<String> mouseScreens = Lists.newArrayList("me.jellysquid.mods.sodium.client.gui",
// @Entry public static double maxAnalog3 = 1; "net.coderbot.iris.gui", "net.minecraft.client.gui.screen.advancement", "net.minecraft.client.gui.screen.pack.PackScreen", "net.minecraft.class_5375",
// @Entry public static double maxAnalog4 = 1; "net.minecraft.class_457", "net.minecraft.class_408", "me.flashyreese.mods.reeses_sodium_options.client.gui", "dev.emi.emi.screen",
@Entry public static Object controllerID = 0; "hardcorequesting.client.interfaces.GuiQuestBook", "hardcorequesting.client.interfaces.GuiReward", "hardcorequesting.client.interfaces.EditTrackerScreen");
@Entry public static Object secondControllerID = -1; @Entry(name = "Keybindings") public static Map<String, String> BINDINGS = new HashMap<>();
@Entry public static Map<String, String> BINDINGS = Map.of();
private static final Pattern BUTTON_BINDING_PATTERN = Pattern.compile("(-?\\d+)\\+?"); private static final Pattern BUTTON_BINDING_PATTERN = Pattern.compile("(-?\\d+)\\+?");
// Gameplay. @Entry(name = "Max analog values") public static double[] maxAnalogValues = new double[]{1, 1, 1, 1};
// Controller settings @Entry(name = "Trigger button fix") public static boolean triggerFix = true;
@Entry public static double[] maxAnalogValues = new double[]{DEFAULT_MAX_VALUE, DEFAULT_MAX_VALUE, DEFAULT_MAX_VALUE, DEFAULT_MAX_VALUE}; @Entry(name = "Enable Hints") public static boolean enableHints = true;
@Entry(name = "Enable Shortcut in Controls Options") public static boolean shortcutInControls = true;
@Entry(name = "Ring Bindings (WIP)") public static List<String> ringBindings = new ArrayList<>();
@Entry(name = "Ignored Unbound Keys") public static List<String> ignoredUnboundKeys = Lists.newArrayList("inventorytabs.key.next_tab");
/** /**
* Loads the configuration * Loads the configuration
@@ -79,7 +85,6 @@ 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);
} }
/** /**
@@ -88,6 +93,7 @@ public class MidnightControlsConfig extends MidnightConfig {
public static void save() { public static void save() {
MidnightControlsConfig.write("midnightcontrols"); MidnightControlsConfig.write("midnightcontrols");
MidnightControlsClient.get().log("Configuration saved."); MidnightControlsClient.get().log("Configuration saved.");
MidnightControlsFeature.refreshEnabled();
} }
/** /**
* Gets the used controller. * Gets the used controller.
@@ -96,12 +102,23 @@ public class MidnightControlsConfig extends MidnightConfig {
*/ */
public static Controller getController() { public static Controller getController() {
var raw = MidnightControlsConfig.controllerID; var raw = MidnightControlsConfig.controllerID;
Controller controller = Controller.byId(GLFW.GLFW_JOYSTICK_1);
if (raw instanceof Number) { if (raw instanceof Number) {
return Controller.byId(((Number) raw).intValue()); controller = Controller.byId(((Number) raw).intValue());
} else if (raw instanceof String) { } else if (raw instanceof String) {
return Controller.byGuid((String) raw).orElse(Controller.byId(GLFW.GLFW_JOYSTICK_1)); controller = Controller.byGuid((String) raw).orElse(Controller.byId(GLFW.GLFW_JOYSTICK_1));
} }
return Controller.byId(GLFW.GLFW_JOYSTICK_1); if ((!controller.isConnected() || !controller.isGamepad()) && MidnightControlsConfig.autoSwitchMode && !isEditing) {
for (int i = 0; i < GLFW.GLFW_JOYSTICK_LAST; ++i) {
Controller gamepad = Controller.byId(i);
if (gamepad.isConnected() && gamepad.isGamepad()) {
controller = gamepad;
i = GLFW_JOYSTICK_LAST;
}
}
}
if (controller.isConnected() && controller.isGamepad() && MidnightControlsConfig.autoSwitchMode && !isEditing) MidnightControlsConfig.controlsMode = ControlsMode.CONTROLLER;
return controller;
} }
/** /**
@@ -124,7 +141,7 @@ public class MidnightControlsConfig extends MidnightConfig {
if (raw instanceof Number) { if (raw instanceof Number) {
if (((Number) raw).intValue() == -1) if (((Number) raw).intValue() == -1)
return Optional.empty(); return Optional.empty();
return Optional.of(Controller.byId((Integer) raw)); return Optional.of(Controller.byId(((Number) raw).intValue()));
} else if (raw instanceof String) { } else if (raw instanceof String) {
return Optional.of(Controller.byGuid((String) raw).orElse(Controller.byId(GLFW.GLFW_JOYSTICK_1))); return Optional.of(Controller.byGuid((String) raw).orElse(Controller.byId(GLFW.GLFW_JOYSTICK_1)));
} }
@@ -159,7 +176,7 @@ public class MidnightControlsConfig extends MidnightConfig {
public static double getAxisMaxValue(int axis) { public static double getAxisMaxValue(int axis) {
if (axis >= MidnightControlsConfig.maxAnalogValues.length) if (axis >= MidnightControlsConfig.maxAnalogValues.length)
return DEFAULT_MAX_VALUE; return 1;
return MidnightControlsConfig.maxAnalogValues[axis]; return MidnightControlsConfig.maxAnalogValues[axis];
} }
@@ -256,4 +273,61 @@ public class MidnightControlsConfig extends MidnightConfig {
public static boolean isMovementAxis(int axis) { public static boolean isMovementAxis(int axis) {
return axis == GLFW_GAMEPAD_AXIS_LEFT_Y || axis == GLFW_GAMEPAD_AXIS_LEFT_X; return axis == GLFW_GAMEPAD_AXIS_LEFT_Y || axis == GLFW_GAMEPAD_AXIS_LEFT_X;
} }
public static void reset() {
controlsMode = ControlsMode.DEFAULT;
autoSwitchMode = true;
debug = false;
hudEnable = true;
hudSide = HudSide.LEFT;
analogMovement = true;
doubleTapToSprint = true;
fastBlockPlacing = false;
flyDrifting = true;
verticalFlyDrifting = true;
horizontalReacharound = false;
verticalReacharound = false;
shouldRenderReacharoundOutline = true;
reacharoundOutlineColorHex = "#ffffff";
reacharoundOutlineColorAlpha = 102;
rightDeadZone = 0.25;
leftDeadZone = 0.25;
invertRightYAxis = false;
invertRightXAxis = false;
rotationSpeed = 40.0;
yAxisRotationSpeed = rotationSpeed;
mouseSpeed = 25.0;
unfocusedInput = false;
virtualMouse = false;
virtualMouseSkin = VirtualMouseSkin.DEFAULT_LIGHT;
controllerID = 0;
secondControllerID = -1;
controllerType = ControllerType.DEFAULT;
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");
BINDINGS = new HashMap<>();
maxAnalogValues = new double[]{1, 1, 1, 1};
triggerFix = true;
enableHints = true;
shortcutInControls = true;
ringBindings = new ArrayList<>();
ignoredUnboundKeys = Lists.newArrayList("inventorytabs.key.next_tab");
}
/**
* Gets the controller type from the controller's identifier.
*
* @return the controller name matches a type, else empty
*/
public static @NotNull ControllerType matchControllerToType() {
String controller = getController().getName().toLowerCase();
if (controller.contains("xbox 360")) return ControllerType.XBOX_360;
else if (controller.contains("xbox") || controller.contains("afterglow")) return ControllerType.XBOX;
else if (controller.contains("steam deck")) return ControllerType.STEAM_DECK;
else if (controller.contains("steam")) return ControllerType.STEAM_CONTROLLER;
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("switch") || controller.contains("joy-con") || controller.contains("wii") || controller.contains("nintendo")) return ControllerType.SWITCH;
else if (controller.contains("ouya")) return ControllerType.OUYA;
else return ControllerType.DEFAULT;
}
} }

View File

@@ -10,15 +10,21 @@
package eu.midnightdust.midnightcontrols.client; package eu.midnightdust.midnightcontrols.client;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import dev.lambdaurora.spruceui.widget.AbstractSpruceWidget;
import dev.lambdaurora.spruceui.widget.container.SpruceEntryListWidget;
import eu.midnightdust.midnightcontrols.MidnightControls;
import eu.midnightdust.midnightcontrols.client.compat.EmotecraftCompat;
import eu.midnightdust.midnightcontrols.client.compat.LibGuiCompat;
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.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.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.AdvancementsScreenAccessor; import eu.midnightdust.midnightcontrols.client.mixin.*;
import eu.midnightdust.midnightcontrols.client.mixin.CreativeInventoryScreenAccessor; import eu.midnightdust.midnightcontrols.client.ring.RingPage;
import eu.midnightdust.midnightcontrols.client.mixin.EntryListWidgetAccessor;
import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor; import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor;
import eu.midnightdust.midnightcontrols.client.util.MouseAccessor; import eu.midnightdust.midnightcontrols.client.util.MouseAccessor;
import dev.lambdaurora.spruceui.navigation.NavigationDirection; import dev.lambdaurora.spruceui.navigation.NavigationDirection;
@@ -27,25 +33,24 @@ import dev.lambdaurora.spruceui.widget.AbstractSprucePressableButtonWidget;
import dev.lambdaurora.spruceui.widget.SpruceElement; import dev.lambdaurora.spruceui.widget.SpruceElement;
import dev.lambdaurora.spruceui.widget.SpruceLabelWidget; import dev.lambdaurora.spruceui.widget.SpruceLabelWidget;
import dev.lambdaurora.spruceui.widget.container.SpruceParentWidget; import dev.lambdaurora.spruceui.widget.container.SpruceParentWidget;
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.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.pack.PackScreen;
import net.minecraft.client.gui.screen.world.WorldListWidget; import net.minecraft.client.gui.screen.world.WorldListWidget;
import net.minecraft.client.gui.widget.AlwaysSelectedEntryListWidget; import net.minecraft.client.gui.widget.*;
import net.minecraft.client.gui.widget.EntryListWidget;
import net.minecraft.client.gui.widget.PressableWidget;
import net.minecraft.client.gui.widget.SliderWidget;
import net.minecraft.screen.slot.Slot; import net.minecraft.screen.slot.Slot;
import net.minecraft.screen.slot.SlotActionType; import net.minecraft.text.TranslatableTextContent;
import net.minecraft.text.TranslatableText;
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;
@@ -53,10 +58,7 @@ import org.jetbrains.annotations.Nullable;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import org.lwjgl.glfw.GLFWGamepadState; import org.lwjgl.glfw.GLFWGamepadState;
import java.util.Comparator; import java.util.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import static org.lwjgl.glfw.GLFW.*; import static org.lwjgl.glfw.GLFW.*;
@@ -70,8 +72,8 @@ import static org.lwjgl.glfw.GLFW.*;
public class MidnightInput { 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
private int actionGuiCooldown = 0; public int actionGuiCooldown = 0;
private boolean ignoreNextARelease = false; public boolean ignoreNextARelease = 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;
@@ -80,7 +82,8 @@ public class MidnightInput {
private int targetMouseY = 0; private int targetMouseY = 0;
private float mouseSpeedX = 0.f; private float mouseSpeedX = 0.f;
private float mouseSpeedY = 0.f; private float mouseSpeedY = 0.f;
private int inventoryInteractionCooldown = 0; public int inventoryInteractionCooldown = 0;
public int screenCloseCooldown = 0;
private ControllerControlsWidget controlsInput = null; private ControllerControlsWidget controlsInput = null;
@@ -121,10 +124,13 @@ public class MidnightInput {
// Decreases the cooldown for GUI actions. // Decreases the cooldown for GUI actions.
if (this.actionGuiCooldown > 0) if (this.actionGuiCooldown > 0)
--this.actionGuiCooldown; --this.actionGuiCooldown;
if (this.screenCloseCooldown > 0)
--this.screenCloseCooldown;
InputManager.updateStates(); InputManager.updateStates();
var controller = MidnightControlsConfig.getController(); var controller = MidnightControlsConfig.getController();
if (controller.isConnected()) { if (controller.isConnected()) {
var state = controller.getState(); var state = controller.getState();
this.fetchButtonInput(client, state, false); this.fetchButtonInput(client, state, false);
@@ -137,10 +143,7 @@ public class MidnightInput {
this.fetchAxeInput(client, state, true); this.fetchAxeInput(client, state, true);
}); });
boolean allowInput = true; boolean allowInput = this.controlsInput == null || this.controlsInput.focusedBinding == null;
if (this.controlsInput != null && this.controlsInput.focusedBinding != null)
allowInput = false;
if (allowInput) if (allowInput)
InputManager.updateBindings(client); InputManager.updateBindings(client);
@@ -173,11 +176,11 @@ public class MidnightInput {
} }
/** /**
* This method is called when Minecraft renders. * This method is called to update the camera
* *
* @param client the client instance * @param client the client instance
*/ */
public void onRender(float tickDelta, @NotNull MinecraftClient client) { public void updateCamera(@NotNull MinecraftClient client) {
if (!(client.currentScreen == null || client.currentScreen instanceof TouchscreenOverlay)) if (!(client.currentScreen == null || client.currentScreen instanceof TouchscreenOverlay))
return; return;
@@ -186,16 +189,29 @@ 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) (player.prevYaw + (this.targetYaw / 0.10) * tickDelta); float rotationYaw = (float) (client.player.prevYaw + (this.targetYaw * 0.175));
float rotationPitch = (float) (player.prevPitch + (this.targetPitch / 0.10) * tickDelta); float rotationPitch = (float) (client.player.prevPitch + (this.targetPitch * 0.175));
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()) { 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));
this.onRender(client);
} }
} }
/**
* This method is deprecated and will be removed in future versions
* It is just kept, because the current version of 'Do a Barrel Roll' mixins into this method
*
* @param client the client instance
*/
@Deprecated
public void onRender(@NotNull MinecraftClient client) {
}
/** /**
* This method is called when a Screen is opened. * This method is called when a Screen is opened.
@@ -259,11 +275,34 @@ public class MidnightInput {
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);
this.handleAxe(client, axis, value, absValue, state); if (!(client.currentScreen instanceof RingScreen || (MidnightControlsCompat.isEmotecraftPresent() && EmotecraftCompat.isEmotecraftScreen(client.currentScreen)))) this.handleAxe(client, axis, value, absValue, state);
}
if (client.currentScreen instanceof RingScreen || (MidnightControlsCompat.isEmotecraftPresent() && EmotecraftCompat.isEmotecraftScreen(client.currentScreen))) {
float x = Math.abs(buffer.get(GLFW_GAMEPAD_AXIS_LEFT_X)) > MidnightControlsConfig.leftDeadZone ? buffer.get(GLFW_GAMEPAD_AXIS_LEFT_X) : 0;
float y = Math.abs(buffer.get(GLFW_GAMEPAD_AXIS_LEFT_Y)) > MidnightControlsConfig.leftDeadZone ? buffer.get(GLFW_GAMEPAD_AXIS_LEFT_Y) : 0;
if (x == 0 && y == 0) {
x = Math.abs(buffer.get(GLFW_GAMEPAD_AXIS_RIGHT_X)) > MidnightControlsConfig.rightDeadZone ? buffer.get(GLFW_GAMEPAD_AXIS_RIGHT_X) : 0;
y = Math.abs(buffer.get(GLFW_GAMEPAD_AXIS_RIGHT_Y)) > MidnightControlsConfig.rightDeadZone ? buffer.get(GLFW_GAMEPAD_AXIS_RIGHT_Y) : 0;
}
int index = -1;
if (x < 0) {
if (y < 0) index = 0;
if (y == 0) index = 3;
if (y > 0) index = 5;
} else if (x == 0) {
if (y < 0) index = 1;
if (y > 0) index = 6;
} else if (x > 0) {
if (y < 0) index = 2;
if (y == 0) index = 4;
if (y > 0) index = 7;
}
if (client.currentScreen instanceof RingScreen && index > -1) RingPage.selected = index;
if (MidnightControlsCompat.isEmotecraftPresent() && EmotecraftCompat.isEmotecraftScreen(client.currentScreen)) EmotecraftCompat.handleEmoteSelector(index);
} }
} }
private void handleButton(@NotNull MinecraftClient client, int button, int action, boolean state) { public void handleButton(@NotNull MinecraftClient client, int button, int action, boolean state) {
if (this.controlsInput != null && this.controlsInput.focusedBinding != null) { if (this.controlsInput != null && this.controlsInput.focusedBinding != null) {
if (action == 0 && !this.controlsInput.currentButtons.contains(button)) { if (action == 0 && !this.controlsInput.currentButtons.contains(button)) {
this.controlsInput.currentButtons.add(button); this.controlsInput.currentButtons.add(button);
@@ -279,7 +318,7 @@ public class MidnightInput {
} }
if (action == 0 || action == 2) { if (action == 0 || action == 2) {
if (client.currentScreen != null && isScreenInteractive(client.currentScreen) 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) {
@@ -303,26 +342,16 @@ public class MidnightInput {
return; return;
} }
} }
} else if (FabricLoader.getInstance().isModLoaded("libgui")) LibGuiCompat.handlePress(client.currentScreen);
}
if (this.handleInventory(client, button)) {
this.ignoreNextARelease = true;
return;
}
if (button == GLFW.GLFW_GAMEPAD_BUTTON_B) {
if (client.currentScreen != null) {
if (!MidnightControlsCompat.handleMenuBack(client, client.currentScreen))
if (!this.tryGoBack(client.currentScreen))
client.currentScreen.onClose();
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)
&& this.actionGuiCooldown == 0) { && 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.ignoreNextARelease) { if (!this.ignoreNextARelease) {
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();
@@ -333,73 +362,13 @@ public class MidnightInput {
Screen.wrapScreenError(() -> client.currentScreen.mouseReleased(mouseX, mouseY, GLFW.GLFW_MOUSE_BUTTON_1), Screen.wrapScreenError(() -> client.currentScreen.mouseReleased(mouseX, mouseY, GLFW.GLFW_MOUSE_BUTTON_1),
"mouseReleased event handler", client.currentScreen.getClass().getCanonicalName()); "mouseReleased event handler", client.currentScreen.getClass().getCanonicalName());
} }
this.actionGuiCooldown = 5; this.screenCloseCooldown = 5;
} else { } else {
this.ignoreNextARelease = false; this.ignoreNextARelease = false;
} }
} }
} }
/** /**
* Handles inventory interaction.
*
* @param client the client instance
* @param button the button pressed
* @return {@code true} if an inventory interaction was done
*/
private boolean handleInventory(@NotNull MinecraftClient client, int button) {
if (!(client.currentScreen instanceof HandledScreen))
return false;
if (client.interactionManager == null || client.player == null)
return false;
if (this.inventoryInteractionCooldown > 0)
return true;
if (button == GLFW.GLFW_GAMEPAD_BUTTON_B) {
client.player.closeHandledScreen();
return true;
}
double x = client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth();
double y = client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight();
var screen = (HandledScreen) client.currentScreen;
var accessor = (HandledScreenAccessor) screen;
Slot slot = ((HandledScreenAccessor) client.currentScreen).midnightcontrols$getSlotAt(x, y);
int slotId;
if (slot == null) {
if (client.player.currentScreenHandler.getCursorStack().isEmpty())
return false;
slotId = accessor.midnightcontrols$isClickOutsideBounds(x, y, accessor.getX(), accessor.getY(), GLFW_MOUSE_BUTTON_1) ? -999 : -1;
} else {
slotId = slot.id;
}
var actionType = SlotActionType.PICKUP;
int clickData = GLFW.GLFW_MOUSE_BUTTON_1;
switch (button) {
case GLFW_GAMEPAD_BUTTON_A:
if (screen instanceof CreativeInventoryScreen)
if (((CreativeInventoryScreenAccessor) screen).midnightcontrols$isCreativeInventorySlot(slot))
actionType = SlotActionType.CLONE;
if (slot != null && MidnightControlsCompat.streamCompatHandlers().anyMatch(handler -> handler.isCreativeSlot(screen, slot)))
actionType = SlotActionType.CLONE;
break;
case GLFW.GLFW_GAMEPAD_BUTTON_X:
clickData = GLFW_MOUSE_BUTTON_2;
break;
case GLFW.GLFW_GAMEPAD_BUTTON_Y:
actionType = SlotActionType.QUICK_MOVE;
break;
default:
return false;
}
accessor.midnightcontrols$onMouseClick(slot, slotId, clickData, actionType);
return true;
}
/** /**
* Tries to go back. * Tries to go back.
@@ -409,13 +378,16 @@ 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() instanceof TranslatableText) .filter(element -> element.getMessage() != null && element.getMessage().getContent() != null)
.anyMatch(element -> { .anyMatch(element -> {
if (set.stream().anyMatch(key -> key.equals(((TranslatableText) element.getMessage()).getKey()))) { if (element.getMessage().getContent() instanceof TranslatableTextContent translatableText) {
element.onPress(); if (set.stream().anyMatch(key -> translatableText.getKey().equals(key))) {
return true; element.onPress();
return true;
}
} }
return false; return false;
}); });
@@ -429,11 +401,24 @@ 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)) {
if (asButtonState == 2) if (asButtonState == 2) {
asButtonState = 0; asButtonState = 0;
}
else {
// Fixes Triggers not working correctly on some controllers
if (MidnightControlsConfig.triggerFix) {
value = 1.0f;
absValue = 1.0f;
state = 1;
asButtonState = 1;
}
if (MidnightControlsConfig.debug) System.out.println(axis + " "+ value + " " + absValue + " " + state);
}
}
{ {
boolean currentPlusState = asButtonState == 1; boolean currentPlusState = asButtonState == 1;
@@ -502,6 +487,22 @@ public class MidnightInput {
} }
return; return;
} }
} else if (client.currentScreen instanceof MerchantScreen merchantScreen) {
if (axis == GLFW_GAMEPAD_AXIS_RIGHT_Y) {
// @TODO allow rebinding to left stick
if (absValue >= deadZone) {
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, -(value * 1.5f));
}
return;
}
} else if (client.currentScreen instanceof AdvancementsScreen advancementsScreen) { } else if (client.currentScreen instanceof AdvancementsScreen advancementsScreen) {
if (axis == GLFW_GAMEPAD_AXIS_RIGHT_X || axis == GLFW_GAMEPAD_AXIS_RIGHT_Y) { if (axis == GLFW_GAMEPAD_AXIS_RIGHT_X || axis == GLFW_GAMEPAD_AXIS_RIGHT_Y) {
var accessor = (AdvancementsScreenAccessor) advancementsScreen; var accessor = (AdvancementsScreenAccessor) advancementsScreen;
@@ -509,6 +510,30 @@ public class MidnightInput {
AdvancementTab tab = accessor.getSelectedTab(); AdvancementTab tab = accessor.getSelectedTab();
tab.move(axis == GLFW_GAMEPAD_AXIS_RIGHT_X ? -value * 5.0 : 0.0, axis == GLFW_GAMEPAD_AXIS_RIGHT_Y ? -value * 5.0 : 0.0); tab.move(axis == GLFW_GAMEPAD_AXIS_RIGHT_X ? -value * 5.0 : 0.0, axis == GLFW_GAMEPAD_AXIS_RIGHT_Y ? -value * 5.0 : 0.0);
} }
return;
}
} else if (client.currentScreen != null) {
if (axis == GLFW_GAMEPAD_AXIS_RIGHT_Y && absValue >= deadZone) {
float finalValue = value;
if (client.currentScreen.children().stream().filter(element -> element instanceof SpruceEntryListWidget)
.map(element -> (SpruceEntryListWidget<?>) element)
.filter(AbstractSpruceWidget::isFocusedOrHovered)
.noneMatch(element -> {
element.mouseScrolled(0.0, 0.0, -finalValue);
return true;
})
&&
client.currentScreen.children().stream().filter(element -> element instanceof EntryListWidget)
.map(element -> (EntryListWidget<?>) element)
.filter(element -> element.getType().isFocused())
.noneMatch(element -> {
element.mouseScrolled(0.0, 0.0, -finalValue);
return true;
}))
{
client.currentScreen.mouseScrolled(0.0, 0.0, -(value * 1.5f));
}
return; return;
} }
} }
@@ -580,7 +605,7 @@ public class MidnightInput {
} }
} }
private boolean handleAButton(@NotNull Screen screen, @NotNull Element focused) { public boolean handleAButton(@NotNull Screen screen, @NotNull Element focused) {
if (focused instanceof PressableWidget widget) { if (focused instanceof PressableWidget widget) {
widget.playDownSound(MinecraftClient.getInstance().getSoundManager()); widget.playDownSound(MinecraftClient.getInstance().getSoundManager());
widget.onPress(); widget.onPress();
@@ -593,7 +618,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.Entry::play); list.getSelectedAsOptional().ifPresent(WorldListWidget.WorldEntry::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();
@@ -643,7 +668,7 @@ public class MidnightInput {
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 false;
} else if (element instanceof AlwaysSelectedEntryListWidget) { } else if (element instanceof AlwaysSelectedEntryListWidget) {
((EntryListWidgetAccessor) element).midnightcontrols$moveSelection(right ? EntryListWidget.MoveDirection.UP : EntryListWidget.MoveDirection.DOWN); ((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();
@@ -668,9 +693,9 @@ public class MidnightInput {
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) {
this.targetPitch = -MidnightControlsConfig.getRightYAxisSign() * (MidnightControlsConfig.rotationSpeed * powValue) * 0.11D; this.targetPitch = -MidnightControlsConfig.getRightYAxisSign() * (MidnightControlsConfig.yAxisRotationSpeed * powValue) * 0.11D;
} else if (state == 1) { } else if (state == 1) {
this.targetPitch = MidnightControlsConfig.getRightYAxisSign() * (MidnightControlsConfig.rotationSpeed * powValue) * 0.11D; this.targetPitch = MidnightControlsConfig.getRightYAxisSign() * (MidnightControlsConfig.yAxisRotationSpeed * powValue) * 0.11D;
} }
} }
if (axis == GLFW_GAMEPAD_AXIS_RIGHT_X) { if (axis == GLFW_GAMEPAD_AXIS_RIGHT_X) {
@@ -684,26 +709,95 @@ public class MidnightInput {
} }
private boolean changeFocus(@NotNull Screen screen, NavigationDirection direction) { private boolean changeFocus(@NotNull Screen screen, NavigationDirection direction) {
if (screen instanceof SpruceScreen spruceScreen) { if (!isScreenInteractive(screen) && !screen.getClass().getCanonicalName().contains("me.jellysquid.mods.sodium.client.gui")) return false;
if (spruceScreen.onNavigation(direction, false)) { try {
this.actionGuiCooldown = 5; if (screen instanceof SpruceScreen spruceScreen) {
if (spruceScreen.onNavigation(direction, false)) {
this.actionGuiCooldown = 5;
}
return false;
} }
return false; if (FabricLoader.getInstance().isModLoaded("sodium"))
} SodiumCompat.handleInput(screen, direction.isLookingForward());
if (!screen.changeFocus(direction.isLookingForward())) { // This still needs some work
if (screen.changeFocus(direction.isLookingForward())) { // ScreenAccessor accessor = (ScreenAccessor) screen;
// 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; this.actionGuiCooldown = 5;
return false; return false;
} }
return true; } catch (Exception exception) {MidnightControls.get().warn("Unknown exception encountered while trying to change focus: "+exception);}
} else { return false;
this.actionGuiCooldown = 5;
return false;
}
} }
public static boolean isScreenInteractive(@NotNull Screen screen) { public static boolean isScreenInteractive(@NotNull Screen screen) {
return !(screen instanceof AdvancementsScreen || screen instanceof HandledScreen || screen instanceof PackScreen 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));
} }

View File

@@ -144,7 +144,7 @@ public class MidnightReacharound {
return null; return null;
} }
return new BlockHitResult(client.crosshairTarget.getPos(), direction, blockPos, false); return new BlockHitResult(new Vec3d(blockPos.getX(),blockPos.getY(),blockPos.getZ()), direction, blockPos, false);
} }
return null; return null;
} }

View File

@@ -10,7 +10,6 @@
package eu.midnightdust.midnightcontrols.client; 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;
@@ -34,7 +33,7 @@ public enum VirtualMouseSkin implements Nameable {
VirtualMouseSkin(String name) { VirtualMouseSkin(String name) {
this.name = name; this.name = name;
this.text = new TranslatableText(this.getTranslationKey()); this.text = Text.translatable(this.getTranslationKey());
} }
/** /**

View File

@@ -33,6 +33,13 @@ 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.
* *

View File

@@ -0,0 +1,48 @@
package eu.midnightdust.midnightcontrols.client.compat;
import dev.emi.emi.EmiConfig;
import dev.emi.emi.screen.EmiScreen;
import dev.emi.emi.screen.EmiScreenManager;
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
import eu.midnightdust.midnightcontrols.client.controller.ButtonCategory;
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
import net.minecraft.client.gui.screen.ingame.HandledScreen;
import org.aperlambda.lambdacommon.Identifier;
import org.jetbrains.annotations.NotNull;
import org.lwjgl.glfw.GLFW;
public class EMICompat implements CompatHandler {
public static boolean handleTabs(boolean direction) {
if (isEMIEnabled() && MidnightControlsClient.get().input.actionGuiCooldown == 0 && EmiScreenManager.searchLeft != null && EmiScreenManager.searchRight != null) {
if (direction) EmiScreenManager.searchRight.onPress();
else EmiScreenManager.searchLeft.onPress();
MidnightControlsClient.get().input.actionGuiCooldown = 5;
return true;
}
return false;
}
@Override
public void handle(@NotNull MidnightControlsClient mod) {
ButtonCategory category = new ButtonCategory(new Identifier("midnightcontrols","category.emi"));
InputManager.registerCategory(category);
new ButtonBinding.Builder("emi_page_left")
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_LEFT_BUMPER, ButtonBinding.axisAsButton(GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, true))
.category(category)
.action((client,action,value,buttonState)->handleTabs(false)).cooldown()
.filter(((client, buttonBinding) -> client.currentScreen instanceof HandledScreen<?> || client.currentScreen instanceof EmiScreen))
.register();
new ButtonBinding.Builder("emi_page_right")
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER, ButtonBinding.axisAsButton(GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER, true))
.category(category)
.action((client,action,value,buttonState)->handleTabs(true)).cooldown()
.filter(((client, buttonBinding) -> client.currentScreen instanceof HandledScreen<?> || client.currentScreen instanceof EmiScreen))
.register();
}
public static boolean isEMIEnabled() {
return EmiConfig.enabled;
}
public static boolean isSearchBarCentered() {
return EmiConfig.centerSearchBar;
}
}

View File

@@ -1,51 +1,29 @@
/*
* 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.compat; package eu.midnightdust.midnightcontrols.client.compat;
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.controller.InputManager;
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
import io.github.kosmx.emotes.arch.gui.screen.ingame.FastChosseScreen; import io.github.kosmx.emotes.arch.gui.screen.ingame.FastChosseScreen;
import io.github.kosmx.emotes.main.network.ClientEmotePlay; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.Screen;
import org.jetbrains.annotations.NotNull;
import org.lwjgl.glfw.GLFW;
/** public class EmotecraftCompat {
* Represents a compatibility handler for Emotecraft. public static boolean isEmotecraftScreen(Screen screen) {
* return screen instanceof FastChosseScreen;
* @author Motschen }
* @version 1.4.3 public static void handleEmoteSelector(int index) {
* @since 1.0.0 MinecraftClient client = MinecraftClient.getInstance();
*/ if (client.currentScreen instanceof FastChosseScreen) {
public class EmotecraftCompat implements CompatHandler { int x = client.getWindow().getWidth() / 2;
@Override int y = client.getWindow().getHeight() / 2;
public void handle(@NotNull MidnightControlsClient mod) { if (index == 0) InputManager.queueMousePosition(x-200, y-200);
new ButtonBinding.Builder("key.emotecraft.fastchoose") if (index == 1) InputManager.queueMousePosition(x, y-200);
.buttons(16) if (index == 2) InputManager.queueMousePosition(x+200, y-200);
.onlyInGame() if (index == 3) InputManager.queueMousePosition(x-200, y);
.cooldown(true) if (index == 4) InputManager.queueMousePosition(x+200, y);
.category(ButtonBinding.MISC_CATEGORY) if (index == 5) InputManager.queueMousePosition(x-200, y+200);
.action((client, button, value, action) -> { if (index == 6) InputManager.queueMousePosition(x, y+200);
client.setScreen(new FastChosseScreen(null)); if (index == 7) InputManager.queueMousePosition(x+200, y+200);
return true;
}) InputManager.INPUT_MANAGER.updateMousePosition(client);
.register(); }
new ButtonBinding.Builder("key.emotecraft.stop")
.buttons(17)
.onlyInGame()
.cooldown(true)
.category(ButtonBinding.MISC_CATEGORY)
.action((client, button, value, action) -> {
ClientEmotePlay.clientStopLocalEmote();
return true;
})
.register();
} }
} }

View File

@@ -0,0 +1,33 @@
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);
}
}
}
}

View File

@@ -0,0 +1,25 @@
package eu.midnightdust.midnightcontrols.client.compat;
import io.github.cottonmc.cotton.gui.impl.client.CottonScreenImpl;
import io.github.cottonmc.cotton.gui.widget.WButton;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.sound.PositionedSoundInstance;
import net.minecraft.sound.SoundEvents;
import org.jetbrains.annotations.NotNull;
@SuppressWarnings("UnstableApiUsage")
public class LibGuiCompat {
public static boolean handlePress(@NotNull Screen screen) {
if (screen instanceof CottonScreenImpl cottonScreen) {
if (cottonScreen.getDescription() != null && cottonScreen.getDescription().getFocus() != null) {
if (cottonScreen.getDescription().getFocus() instanceof WButton button && button.getOnClick() != null) {
button.getOnClick().run();
MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F));
return true;
}
}
}
return false;
}
}

View File

@@ -31,7 +31,7 @@ import java.util.stream.Stream;
* @since 1.1.0 * @since 1.1.0
*/ */
public class MidnightControlsCompat { public class MidnightControlsCompat {
private static final List<CompatHandler> HANDLERS = new ArrayList<>(); public static final List<CompatHandler> HANDLERS = new ArrayList<>();
/** /**
* Initializes compatibility with other mods if needed. * Initializes compatibility with other mods if needed.
@@ -39,22 +39,20 @@ public class MidnightControlsCompat {
* @param mod the mod instance * @param mod the mod instance
*/ */
public static void init(@NotNull MidnightControlsClient mod) { public static void init(@NotNull MidnightControlsClient mod) {
if (FabricLoader.getInstance().isModLoaded("okzoomer")) { // "okzoomer" is the mod ID used by Fabric-compatible versions of Ok Zoomer. (5.0.0-beta.6 and below.)
mod.log("Adding okzoomer compatibility..."); // "ok_zoomer" is the mod ID used by Quilt-exclusive versions of Ok Zoomer. (5.0.0-beta.7 and above.)
if (FabricLoader.getInstance().isModLoaded("okzoomer") || FabricLoader.getInstance().isModLoaded("ok_zoomer")) {
mod.log("Adding Ok Zoomer compatibility...");
HANDLERS.add(new OkZoomerCompat()); HANDLERS.add(new OkZoomerCompat());
} }
/*if (isReiPresent()) { if (isEMIPresent()) {
mod.log("Adding REI compatiblity..."); mod.log("Adding EMI compatibility...");
HANDLERS.add(new ReiCompat()); HANDLERS.add(new EMICompat());
}*/ }
if (FabricLoader.getInstance().isModLoaded("hardcorequesting") && LambdaReflection.doesClassExist(HQMCompat.GUI_BASE_CLASS_PATH)) { if (FabricLoader.getInstance().isModLoaded("hardcorequesting") && LambdaReflection.doesClassExist(HQMCompat.GUI_BASE_CLASS_PATH)) {
mod.log("Adding HQM compatibility..."); mod.log("Adding HQM compatibility...");
HANDLERS.add(new HQMCompat()); HANDLERS.add(new HQMCompat());
} }
if (FabricLoader.getInstance().isModLoaded("emotecraft")) {
mod.log("Adding Emotecraft compatibility...");
HANDLERS.add(new EmotecraftCompat());
}
HANDLERS.forEach(handler -> handler.handle(mod)); HANDLERS.forEach(handler -> handler.handle(mod));
InputManager.loadButtonBindings(); InputManager.loadButtonBindings();
} }
@@ -161,4 +159,28 @@ public class MidnightControlsCompat {
public static boolean isReiPresent() { public static boolean isReiPresent() {
return FabricLoader.getInstance().isModLoaded("roughlyenoughitems"); return FabricLoader.getInstance().isModLoaded("roughlyenoughitems");
} }
/**
* Returns whether EMI is present.
*
* @return true if EMI is present, else false
*/
public static boolean isEMIPresent() {
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");
}
} }

View File

@@ -9,6 +9,7 @@
package eu.midnightdust.midnightcontrols.client.compat; package eu.midnightdust.midnightcontrols.client.compat;
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;
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
@@ -29,14 +30,11 @@ public class MidnightControlsMixinPlugin implements IMixinConfigPlugin {
private final HashMap<String, Boolean> conditionalMixins = new HashMap<>(); private final HashMap<String, Boolean> conditionalMixins = new HashMap<>();
public MidnightControlsMixinPlugin() { public MidnightControlsMixinPlugin() {
this.putConditionalMixin("EntryListWidgetAccessor", MidnightControlsCompat.isReiPresent()); this.putConditionalMixin("SodiumOptionsGUIAccessor", FabricLoader.getInstance().isModLoaded("sodium"));
this.putConditionalMixin("EntryWidgetAccessor", MidnightControlsCompat.isReiPresent());
this.putConditionalMixin("RecipeViewingScreenAccessor", MidnightControlsCompat.isReiPresent());
this.putConditionalMixin("VillagerRecipeViewingScreenAccessor", MidnightControlsCompat.isReiPresent());
} }
private void putConditionalMixin(@NotNull String path, boolean condition) { private void putConditionalMixin(@NotNull String path, boolean condition) {
this.conditionalMixins.put("me.lambdaurora.midnightcontrols.client.compat.mixin." + path, condition); this.conditionalMixins.put("eu.midnightdust.midnightcontrols.client.compat.mixin." + path, condition);
} }
@Override @Override

View File

@@ -1,7 +1,7 @@
/* /*
* Copyright © 2021 LambdAurora <aurora42lambda@gmail.com> * Copyright © 2021-2022 Karen/あけみ <karen@akemi.ai>, LambdAurora <aurora42lambda@gmail.com>
* *
* This file is part of midnightcontrols. * This file is part of MidnightControls.
* *
* Licensed under the MIT license. For more information, * Licensed under the MIT license. For more information,
* see the LICENSE file. * see the LICENSE file.
@@ -11,49 +11,185 @@ package eu.midnightdust.midnightcontrols.client.compat;
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 io.github.ennuil.okzoomer.keybinds.ZoomKeybinds; import net.minecraft.client.option.KeyBinding;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.aperlambda.lambdacommon.utils.LambdaReflection;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/** /**
* Represents a compatibility handler for OkZoomer. * Represents a compatibility handler for Ok Zoomer.
* *
* @author LambdAurora * @author Karen/あけみ, LambdAurora
* @version 1.4.3 * @version 1.4.3
* @since 1.1.0 * @since 1.1.0
*/ */
public class OkZoomerCompat implements CompatHandler { public class OkZoomerCompat implements CompatHandler {
private boolean didAllReflectionCallsSucceed = false;
private KeyBinding okZoomerZoomKey;
private KeyBinding okZoomerIncreaseZoomKey;
private KeyBinding okZoomerDecreaseZoomKey;
private KeyBinding okZoomerResetZoomKey;
private Method okZoomerAreExtraKeyBindsEnabledMethod;
public OkZoomerCompat() {
// These strings represent the names of the classes, fields, and methods we use from the Ok Zoomer API
String okZoomerZoomKeybindsClassString;
String okZoomerZoomKeyFieldString;
String okZoomerIncreaseZoomKeyFieldString;
String okZoomerDecreaseZoomKeyFieldString;
String okZoomerResetZoomKeyFieldString;
String okZoomerAreExtraKeyBindsEnabledMethodNameString;
// These variables represent the actual objects that we reflect to
Class<?> okZoomerZoomKeybindsClass;
Field okZoomerZoomKeyField;
Field okZoomerIncreaseZoomKeyField;
Field okZoomerDecreaseZoomKeyField;
Field okZoomerResetZoomKeyField;
// First, we need to determine which version of the Ok Zoomer API we're dealing with here.
if (LambdaReflection.doesClassExist("io.github.ennuil.okzoomer.keybinds.ZoomKeybinds")) {
// https://github.com/EnnuiL/OkZoomer/blob/5.0.0-beta.3+1.17.1/src/main/java/io/github/ennuil/okzoomer/keybinds/ZoomKeybinds.java
MidnightControlsClient.get().log("Ok Zoomer version 5.0.0-beta.3 or below detected!");
okZoomerZoomKeybindsClassString = "io.github.ennuil.okzoomer.keybinds.ZoomKeybinds";
okZoomerZoomKeyFieldString = "zoomKey";
okZoomerIncreaseZoomKeyFieldString = "increaseZoomKey";
okZoomerDecreaseZoomKeyFieldString = "decreaseZoomKey";
okZoomerResetZoomKeyFieldString = "resetZoomKey";
okZoomerAreExtraKeyBindsEnabledMethodNameString = "areExtraKeybindsEnabled";
} else if (LambdaReflection.doesClassExist("io.github.ennuil.okzoomer.key_binds.ZoomKeyBinds")) {
// https://github.com/EnnuiL/OkZoomer/blob/5.0.0-beta.6+1.18.2/src/main/java/io/github/ennuil/okzoomer/key_binds/ZoomKeyBinds.java
MidnightControlsClient.get().log("Ok Zoomer version 5.0.0-beta.6, 5.0.0-beta.5, or 5.0.0-beta.4 detected!");
okZoomerZoomKeybindsClassString = "io.github.ennuil.okzoomer.key_binds.ZoomKeyBinds";
okZoomerZoomKeyFieldString = "ZOOM_KEY";
okZoomerIncreaseZoomKeyFieldString = "INCREASE_ZOOM_KEY";
okZoomerDecreaseZoomKeyFieldString = "DECREASE_ZOOM_KEY";
okZoomerResetZoomKeyFieldString = "RESET_ZOOM_KEY";
okZoomerAreExtraKeyBindsEnabledMethodNameString = "areExtraKeyBindsEnabled";
} else if (LambdaReflection.doesClassExist("io.github.ennuil.ok_zoomer.key_binds.ZoomKeyBinds")) {
// https://github.com/EnnuiL/OkZoomer/blob/5.0.0-beta.7+1.18.2/src/main/java/io/github/ennuil/ok_zoomer/key_binds/ZoomKeyBinds.java
MidnightControlsClient.get().log("Ok Zoomer version 5.0.0-beta.7 (Quilt) or above detected!");
okZoomerZoomKeybindsClassString = "io.github.ennuil.ok_zoomer.key_binds.ZoomKeyBinds";
okZoomerZoomKeyFieldString = "ZOOM_KEY";
okZoomerIncreaseZoomKeyFieldString = "INCREASE_ZOOM_KEY";
okZoomerDecreaseZoomKeyFieldString = "DECREASE_ZOOM_KEY";
okZoomerResetZoomKeyFieldString = "RESET_ZOOM_KEY";
okZoomerAreExtraKeyBindsEnabledMethodNameString = "areExtraKeyBindsEnabled";
} else {
// If all of the above checks fail, then the version of the Ok Zoomer API that the user is trying to use is too new.
MidnightControlsClient.get().warn("The version of Ok Zoomer that you are currently using is too new, and is not yet supported by MidnightControls!");
return;
}
// Reflect to the ZoomKeyBinds (>= 5.0.0-beta.4) / ZoomKeybinds (<= 5.0.0-beta.3) class.
try {
okZoomerZoomKeybindsClass = Class.forName(okZoomerZoomKeybindsClassString);
} catch (ClassNotFoundException exception) {
// This theoretically should never happen.
MidnightControlsClient.get().warn("MidnightControls failed to reflect to the Ok Zoomer keybinds class!");
exception.printStackTrace();
return;
}
// Reflect to all of the keybind fields.
try {
okZoomerZoomKeyField = okZoomerZoomKeybindsClass.getField(okZoomerZoomKeyFieldString);
okZoomerIncreaseZoomKeyField = okZoomerZoomKeybindsClass.getField(okZoomerIncreaseZoomKeyFieldString);
okZoomerDecreaseZoomKeyField = okZoomerZoomKeybindsClass.getField(okZoomerDecreaseZoomKeyFieldString);
okZoomerResetZoomKeyField = okZoomerZoomKeybindsClass.getField(okZoomerResetZoomKeyFieldString);
} catch (NoSuchFieldException exception) {
MidnightControlsClient.get().warn("MidnightControls failed to reflect to the Ok Zoomer keybind fields!");
exception.printStackTrace();
return;
}
// Initialise KeyBinding objects
try {
okZoomerZoomKey = (KeyBinding) okZoomerZoomKeyField.get(null);
okZoomerIncreaseZoomKey = (KeyBinding) okZoomerIncreaseZoomKeyField.get(null);
okZoomerDecreaseZoomKey = (KeyBinding) okZoomerDecreaseZoomKeyField.get(null);
okZoomerResetZoomKey = (KeyBinding) okZoomerResetZoomKeyField.get(null);
} catch (IllegalAccessException exception) {
MidnightControlsClient.get().warn("MidnightControls failed to reflect to the Ok Zoomer keybind objects!");
exception.printStackTrace();
return;
}
// Reflect to the areExtraKeyBindsEnabled (>= 5.0.0-beta.4) / areExtraKeybindsEnabled (<= 5.0.0-beta.3) method.
// TODO: Consider replacing this entirely with getExtraKeyBind (>= 5.0.0-beta.4) / getExtraKeybind (<= 5.0.0-beta.3) in the future.
try {
okZoomerAreExtraKeyBindsEnabledMethod = okZoomerZoomKeybindsClass.getDeclaredMethod(okZoomerAreExtraKeyBindsEnabledMethodNameString);
} catch (NoSuchMethodException exception) {
MidnightControlsClient.get().warn("MidnightControls failed to reflect to an Ok Zoomer method (areExtraKeyBindsEnabled / areExtraKeybindsEnabled)!");
exception.printStackTrace();
return;
}
didAllReflectionCallsSucceed = true;
}
@Override @Override
public void handle(@NotNull MidnightControlsClient mod) { public void handle(@NotNull MidnightControlsClient mod) {
new ButtonBinding.Builder("zoom") if (didAllReflectionCallsSucceed) {
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP, GLFW.GLFW_GAMEPAD_BUTTON_X) new ButtonBinding.Builder("zoom")
.onlyInGame() .buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP, GLFW.GLFW_GAMEPAD_BUTTON_X)
.cooldown(true) .onlyInGame()
.category(ButtonBinding.MISC_CATEGORY) .cooldown(true)
.linkKeybind(ZoomKeybinds.zoomKey) .category(ButtonBinding.MISC_CATEGORY)
.register(); .linkKeybind(okZoomerZoomKey)
.register();
if (ZoomKeybinds.areExtraKeybindsEnabled()) { boolean okZoomerAreExtraKeyBindsEnabled = false;
new ButtonBinding.Builder("zoom_in") try {
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP, ButtonBinding.axisAsButton(GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER, true)) okZoomerAreExtraKeyBindsEnabled = (boolean) okZoomerAreExtraKeyBindsEnabledMethod.invoke(null);
.onlyInGame() } catch (IllegalAccessException exception) {
.cooldown(true) MidnightControlsClient.get().warn("MidnightControls encountered an IllegalAccessException while attempting to invoke a reflected Ok Zoomer method (areExtraKeyBindsEnabled / areExtraKeybindsEnabled)!");
.category(ButtonBinding.MISC_CATEGORY) exception.printStackTrace();
.linkKeybind(ZoomKeybinds.increaseZoomKey) } catch (InvocationTargetException exception) {
.register(); MidnightControlsClient.get().warn("MidnightControls encountered an InvocationTargetException while attempting to invoke a reflected Ok Zoomer method (areExtraKeyBindsEnabled / areExtraKeybindsEnabled)!");
new ButtonBinding.Builder("zoom_out") exception.printStackTrace();
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP, ButtonBinding.axisAsButton(GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, true)) }
.onlyInGame()
.cooldown(true) if (okZoomerAreExtraKeyBindsEnabled) {
.category(ButtonBinding.MISC_CATEGORY) new ButtonBinding.Builder("zoom_in")
.linkKeybind(ZoomKeybinds.decreaseZoomKey) .buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP, ButtonBinding.axisAsButton(GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER, true))
.register(); .onlyInGame()
new ButtonBinding.Builder("zoom_reset") .cooldown(true)
.onlyInGame() .category(ButtonBinding.MISC_CATEGORY)
.cooldown(true) .linkKeybind(okZoomerIncreaseZoomKey)
.category(ButtonBinding.MISC_CATEGORY) .register();
.linkKeybind(ZoomKeybinds.resetZoomKey) new ButtonBinding.Builder("zoom_out")
.register(); .buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP, ButtonBinding.axisAsButton(GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, true))
.onlyInGame()
.cooldown(true)
.category(ButtonBinding.MISC_CATEGORY)
.linkKeybind(okZoomerDecreaseZoomKey)
.register();
new ButtonBinding.Builder("zoom_reset")
.onlyInGame()
.cooldown(true)
.category(ButtonBinding.MISC_CATEGORY)
.linkKeybind(okZoomerResetZoomKey)
.register();
}
} }
} }
} }

View File

@@ -1,335 +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.compat;
import eu.midnightdust.midnightcontrols.client.ButtonState;
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
import eu.midnightdust.midnightcontrols.client.controller.InputHandlers;
import eu.midnightdust.midnightcontrols.client.controller.PressAction;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.util.Identifier;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import static org.lwjgl.glfw.GLFW.*;
/**
* Represents a compatibility handler for REI.
*
* @author LambdAurora
* @version 1.7.0
* @since 1.2.0
*/
public class ReiCompat implements CompatHandler {
//private static EntryListWidget ENTRY_LIST_WIDGET;
@Override
public void handle(@NotNull MidnightControlsClient mod) {
ButtonBinding.builder(new Identifier("rei", "category_back"))
.buttons(GLFW_GAMEPAD_BUTTON_LEFT_BUMPER)
.filter((client, binding) -> isViewingScreen(client.currentScreen))
.action(handleTab(false))
.cooldown(true)
.register();
ButtonBinding.builder(new Identifier("rei", "category_next"))
.buttons(GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER)
.filter((client, binding) -> isViewingScreen(client.currentScreen))
.action(handleTab(true))
.cooldown(true)
.register();
ButtonBinding.builder(new Identifier("rei", "page_back"))
.buttons(ButtonBinding.axisAsButton(GLFW_GAMEPAD_AXIS_RIGHT_X, false))
.filter((client, binding) -> InputHandlers.inInventory(client, binding) || isViewingScreen(client.currentScreen))
.action(handlePage(false))
.cooldown(true)
.register();
ButtonBinding.builder(new Identifier("rei", "page_next"))
.buttons(ButtonBinding.axisAsButton(GLFW_GAMEPAD_AXIS_RIGHT_X, true))
.filter((client, binding) -> InputHandlers.inInventory(client, binding) || isViewingScreen(client.currentScreen))
.action(handlePage(true))
.cooldown(true)
.register();
ButtonBinding.builder(new Identifier("rei", "recipe_back"))
.buttons(GLFW_GAMEPAD_BUTTON_DPAD_UP)
.filter((client, binding) -> isViewingScreen(client.currentScreen))
.action(handleRecipe(false))
.cooldown(true)
.register();
ButtonBinding.builder(new Identifier("rei", "recipe_next"))
.buttons(GLFW_GAMEPAD_BUTTON_DPAD_DOWN)
.filter((client, binding) -> isViewingScreen(client.currentScreen))
.action(handleRecipe(true))
.cooldown(true)
.register();
// For some reasons this is broken.
ButtonBinding.builder(new Identifier("rei", "show_usage"))
.buttons(GLFW_GAMEPAD_BUTTON_RIGHT_THUMB)
.filter((client, binding) -> InputHandlers.inInventory(client, binding) || isViewingScreen(client.currentScreen))
.action(handleShowRecipeUsage(true))
.cooldown(true)
.register();
ButtonBinding.builder(new Identifier("rei", "show_recipe"))
.buttons(GLFW_GAMEPAD_BUTTON_LEFT_THUMB)
.filter((client, binding) -> InputHandlers.inInventory(client, binding) || isViewingScreen(client.currentScreen))
.action(handleShowRecipeUsage(false))
.cooldown(true)
.register();
}
@Override
public boolean requireMouseOnScreen(Screen screen) {
return isViewingScreen(screen) /*|| screen instanceof PreRecipeViewingScreen*/;
}
@Override
public @Nullable SlotPos getSlotAt(@NotNull Screen screen, int mouseX, int mouseY) {
/*var overlay = ScreenHelper.getOptionalOverlay();
if (overlay.isPresent() && overlay.get().isInside(mouseX, mouseY)) {
var widget = getEntryListWidget();
if (widget == null)
return null;
var slot = this.getSlotAt(widget, mouseX, mouseY, false);
if (slot != null && slot != INVALID_SLOT)
return slot;
} else if (isViewingScreen(screen)) {
for (var element : screen.children()) {
var slot = this.getSlotAt(element, mouseX, mouseY, true);
if (slot != null && slot != INVALID_SLOT)
return slot;
}
}*/
return null;
}
/*private @Nullable SlotPos getSlotAt(@NotNull Element element, int mouseX, int mouseY, boolean allowEmpty) {
if (element instanceof EntryWidget entry) {
if (entry.containsMouse(mouseX, mouseY)) {
if (!allowEmpty && entry.entries().isEmpty())
return INVALID_SLOT;
return new SlotPos(entry.getBounds().getX() + 1, entry.getBounds().getY() + 1);
}
} else if (element instanceof EntryListWidget) {
List<EntryListEntryWidget> entries = ((EntryListWidgetAccessor) element).getEntries();
for (EntryListEntryWidget entry : entries) {
var slot = this.getSlotAt(entry, mouseX, mouseY, allowEmpty);
if (slot != null && slot != INVALID_SLOT)
return slot;
}
} else if (!(element instanceof ButtonWidget) && element instanceof WidgetWithBounds widgetWithBounds) {
for (var child : widgetWithBounds.children()) {
var slot = this.getSlotAt(child, mouseX, mouseY, allowEmpty);
if (slot != null && slot != INVALID_SLOT)
return slot;
}
}
return null;
}*/
private static boolean isViewingScreen(Screen screen) {
return true;
//return screen instanceof DefaultDisplayViewingScreen || screen instanceof CompositeDisplayViewingScreen;
}
@Override
public boolean handleMenuBack(@NotNull MinecraftClient client, @NotNull Screen screen) {
if (!isViewingScreen(screen))
return false;
/*MinecraftClient.getInstance().openScreen(REIRuntimeImpl.getInstance().getPreviousContainerScreen());
ScreenHelper.getLastOverlay().init();*/
return true;
}
/*private static EntryListWidget getEntryListWidget() {
if (ENTRY_LIST_WIDGET == null) {
ENTRY_LIST_WIDGET = LambdaReflection.getFirstFieldOfType(ContainerScreenOverlay.class, EntryListWidget.class)
.map(field -> (EntryListWidget) LambdaReflection.getFieldValue(null, field))
.orElse(null);
}
return ENTRY_LIST_WIDGET;
}
private static @Nullable EntryStack getCurrentStack(@NotNull MinecraftClient client) {
double x = client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth();
double y = client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight();
if (isViewingScreen(client.currentScreen)) {
for (var element : client.currentScreen.children()) {
var stack = getCurrentStack(element, x, y);
if (stack != null)
return stack;
}
}
var overlay = ScreenHelper.getOptionalOverlay();
if (!overlay.isPresent())
return RecipeHelper.getInstance().getScreenFocusedStack(client.currentScreen);
var widget = getEntryListWidget();
if (widget == null)
return RecipeHelper.getInstance().getScreenFocusedStack(client.currentScreen);
return getCurrentStack(widget, x, y);
}
private static @Nullable EntryStack getCurrentStack(@NotNull Element element, double mouseX, double mouseY) {
if (element instanceof EntryWidget entry) {
if (entry.containsMouse(mouseX, mouseY))
return ((EntryWidgetAccessor) entry).midnightcontrols_getCurrentEntry();
} else if (element instanceof EntryListWidget) {
var entries = ((EntryListWidgetAccessor) element).getEntries();
for (EntryListEntryWidget entry : entries) {
if (entry.containsMouse(mouseX, mouseY)) {
return ((EntryWidgetAccessor) entry).midnightcontrols_getCurrentEntry();
}
}
} else if (!(element instanceof ButtonWidget) && element instanceof WidgetWithBounds widgetWithBounds) {
for (var child : widgetWithBounds.children()) {
var stack = getCurrentStack(child, mouseX, mouseY);
if (stack != null)
return stack;
}
}
return null;
}*/
private static PressAction handleShowRecipeUsage(boolean usage) {
return (client, button, value, action) -> {
if (action.isUnpressed())
return false;
/*EntryStack stack = RecipeHelper.getInstance().getScreenFocusedStack(client.currentScreen);
if (stack == null) {
stack = getCurrentStack(client);
}
if (stack != null && !stack.isEmpty()) {
stack = stack.copy();
if (usage) {
return ClientHelper.getInstance().openView(ClientHelper.ViewSearchBuilder.builder().addUsagesFor(stack).setInputNotice(stack).fillPreferredOpenedCategory());
} else {
return ClientHelper.getInstance().openView(ClientHelper.ViewSearchBuilder.builder().addRecipesFor(stack).setOutputNotice(stack).fillPreferredOpenedCategory());
}
}*/
return false;
};
}
private static PressAction handlePage(boolean next) {
return (client, button, value, action) -> {
if (action == ButtonState.RELEASE)
return false;
/*Optional<ContainerScreenOverlay> overlay = ScreenHelper.getOptionalOverlay();
if (!overlay.isPresent())
return false;
var widget = getEntryListWidget();
if (widget == null)
return false;
if (next)
widget.nextPage();
else
widget.previousPage();
widget.updateEntriesPosition();*/
return true;
};
}
/**
* Returns the handler for category tabs buttons.
*
* @param next True if the action is to switch to the next tab.
* @return The handler.
*/
private static PressAction handleTab(boolean next) {
return (client, button, value, action) -> {
if (action != ButtonState.RELEASE)
return false;
/*if (client.currentScreen instanceof DefaultDisplayViewingScreen) {
RecipeViewingScreenAccessor screen = (RecipeViewingScreenAccessor) client.currentScreen;
if (next)
screen.getCategoryNext().onClick();
else
screen.getCategoryBack().onClick();
return true;
} else if (client.currentScreen instanceof CompositeDisplayViewingScreen) {
VillagerRecipeViewingScreenAccessor screen = (VillagerRecipeViewingScreenAccessor) client.currentScreen;
List<RecipeCategory<?>> categories = screen.getCategories();
int currentTab = screen.getSelectedCategoryIndex();
screen.setSelectedCategoryIndex(getNextIndex(currentTab, categories.size(), next));
screen.setSelectedRecipeIndex(0);
screen.midnightcontrols_init();
return true;
}*/
return false;
};
}
private static PressAction handleRecipe(boolean next) {
return (client, button, value, action) -> {
if (action.isUnpressed())
return false;
/*if (client.currentScreen instanceof RecipeViewingScreenAccessor screen) {
if (next)
screen.getRecipeNext().onClick();
else
screen.getRecipeBack().onClick();
return true;
} else if (client.currentScreen instanceof VillagerRecipeViewingScreenAccessor screen) {
List<RecipeCategory<?>> categories = screen.getCategories();
int currentTab = screen.getSelectedCategoryIndex();
List<RecipeDisplay> recipes = screen.getCategoryMap().get(categories.get(currentTab));
if (recipes.size() == 0)
return true;
int currentRecipe = screen.getSelectedRecipeIndex();
int nextRecipe = getNextIndex(currentRecipe, recipes.size(), next);
if (nextRecipe == 0) {
screen.getScrolling().scrollTo(0.0, true);
} else if (nextRecipe == recipes.size() - 1) {
screen.getScrolling().scrollTo(screen.getScrolling().getMaxScroll(), true);
} else {
double scrollAmount = screen.getScrolling().getMaxScroll() / (float) recipes.size();
screen.getScrolling().offset(next ? scrollAmount : -scrollAmount, true);
}
screen.setSelectedRecipeIndex(nextRecipe);
screen.midnightcontrols_init();
return true;
}*/
return false;
};
}
private static int getNextIndex(int currentIndex, int size, boolean next) {
int nextIndex = currentIndex + (next ? 1 : -1);
if (nextIndex < 0)
nextIndex = size - 1;
else if (nextIndex >= size)
nextIndex = 0;
return nextIndex;
}
}

View File

@@ -0,0 +1,43 @@
package eu.midnightdust.midnightcontrols.client.compat;
import eu.midnightdust.midnightcontrols.MidnightControls;
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
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.options.control.ControlElement;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen;
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) {
if (screen instanceof SodiumOptionsGUI optionsGUI) {
SodiumOptionsGUIAccessor accessor = (SodiumOptionsGUIAccessor) optionsGUI;
final int max = accessor.getPages().size()-1;
int i = accessor.getPages().indexOf(accessor.getCurrentPage());
i = (direction ? ((max > i) ? ++i : 0) : (i > 0 ? --i : max));
if (MidnightControlsConfig.debug) MidnightControls.get().log(""+i);
optionsGUI.setPage(accessor.getPages().get(i));
}
}
}

View File

@@ -1,23 +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.compat.mixin;
/**
* Represents an accessor to REI's EntryListWidget.
*
* @author LambdAurora
* @version 1.5.0
* @since 1.5.0
*/
//@Mixin(value = EntryListWidget.class, remap = false)
public interface EntryListWidgetAccessor {
/*@Accessor(value = "entries")
List<EntryListEntryWidget> getEntries();*/
}

View File

@@ -1,23 +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.compat.mixin;
/**
* Represents an accessor to REI's EntryWidget.
*
* @author LambdAurora
* @version 1.5.0
* @since 1.5.0
*/
//@Mixin(value = EntryWidget.class, remap = false)
public interface EntryWidgetAccessor {
/*@Invoker("getCurrentEntry")
EntryStack midnightcontrols_getCurrentEntry();*/
}

View File

@@ -1,32 +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.compat.mixin;
/**
* Represents an accessor to REI's RecipeViewingScreen.
*
* @author LambdAurora
* @version 1.7.0
* @since 1.2.0
*/
//@Mixin(value = DefaultDisplayViewingScreen.class, remap = false)
public interface RecipeViewingScreenAccessor {
/*@Accessor("categoryBack")
Button getCategoryBack();
@Accessor("categoryNext")
Button getCategoryNext();
@Accessor("recipeBack")
Button getRecipeBack();
@Accessor("recipeNext")
Button getRecipeNext();*/
}

View File

@@ -0,0 +1,19 @@
package eu.midnightdust.midnightcontrols.client.compat.mixin;
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.control.ControlElement;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.List;
@Mixin(value = SodiumOptionsGUI.class, remap = false)
public interface SodiumOptionsGUIAccessor {
@Accessor
List<ControlElement<?>> getControls();
@Accessor
List<OptionPage> getPages();
@Accessor
OptionPage getCurrentPage();
}

View File

@@ -1,44 +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.compat.mixin;
/**
* Represents an accessor to REI's VillagerRecipeViewingScreen.
*
* @author LambdAurora
* @version 1.7.0
* @since 1.2.0
*/
//@Mixin(CompositeDisplayViewingScreen.class)
public interface VillagerRecipeViewingScreenAccessor {
/*@Accessor(value = "categoryMap", remap = false)
Map<DisplayCategory<?>, List<Display>> getCategoryMap();
@Accessor(value = "categories", remap = false)
List<DisplayCategory<?>> getCategories();
@Accessor(value = "selectedCategoryIndex", remap = false)
int getSelectedCategoryIndex();
@Accessor(value = "selectedCategoryIndex", remap = false)
void setSelectedCategoryIndex(int selectedCategoryIndex);
@Accessor(value = "selectedRecipeIndex", remap = false)
int getSelectedRecipeIndex();
@Accessor(value = "selectedRecipeIndex", remap = false)
void setSelectedRecipeIndex(int selectedRecipeIndex);
@Accessor(value = "scrolling", remap = false)
ScrollingContainer getScrolling();
@Invoker("init")
void midnightcontrols_init();*/
}

View File

@@ -10,11 +10,13 @@
package eu.midnightdust.midnightcontrols.client.controller; package eu.midnightdust.midnightcontrols.client.controller;
import eu.midnightdust.midnightcontrols.client.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.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;
@@ -44,6 +46,15 @@ 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();
@@ -52,6 +63,8 @@ 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();
@@ -62,6 +75,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)
.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)
@@ -70,16 +86,25 @@ 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).onlyInGame().register(); public static final ButtonBinding SPRINT = new Builder("sprint").buttons(GLFW_GAMEPAD_BUTTON_LEFT_THUMB).onlyInGame().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)).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)).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 TOGGLE_PERSPECTIVE = new Builder("toggle_perspective").buttons(GLFW_GAMEPAD_BUTTON_DPAD_UP, GLFW_GAMEPAD_BUTTON_Y).cooldown().register(); 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();
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();
public static final ButtonBinding TAKE = new Builder("take").buttons(GLFW_GAMEPAD_BUTTON_X)
.action(InputHandlers.handleActions()).filter(InputHandlers::inInventory).cooldown().register();
public static final ButtonBinding TAKE_ALL = new Builder("take_all").buttons(GLFW_GAMEPAD_BUTTON_A)
.action(InputHandlers.handleActions()).filter(InputHandlers::inInventory).cooldown().register();
public static final ButtonBinding QUICK_MOVE = new Builder("quick_move").buttons(GLFW_GAMEPAD_BUTTON_Y)
.action(InputHandlers.handleActions()).filter(InputHandlers::inInventory).cooldown().register();
public static final ButtonBinding TOGGLE_PERSPECTIVE = new Builder("toggle_perspective").filter(InputHandlers::inGame).buttons(GLFW_GAMEPAD_BUTTON_DPAD_UP, GLFW_GAMEPAD_BUTTON_Y).cooldown().register();
public static final ButtonBinding USE = new Builder("use").buttons(axisAsButton(GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, true)).register(); public static final ButtonBinding USE = new Builder("use").buttons(axisAsButton(GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, true)).register();
private int[] button; private int[] button;
@@ -90,21 +115,34 @@ 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 = new TranslatableText(this.key); this.text = Text.translatable(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.
@@ -221,7 +259,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 = 5; this.cooldown = cooldownLength;
} }
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))
@@ -239,7 +277,7 @@ public class ButtonBinding {
* @return the translation key * @return the translation key
*/ */
public @NotNull String getTranslationKey() { public @NotNull String getTranslationKey() {
return "midnightcontrols.action." + this.getName(); return I18n.hasTranslation("midnightcontrols.action." + this.getName()) ? "midnightcontrols.action." + this.getName() : this.getName();
} }
public @NotNull Text getText() { public @NotNull Text getText() {
@@ -295,24 +333,23 @@ public class ButtonBinding {
} }
public static void init(@NotNull GameOptions options) { public static void init(@NotNull GameOptions options) {
ATTACK.mcKeyBinding = options.keyAttack; ATTACK.mcKeyBinding = options.attackKey;
BACK.mcKeyBinding = options.keyBack; BACK.mcKeyBinding = options.backKey;
CHAT.mcKeyBinding = options.keyChat; CHAT.mcKeyBinding = options.chatKey;
DROP_ITEM.mcKeyBinding = options.keyDrop; DROP_ITEM.mcKeyBinding = options.dropKey;
FORWARD.mcKeyBinding = options.keyForward; FORWARD.mcKeyBinding = options.forwardKey;
INVENTORY.mcKeyBinding = options.keyInventory; INVENTORY.mcKeyBinding = options.inventoryKey;
JUMP.mcKeyBinding = options.keyJump; JUMP.mcKeyBinding = options.jumpKey;
LEFT.mcKeyBinding = options.keyLeft; LEFT.mcKeyBinding = options.leftKey;
PICK_BLOCK.mcKeyBinding = options.keyPickItem; PICK_BLOCK.mcKeyBinding = options.pickItemKey;
PLAYER_LIST.mcKeyBinding = options.keyPlayerList; PLAYER_LIST.mcKeyBinding = options.playerListKey;
RIGHT.mcKeyBinding = options.keyRight; RIGHT.mcKeyBinding = options.rightKey;
SCREENSHOT.mcKeyBinding = options.keyScreenshot; SCREENSHOT.mcKeyBinding = options.screenshotKey;
SMOOTH_CAMERA.mcKeyBinding = options.keySmoothCamera; SNEAK.mcKeyBinding = options.sneakKey;
SNEAK.mcKeyBinding = options.keySneak; SPRINT.mcKeyBinding = options.sprintKey;
SPRINT.mcKeyBinding = options.keySprint; SWAP_HANDS.mcKeyBinding = options.swapHandsKey;
SWAP_HANDS.mcKeyBinding = options.keySwapHands; TOGGLE_PERSPECTIVE.mcKeyBinding = options.togglePerspectiveKey;
TOGGLE_PERSPECTIVE.mcKeyBinding = options.keyTogglePerspective; USE.mcKeyBinding = options.useKey;
USE.mcKeyBinding = options.keyUse;
} }
/** /**
@@ -323,37 +360,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 -> new TranslatableText("key.keyboard.unknown"); case -1 -> Text.translatable("key.keyboard.unknown");
case GLFW_GAMEPAD_BUTTON_A -> new TranslatableText("midnightcontrols.button.a"); case GLFW_GAMEPAD_BUTTON_A -> Text.translatable("midnightcontrols.button.a");
case GLFW_GAMEPAD_BUTTON_B -> new TranslatableText("midnightcontrols.button.b"); case GLFW_GAMEPAD_BUTTON_B -> Text.translatable("midnightcontrols.button.b");
case GLFW_GAMEPAD_BUTTON_X -> new TranslatableText("midnightcontrols.button.x"); case GLFW_GAMEPAD_BUTTON_X -> Text.translatable("midnightcontrols.button.x");
case GLFW_GAMEPAD_BUTTON_Y -> new TranslatableText("midnightcontrols.button.y"); case GLFW_GAMEPAD_BUTTON_Y -> Text.translatable("midnightcontrols.button.y");
case GLFW_GAMEPAD_BUTTON_LEFT_BUMPER -> new TranslatableText("midnightcontrols.button.left_bumper"); case GLFW_GAMEPAD_BUTTON_LEFT_BUMPER -> Text.translatable("midnightcontrols.button.left_bumper");
case GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER -> new TranslatableText("midnightcontrols.button.right_bumper"); case GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER -> Text.translatable("midnightcontrols.button.right_bumper");
case GLFW_GAMEPAD_BUTTON_BACK -> new TranslatableText("midnightcontrols.button.back"); case GLFW_GAMEPAD_BUTTON_BACK -> Text.translatable("midnightcontrols.button.back");
case GLFW_GAMEPAD_BUTTON_START -> new TranslatableText("midnightcontrols.button.start"); case GLFW_GAMEPAD_BUTTON_START -> Text.translatable("midnightcontrols.button.start");
case GLFW_GAMEPAD_BUTTON_GUIDE -> new TranslatableText("midnightcontrols.button.guide"); case GLFW_GAMEPAD_BUTTON_GUIDE -> Text.translatable("midnightcontrols.button.guide");
case GLFW_GAMEPAD_BUTTON_LEFT_THUMB -> new TranslatableText("midnightcontrols.button.left_thumb"); case GLFW_GAMEPAD_BUTTON_LEFT_THUMB -> Text.translatable("midnightcontrols.button.left_thumb");
case GLFW_GAMEPAD_BUTTON_RIGHT_THUMB -> new TranslatableText("midnightcontrols.button.right_thumb"); case GLFW_GAMEPAD_BUTTON_RIGHT_THUMB -> Text.translatable("midnightcontrols.button.right_thumb");
case GLFW_GAMEPAD_BUTTON_DPAD_UP -> new TranslatableText("midnightcontrols.button.dpad_up"); case GLFW_GAMEPAD_BUTTON_DPAD_UP -> Text.translatable("midnightcontrols.button.dpad_up");
case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT -> new TranslatableText("midnightcontrols.button.dpad_right"); case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT -> Text.translatable("midnightcontrols.button.dpad_right");
case GLFW_GAMEPAD_BUTTON_DPAD_DOWN -> new TranslatableText("midnightcontrols.button.dpad_down"); case GLFW_GAMEPAD_BUTTON_DPAD_DOWN -> Text.translatable("midnightcontrols.button.dpad_down");
case GLFW_GAMEPAD_BUTTON_DPAD_LEFT -> new TranslatableText("midnightcontrols.button.dpad_left"); case GLFW_GAMEPAD_BUTTON_DPAD_LEFT -> Text.translatable("midnightcontrols.button.dpad_left");
case 100 -> new TranslatableText("midnightcontrols.axis.left_x+"); case 100 -> Text.translatable("midnightcontrols.axis.left_x+");
case 101 -> new TranslatableText("midnightcontrols.axis.left_y+"); case 101 -> Text.translatable("midnightcontrols.axis.left_y+");
case 102 -> new TranslatableText("midnightcontrols.axis.right_x+"); case 102 -> Text.translatable("midnightcontrols.axis.right_x+");
case 103 -> new TranslatableText("midnightcontrols.axis.right_y+"); case 103 -> Text.translatable("midnightcontrols.axis.right_y+");
case 104 -> new TranslatableText("midnightcontrols.axis.left_trigger"); case 104 -> Text.translatable("midnightcontrols.axis.left_trigger");
case 105 -> new TranslatableText("midnightcontrols.axis.right_trigger"); case 105 -> Text.translatable("midnightcontrols.axis.right_trigger");
case 200 -> new TranslatableText("midnightcontrols.axis.left_x-"); case 200 -> Text.translatable("midnightcontrols.axis.left_x-");
case 201 -> new TranslatableText("midnightcontrols.axis.left_y-"); case 201 -> Text.translatable("midnightcontrols.axis.left_y-");
case 202 -> new TranslatableText("midnightcontrols.axis.right_x-"); case 202 -> Text.translatable("midnightcontrols.axis.right_x-");
case 203 -> new TranslatableText("midnightcontrols.axis.right_y-"); case 203 -> Text.translatable("midnightcontrols.axis.right_y-");
case 15 -> new TranslatableText("midnightcontrols.button.l4"); case 15 -> Text.translatable("midnightcontrols.button.l4");
case 16 -> new TranslatableText("midnightcontrols.button.l5"); case 16 -> Text.translatable("midnightcontrols.button.l5");
case 17 -> new TranslatableText("midnightcontrols.button.r4"); case 17 -> Text.translatable("midnightcontrols.button.r4");
case 18 -> new TranslatableText("midnightcontrols.button.r5"); case 18 -> Text.translatable("midnightcontrols.button.r5");
default -> new TranslatableText("midnightcontrols.button.unknown", button); default -> Text.translatable("midnightcontrols.button.unknown", button);
}; };
} }
@@ -372,18 +409,33 @@ 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,
ButtonBinding.INVENTORY, ButtonBinding.INVENTORY,
ButtonBinding.SWAP_HANDS ButtonBinding.SWAP_HANDS,
ButtonBinding.TAB_LEFT,
ButtonBinding.TAB_RIGHT,
ButtonBinding.PAGE_LEFT,
ButtonBinding.PAGE_RIGHT,
ButtonBinding.TAKE,
ButtonBinding.TAKE_ALL,
ButtonBinding.QUICK_MOVE,
ButtonBinding.SLOT_UP,
ButtonBinding.SLOT_DOWN,
ButtonBinding.SLOT_LEFT,
ButtonBinding.SLOT_RIGHT
)); ));
MULTIPLAYER_CATEGORY = InputManager.registerDefaultCategory("key.categories.multiplayer", MULTIPLAYER_CATEGORY = InputManager.registerDefaultCategory("key.categories.multiplayer",
category -> category.registerAllBindings(ButtonBinding.CHAT, ButtonBinding.PLAYER_LIST)); category -> category.registerAllBindings(ButtonBinding.CHAT, ButtonBinding.PLAYER_LIST));
MISC_CATEGORY = InputManager.registerDefaultCategory("key.categories.misc", category -> category.registerAllBindings( MISC_CATEGORY = InputManager.registerDefaultCategory("key.categories.misc", category -> category.registerAllBindings(
ButtonBinding.SCREENSHOT, ButtonBinding.SCREENSHOT,
ButtonBinding.TOGGLE_PERSPECTIVE,
ButtonBinding.PAUSE_GAME,
//SMOOTH_CAMERA, //SMOOTH_CAMERA,
ButtonBinding.TOGGLE_PERSPECTIVE ButtonBinding.DEBUG_SCREEN,
ButtonBinding.CONTROLS_RING
)); ));
} }
@@ -412,6 +464,7 @@ 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;
@@ -426,7 +479,7 @@ public class ButtonBinding {
} }
public Builder(@NotNull Identifier identifier) { public Builder(@NotNull Identifier identifier) {
this(identifier.getNamespace() + "." + identifier.getNamespace()); this(identifier.getNamespace() + "." + identifier.getPath());
} }
/** /**
@@ -514,6 +567,17 @@ 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}.
@@ -553,7 +617,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); var binding = new ButtonBinding(this.key, this.buttons, this.actions, this.filter, this.cooldown, this.cooldownLength);
if (this.category != null) if (this.category != null)
this.category.registerBinding(binding); this.category.registerBinding(binding);
if (this.mcBinding != null) if (this.mcBinding != null)

View File

@@ -13,9 +13,9 @@ 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 net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
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.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;
@@ -23,7 +23,8 @@ import org.lwjgl.glfw.GLFWGamepadState;
import org.lwjgl.system.MemoryStack; import org.lwjgl.system.MemoryStack;
import org.lwjgl.system.MemoryUtil; import org.lwjgl.system.MemoryUtil;
import java.io.IOException; import java.io.*;
import java.net.URL;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Paths; import java.nio.file.Paths;
@@ -136,7 +137,7 @@ public record Controller(int id) implements Nameable {
} }
} }
buffer.flip(); // Force Java 8 >.< if (buffer != null) buffer.flip(); // Force Java 8 >.<
return buffer; return buffer;
} }
@@ -145,11 +146,24 @@ public record Controller(int id) implements Nameable {
*/ */
public static void updateMappings() { public static void updateMappings() {
try { try {
MidnightControlsClient.get().log("Updating controller mappings...");
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 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; return;
MidnightControlsClient.get().log("Updating controller mappings...");
var buffer = ioResourceToBuffer(MidnightControlsClient.MAPPINGS_FILE.getPath(), 1024); var buffer = ioResourceToBuffer(MidnightControlsClient.MAPPINGS_FILE.getPath(), 1024);
GLFW.glfwUpdateGamepadMappings(buffer); if (buffer != null) GLFW.glfwUpdateGamepadMappings(buffer);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
@@ -163,7 +177,8 @@ public record Controller(int id) implements Nameable {
var client = MinecraftClient.getInstance(); var client = MinecraftClient.getInstance();
if (client != null) { if (client != null) {
client.getToastManager().add(SystemToast.create(client, SystemToast.Type.TUTORIAL_HINT, client.getToastManager().add(SystemToast.create(client, SystemToast.Type.TUTORIAL_HINT,
new TranslatableText("midnightcontrols.controller.mappings.error"), new LiteralText(string))); Text.translatable("midnightcontrols.controller.mappings.error"), Text.literal(string)));
MidnightControls.get().log(I18n.translate("midnightcontrols.controller.mappings.error")+string);
} }
} }
} catch (Throwable e) { } catch (Throwable e) {

View File

@@ -10,27 +10,40 @@
package eu.midnightdust.midnightcontrols.client.controller; package eu.midnightdust.midnightcontrols.client.controller;
import eu.midnightdust.midnightcontrols.client.ButtonState; import eu.midnightdust.midnightcontrols.client.ButtonState;
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
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.MidnightControlsCompat;
import eu.midnightdust.midnightcontrols.client.compat.SodiumCompat;
import eu.midnightdust.midnightcontrols.client.gui.RingScreen;
import eu.midnightdust.midnightcontrols.client.mixin.AdvancementsScreenAccessor; import eu.midnightdust.midnightcontrols.client.mixin.AdvancementsScreenAccessor;
import eu.midnightdust.midnightcontrols.client.mixin.CreativeInventoryScreenAccessor; import eu.midnightdust.midnightcontrols.client.mixin.CreativeInventoryScreenAccessor;
import eu.midnightdust.midnightcontrols.client.mixin.RecipeBookWidgetAccessor; import eu.midnightdust.midnightcontrols.client.mixin.RecipeBookWidgetAccessor;
import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor; import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor;
import eu.midnightdust.midnightcontrols.client.util.MouseAccessor;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gl.Framebuffer; import net.minecraft.client.gui.screen.TitleScreen;
import net.minecraft.client.gui.screen.advancement.AdvancementsScreen; import net.minecraft.client.gui.screen.advancement.AdvancementsScreen;
import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.gui.screen.ingame.*;
import net.minecraft.client.gui.screen.ingame.InventoryScreen; import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget;
import net.minecraft.client.gui.widget.PressableWidget;
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.screen.slot.Slot; import net.minecraft.screen.slot.Slot;
import net.minecraft.screen.slot.SlotActionType;
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 java.util.Comparator; import java.util.Comparator;
import java.util.Optional; import java.util.Optional;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_2;
/** /**
* Represents some input handlers. * Represents some input handlers.
* *
@@ -50,12 +63,14 @@ public class InputHandlers {
// When ingame // When ingame
if (client.currentScreen == null && client.player != null) { if (client.currentScreen == null && client.player != null) {
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);
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) {
int currentTab = inventory.getSelectedTab(); int currentTab = CreativeInventoryScreenAccessor.getSelectedTab();
int nextTab = currentTab + (next ? 1 : -1); int nextTab = currentTab + (next ? 1 : -1);
if (nextTab < 0) if (nextTab < 0)
nextTab = ItemGroup.GROUPS.length - 1; nextTab = ItemGroup.GROUPS.length - 1;
@@ -63,21 +78,27 @@ public class InputHandlers {
nextTab = 0; nextTab = 0;
inventory.midnightcontrols$setSelectedTab(ItemGroup.GROUPS[nextTab]); inventory.midnightcontrols$setSelectedTab(ItemGroup.GROUPS[nextTab]);
return true; return true;
} else if (client.currentScreen instanceof InventoryScreen inventoryScreen) { } else if (client.currentScreen instanceof InventoryScreen || client.currentScreen instanceof CraftingScreen || client.currentScreen instanceof AbstractFurnaceScreen<?>) {
var recipeBook = (RecipeBookWidgetAccessor) inventoryScreen.getRecipeBookWidget(); RecipeBookWidget recipeBook;
var tabs = recipeBook.getTabButtons(); if (client.currentScreen instanceof InventoryScreen inventoryScreen) recipeBook = inventoryScreen.getRecipeBookWidget();
var currentTab = recipeBook.getCurrentTab(); else if (client.currentScreen instanceof CraftingScreen craftingScreen) recipeBook = craftingScreen.getRecipeBookWidget();
if (currentTab == null) else recipeBook = ((AbstractFurnaceScreen<?>)client.currentScreen).getRecipeBookWidget();
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);
recipeBook.setCurrentTab(currentTab = tabs.get(nextTab)); recipeBookAccessor.setCurrentTab(currentTab = tabs.get(nextTab));
currentTab.setToggled(true); currentTab.setToggled(true);
recipeBook.midnightcontrols$refreshResults(true); recipeBookAccessor.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().collect(Collectors.toList()); var tabs = screen.getTabs().values().stream().distinct().collect(Collectors.toList());
@@ -96,20 +117,119 @@ public class InputHandlers {
} }
} }
return true; return true;
} else {
if (FabricLoader.getInstance().isModLoaded("sodium")) SodiumCompat.handleTabs(client.currentScreen, next);
}
if (MidnightControlsCompat.isInventoryTabsPresent()) InventoryTabsCompat.handleInventoryTabs(client.currentScreen, next);
return false;
};
}
public static PressAction handlePage(boolean next) {
return (client, button, value, action) -> {
if (client.currentScreen instanceof CreativeInventoryScreen) {
var screen = (HandledScreenAccessor) client.currentScreen;
try {
if (next) {
return client.currentScreen.children().stream().filter(element -> element instanceof PressableWidget)
.map(element -> (PressableWidget) element)
.filter(element -> element.getMessage() != null && element.getMessage().getContent() != null)
.anyMatch(element -> {
if (element.getMessage().getString().equals(">")) {
element.onPress();
return true;
}
return false;
});
} else {
return client.currentScreen.children().stream().filter(element -> element instanceof PressableWidget)
.map(element -> (PressableWidget) element)
.filter(element -> element.getMessage() != null && element.getMessage().getContent() != null)
.anyMatch(element -> {
if (element.getMessage().getString().equals("<")) {
element.onPress();
return true;
}
return false;
});
}
} 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;
}; };
} }
public static PressAction handleActions() {
return (client, button, value, action) -> {
if (!(client.currentScreen instanceof HandledScreen<?> screen)) return false;
if (client.interactionManager == null || client.player == null)
return false;
if (MidnightControlsClient.get().input.inventoryInteractionCooldown > 0)
return true;
double x = client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth();
double y = client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight();
var accessor = (HandledScreenAccessor) screen;
Slot slot = ((HandledScreenAccessor) screen).midnightcontrols$getSlotAt(x, y);
int slotId;
if (slot == null) {
if (button.getName().equals("take_all")) {
((MouseAccessor) client.mouse).setLeftButtonClicked(true);
return false;
}
slotId = accessor.midnightcontrols$isClickOutsideBounds(x, y, accessor.getX(), accessor.getY(), GLFW_MOUSE_BUTTON_1) ? -999 : -1;
} else {
slotId = slot.id;
}
var actionType = SlotActionType.PICKUP;
int clickData = GLFW.GLFW_MOUSE_BUTTON_1;
MidnightControlsClient.get().input.inventoryInteractionCooldown = 5;
switch (button.getName()) {
case "take_all": {
if (screen instanceof CreativeInventoryScreen) {
if (slot != null && (((CreativeInventoryScreenAccessor) accessor).midnightcontrols$isCreativeInventorySlot(slot) || MidnightControlsCompat.streamCompatHandlers().anyMatch(handler -> handler.isCreativeSlot(screen, slot))))
actionType = SlotActionType.CLONE;
}
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);
return true;
};
}
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) if (client.currentScreen == null || client.currentScreen instanceof RingScreen)
client.openPauseMenu(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.
client.currentScreen.onClose(); client.currentScreen.close();
} }
return true; return true;
} }
@@ -131,12 +251,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.sneakToggled; boolean sneakToggled = client.options.getSneakToggled().getValue();
if (client.player.getAbilities().flying && sneakToggled) if (client.player.getAbilities().flying && sneakToggled)
client.options.sneakToggled = false; client.options.getSneakToggled().setValue(false);
binding.setPressed(button.pressed); binding.setPressed(button.pressed);
if (client.player.getAbilities().flying && sneakToggled) if (client.player.getAbilities().flying && sneakToggled)
client.options.sneakToggled = true; client.options.getSneakToggled().setValue(true);
}); });
return true; return true;
} }
@@ -227,7 +347,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; return (client.currentScreen == null && MidnightControlsClient.get().input.screenCloseCooldown <= 0) || client.currentScreen instanceof RingScreen;
} }
/** /**

View File

@@ -17,6 +17,7 @@ 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;
@@ -42,15 +43,19 @@ public class InputManager {
private static final List<ButtonCategory> CATEGORIES = new ArrayList<>(); private static final List<ButtonCategory> CATEGORIES = new ArrayList<>();
public static final Int2ObjectMap<ButtonState> STATES = new Int2ObjectOpenHashMap<>(); public static final Int2ObjectMap<ButtonState> STATES = new Int2ObjectOpenHashMap<>();
public static final Int2FloatMap BUTTON_VALUES = new Int2FloatOpenHashMap(); public static final Int2FloatMap BUTTON_VALUES = new Int2FloatOpenHashMap();
private int prevTargetMouseX = 0; public int prevTargetMouseX = 0;
private int prevTargetMouseY = 0; public int prevTargetMouseY = 0;
private int targetMouseX = 0; public int targetMouseX = 0;
private int targetMouseY = 0; public int targetMouseY = 0;
protected InputManager() { protected InputManager() {
} }
public void tick(@NotNull MinecraftClient client) { public void tick(@NotNull MinecraftClient client) {
if (MidnightControlsConfig.autoSwitchMode && !MidnightControlsConfig.isEditing && MidnightControlsConfig.controlsMode != ControlsMode.TOUCHSCREEN)
if (MidnightControlsConfig.getController().isConnected() && MidnightControlsConfig.getController().isGamepad())
MidnightControlsConfig.controlsMode = ControlsMode.CONTROLLER;
else MidnightControlsConfig.controlsMode = ControlsMode.DEFAULT;
if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER) { if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER) {
this.controllerTick(client); this.controllerTick(client);
} }
@@ -124,6 +129,29 @@ 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.

View File

@@ -13,7 +13,17 @@ import eu.midnightdust.midnightcontrols.client.ButtonState;
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 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.client.tutorial.MovementTutorialStepHandler;
import net.minecraft.client.util.InputUtil;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.enchantment.Enchantments;
import net.minecraft.enchantment.SoulSpeedEnchantment;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.NbtList;
import net.minecraft.nbt.scanner.SimpleNbtScanner;
import net.minecraft.util.math.MathHelper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** /**
@@ -79,18 +89,20 @@ public final class MovementHandler implements PressAction {
this.pressingBack = direction < 0; this.pressingBack = direction < 0;
this.movementForward = direction * value; this.movementForward = direction * value;
// Slowing down if sneaking. // Slowing down if sneaking or crawling.
if (client.player.input.sneaking) if (client.player.shouldSlowDown()) {
this.movementForward *= 0.3D; this.movementForward *= MathHelper.clamp(0.3F + EnchantmentHelper.getSwiftSneakSpeedBoost(client.player), 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. // Slowing down if sneaking or crawling.
if (client.player.input.sneaking) if (client.player.shouldSlowDown()) {
this.movementSideways *= 0.3D; this.movementSideways *= MathHelper.clamp(0.3F + EnchantmentHelper.getSwiftSneakSpeedBoost(client.player), 0.0F, 1.0F);
}
} }
return this.shouldOverrideMovement; return this.shouldOverrideMovement;

View File

@@ -16,8 +16,7 @@ import dev.lambdaurora.spruceui.option.SpruceOption;
import dev.lambdaurora.spruceui.widget.container.SpruceContainerWidget; import dev.lambdaurora.spruceui.widget.container.SpruceContainerWidget;
import dev.lambdaurora.spruceui.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.TranslatableText;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
@@ -65,7 +64,7 @@ public class MappingsStringInputWidget extends SpruceContainerWidget {
} catch (IOException e) { } catch (IOException e) {
if (this.client != null) if (this.client != null)
this.client.getToastManager().add(SystemToast.create(this.client, SystemToast.Type.TUTORIAL_HINT, this.client.getToastManager().add(SystemToast.create(this.client, SystemToast.Type.TUTORIAL_HINT,
new TranslatableText("midnightcontrols.controller.mappings.error.write"), LiteralText.EMPTY)); Text.translatable("midnightcontrols.controller.mappings.error.write"), Text.empty()));
e.printStackTrace(); e.printStackTrace();
} }
} }
@@ -90,7 +89,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, new LiteralText(mappings)); this.textArea = new SpruceTextAreaWidget(Position.of(this, this.width / 2 - textFieldWidth / 2, 0), textFieldWidth, this.height - 50, Text.literal(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);

View File

@@ -52,6 +52,7 @@ public class MidnightControlsHud extends Hud {
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;
public MidnightControlsHud(@NotNull MidnightControlsClient mod) { public MidnightControlsHud(@NotNull MidnightControlsClient mod) {
super(new Identifier(MidnightControlsConstants.NAMESPACE, "hud/button_indicator")); super(new Identifier(MidnightControlsConstants.NAMESPACE, "hud/button_indicator"));
@@ -72,17 +73,22 @@ public class MidnightControlsHud extends Hud {
this.useButtonWidth = MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.USE); this.useButtonWidth = MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.USE);
} }
/** /**
* Renders the midnightcontrols' HUD. * Renders the MidnightControls HUD.
*/ */
@Override @Override
public void render(MatrixStack matrices, float tickDelta) { public void render(MatrixStack matrices, float tickDelta) {
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() < 560;
int y = bottom(2); int y = bottom(2);
matrices.push();
this.renderFirstIcons(matrices, MidnightControlsConfig.hudSide == HudSide.LEFT ? 2 : client.getWindow().getScaledWidth() - 2, y); this.renderFirstIcons(matrices, MidnightControlsConfig.hudSide == HudSide.LEFT ? 2 : client.getWindow().getScaledWidth() - 2, y);
this.renderSecondIcons(matrices, MidnightControlsConfig.hudSide == HudSide.RIGHT ? 2 : client.getWindow().getScaledWidth() - 2, y); this.renderSecondIcons(matrices, MidnightControlsConfig.hudSide == HudSide.RIGHT ? 2 : client.getWindow().getScaledWidth() - 2, y);
this.renderFirstSection(matrices, MidnightControlsConfig.hudSide == HudSide.LEFT ? 2 : client.getWindow().getScaledWidth() - 2, y); this.renderFirstSection(matrices, MidnightControlsConfig.hudSide == HudSide.LEFT ? 2 : client.getWindow().getScaledWidth() - 2, y);
this.renderSecondSection(matrices, MidnightControlsConfig.hudSide == HudSide.RIGHT ? 2 : client.getWindow().getScaledWidth() - 2, y); this.renderSecondSection(matrices, MidnightControlsConfig.hudSide == HudSide.RIGHT ? 2 : client.getWindow().getScaledWidth() - 2, y);
matrices.pop();
} }
if (this.mod.reacharound.isLastReacharoundVertical()) { if (this.mod.reacharound.isLastReacharoundVertical()) {
@@ -102,53 +108,61 @@ public class MidnightControlsHud extends Hud {
public void renderFirstIcons(MatrixStack matrices, 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;
this.drawButton(matrices, currentX, y, ButtonBinding.INVENTORY, true); if (!ButtonBinding.INVENTORY.isNotBound()) this.drawButton(matrices, currentX, y, ButtonBinding.INVENTORY, true);
this.drawButton(matrices, currentX += (MidnightControlsConfig.hudSide == HudSide.LEFT ? offset : -offset), y, ButtonBinding.SWAP_HANDS, true); if (isCrammed) {
offset = 0;
y -= 20;
}
if (!ButtonBinding.SWAP_HANDS.isNotBound()) 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.showSubtitles && MidnightControlsConfig.hudSide == HudSide.RIGHT) { if (this.client.options.getShowSubtitles().getValue() && 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 -= 24; y -= 20;
} }
this.drawButton(matrices, currentX, y, ButtonBinding.DROP_ITEM, !this.client.player.getMainHandStack().isEmpty()); if (!ButtonBinding.DROP_ITEM.isNotBound()) this.drawButton(matrices, currentX, y, ButtonBinding.DROP_ITEM, !this.client.player.getMainHandStack().isEmpty());
} }
public void renderSecondIcons(MatrixStack matrices, int x, int y) { public void renderSecondIcons(MatrixStack matrices, int x, int y) {
int offset; int offset;
int currentX = x; int currentX = x;
if (!this.placeAction.isEmpty()) { if (!this.placeAction.isEmpty() && (!ButtonBinding.USE.isNotBound()) ) {
if (MidnightControlsConfig.hudSide == HudSide.LEFT) if (MidnightControlsConfig.hudSide == HudSide.LEFT)
currentX -= this.useButtonWidth; currentX -= this.useButtonWidth;
this.drawButton(matrices, currentX, y, ButtonBinding.USE, true); this.drawButton(matrices, currentX, y, ButtonBinding.USE, true);
offset = 2 + this.useWidth + 4; offset = 2 + this.useWidth + 4;
if (this.client.options.showSubtitles && MidnightControlsConfig.hudSide == HudSide.LEFT) { if (this.client.options.getShowSubtitles().getValue() && MidnightControlsConfig.hudSide == HudSide.LEFT) {
currentX -= offset; currentX -= offset;
} else { } else {
currentX = x; currentX = x;
y -= 24; y -= 20;
} }
} }
if (MidnightControlsConfig.hudSide == HudSide.LEFT) if (MidnightControlsConfig.hudSide == HudSide.LEFT)
currentX -= this.attackButtonWidth; currentX -= this.attackButtonWidth;
this.drawButton(matrices, currentX, y, ButtonBinding.ATTACK, this.attackWidth != 0); if (!ButtonBinding.ATTACK.isNotBound()) this.drawButton(matrices, currentX, y, ButtonBinding.ATTACK, this.attackWidth != 0);
} }
public void renderFirstSection(MatrixStack matrices, 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;
this.drawTip(matrices, currentX, y, ButtonBinding.INVENTORY, true); if (!ButtonBinding.INVENTORY.isNotBound()) 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;
this.drawTip(matrices, currentX, y, ButtonBinding.SWAP_HANDS, true); if (isCrammed) {
if (this.client.options.showSubtitles && MidnightControlsConfig.hudSide == HudSide.RIGHT) { currentX = MidnightControlsConfig.hudSide == HudSide.LEFT ? x + this.inventoryButtonWidth + 2 : x - this.inventoryButtonWidth - 2 - this.inventoryWidth;
y -= 20;
}
if (!ButtonBinding.SWAP_HANDS.isNotBound()) this.drawTip(matrices, currentX, y, ButtonBinding.SWAP_HANDS, true);
if (this.client.options.getShowSubtitles().getValue() && MidnightControlsConfig.hudSide == HudSide.RIGHT) {
currentX += -this.dropItemWidth - 2 - this.dropItemButtonWidth - 4; currentX += -this.dropItemWidth - 2 - this.dropItemButtonWidth - 4;
} else { } else {
y -= 24; y -= 20;
currentX = MidnightControlsConfig.hudSide == HudSide.LEFT ? x + this.dropItemButtonWidth + 2 : x - this.dropItemButtonWidth - 2 - this.dropItemWidth; currentX = MidnightControlsConfig.hudSide == HudSide.LEFT ? x + this.dropItemButtonWidth + 2 : x - this.dropItemButtonWidth - 2 - this.dropItemWidth;
} }
this.drawTip(matrices, currentX, y, ButtonBinding.DROP_ITEM, !this.client.player.getMainHandStack().isEmpty()); if (!ButtonBinding.DROP_ITEM.isNotBound()) this.drawTip(matrices, currentX, y, ButtonBinding.DROP_ITEM, !this.client.player.getMainHandStack().isEmpty());
} }
public void renderSecondSection(MatrixStack matrices, int x, int y) { public void renderSecondSection(MatrixStack matrices, int x, int y) {
@@ -159,17 +173,17 @@ public class MidnightControlsHud extends Hud {
this.drawTip(matrices, currentX, y, this.placeAction, true); this.drawTip(matrices, currentX, y, this.placeAction, true);
if (this.client.options.showSubtitles && MidnightControlsConfig.hudSide == HudSide.LEFT) { if (this.client.options.getShowSubtitles().getValue() && MidnightControlsConfig.hudSide == HudSide.LEFT) {
currentX -= 4; currentX -= 4;
} else { } else {
currentX = x; currentX = x;
y -= 24; y -= 20;
} }
} }
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;
this.drawTip(matrices, currentX, y, this.attackAction, this.attackWidth != 0); if (!ButtonBinding.ATTACK.isNotBound()) this.drawTip(matrices, currentX, y, this.attackAction, this.attackWidth != 0);
} }
@Override @Override
@@ -245,7 +259,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 (this.client.getWindow().getScaledHeight() - y - MidnightControlsRenderer.ICON_SIZE);
} }
private int width(@NotNull ButtonBinding binding) { private int width(@NotNull ButtonBinding binding) {

View File

@@ -10,6 +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.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;
@@ -106,7 +108,7 @@ public class MidnightControlsRenderer {
second = true; second = true;
} }
int controllerType = MidnightControlsConfig.controllerType.getId(); int controllerType = MidnightControlsConfig.controllerType == ControllerType.DEFAULT ? MidnightControlsConfig.matchControllerToType().getId() : MidnightControlsConfig.controllerType.getId();
boolean axis = false; boolean axis = false;
int buttonOffset = button * 15; int buttonOffset = button * 15;
switch (button) { switch (button) {

View File

@@ -9,6 +9,10 @@
package eu.midnightdust.midnightcontrols.client.gui; package eu.midnightdust.midnightcontrols.client.gui;
import com.mojang.blaze3d.systems.RenderSystem;
import dev.lambdaurora.spruceui.background.Background;
import dev.lambdaurora.spruceui.widget.SpruceWidget;
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;
@@ -27,21 +31,23 @@ import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
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.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.ButtonWidget;
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 net.minecraft.util.math.Matrix4f;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
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 = new LiteralText("SDL2 Gamepad Tool").formatted(Formatting.GREEN); private static final Text SDL2_GAMEPAD_TOOL = Text.literal("SDL2 Gamepad Tool").formatted(Formatting.GREEN);
public static final String GAMEPAD_TOOL_URL = "https://generalarcade.com/gamepadtool/"; public static final String GAMEPAD_TOOL_URL = "https://generalarcade.com/gamepadtool/";
final MidnightControlsClient mod = MidnightControlsClient.get(); final MidnightControlsClient mod = MidnightControlsClient.get();
private final Screen parent; private final Screen parent;
@@ -49,11 +55,13 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
private final SpruceOption inputModeOption; private final SpruceOption inputModeOption;
private final SpruceOption autoSwitchModeOption; private final SpruceOption autoSwitchModeOption;
private final SpruceOption rotationSpeedOption; private final SpruceOption rotationSpeedOption;
private final SpruceOption yAxisRotationSpeedOption;
private final SpruceOption mouseSpeedOption; private final SpruceOption mouseSpeedOption;
private final SpruceOption virtualMouseOption; private final SpruceOption virtualMouseOption;
private final SpruceOption resetOption; private final SpruceOption resetOption;
// Gameplay options // Gameplay options
private final SpruceOption analogMovementOption; private final SpruceOption analogMovementOption;
private final SpruceOption doubleTapToSprintOption;
private final SpruceOption autoJumpOption; private final SpruceOption autoJumpOption;
private final SpruceOption fastBlockPlacingOption; private final SpruceOption fastBlockPlacingOption;
private final SpruceOption frontBlockPlacingOption; private final SpruceOption frontBlockPlacingOption;
@@ -80,11 +88,11 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
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(new LiteralText(controllerName).formatted(Formatting.RED)); return option.getDisplayText(Text.literal(controllerName).formatted(Formatting.RED));
else if (!controller.isGamepad()) else if (!controller.isGamepad())
return option.getDisplayText(new LiteralText(controllerName).formatted(Formatting.GOLD)); return option.getDisplayText(Text.literal(controllerName).formatted(Formatting.GOLD));
else else
return option.getDisplayText(new LiteralText(controllerName)); return option.getDisplayText(Text.literal(controllerName));
}, null); }, null);
private final SpruceOption secondControllerOption = new SpruceCyclingOption("midnightcontrols.menu.controller2", private final SpruceOption secondControllerOption = new SpruceCyclingOption("midnightcontrols.menu.controller2",
amount -> { amount -> {
@@ -98,13 +106,13 @@ 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(new LiteralText(controllerName).formatted(Formatting.RED)); return option.getDisplayText(Text.literal(controllerName).formatted(Formatting.RED));
else if (!controller.isGamepad()) else if (!controller.isGamepad())
return option.getDisplayText(new LiteralText(controllerName).formatted(Formatting.GOLD)); return option.getDisplayText(Text.literal(controllerName).formatted(Formatting.GOLD));
else else
return option.getDisplayText(new LiteralText(controllerName)); return option.getDisplayText(Text.literal(controllerName));
}).orElse(option.getDisplayText(SpruceTexts.OPTIONS_OFF.shallowCopy().formatted(Formatting.RED))), }).orElse(option.getDisplayText(SpruceTexts.OPTIONS_OFF.copyContentOnly().formatted(Formatting.RED))),
new TranslatableText("midnightcontrols.tooltip.controller2")); Text.translatable("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;
@@ -121,13 +129,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(new LiteralText(String.format("%.2f", option.get()))), option -> option.getDisplayText(Text.literal(String.format("%.2f", option.get()))),
new TranslatableText(key.replace("menu", "tooltip")) Text.translatable(key.replace("menu", "tooltip"))
); );
} }
private final MutableText controllerMappingsUrlText = new LiteralText("(") private final MutableText controllerMappingsUrlText = Text.literal("(")
.append(new LiteralText(GAMEPAD_TOOL_URL).formatted(Formatting.GOLD)) .append(Text.literal(GAMEPAD_TOOL_URL).formatted(Formatting.GOLD))
.append("),"); .append("),");
private static int searchNextAvailableController(int newId, boolean allowNone) { private static int searchNextAvailableController(int newId, boolean allowNone) {
@@ -145,7 +153,8 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
} }
public MidnightControlsSettingsScreen(Screen parent, boolean hideControls) { public MidnightControlsSettingsScreen(Screen parent, boolean hideControls) {
super(new TranslatableText("midnightcontrols.title.settings")); super(Text.translatable("midnightcontrols.title.settings"));
MidnightControlsConfig.isEditing = true;
this.parent = parent; this.parent = parent;
// General options // General options
this.inputModeOption = new SpruceCyclingOption("midnightcontrols.menu.controls_mode", this.inputModeOption = new SpruceCyclingOption("midnightcontrols.menu.controls_mode",
@@ -157,90 +166,99 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
if (this.client.player != null) { if (this.client.player != null) {
ClientPlayNetworking.getSender().sendPacket(MidnightControls.CONTROLS_MODE_CHANNEL, this.mod.makeControlsModeBuffer(next)); ClientPlayNetworking.getSender().sendPacket(MidnightControls.CONTROLS_MODE_CHANNEL, this.mod.makeControlsModeBuffer(next));
} }
}, option -> option.getDisplayText(new TranslatableText(MidnightControlsConfig.controlsMode.getTranslationKey())), }, option -> option.getDisplayText(Text.translatable(MidnightControlsConfig.controlsMode.getTranslationKey())),
new TranslatableText("midnightcontrols.tooltip.controls_mode")); Text.translatable("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, new TranslatableText("midnightcontrols.tooltip.auto_switch_mode")); value -> MidnightControlsConfig.autoSwitchMode = value, Text.translatable("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(new LiteralText(String.valueOf(option.get()))), value -> MidnightControlsConfig.rotationSpeed = value, option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))),
new TranslatableText("midnightcontrols.tooltip.rotation_speed")); Text.translatable("midnightcontrols.tooltip.rotation_speed"));
this.yAxisRotationSpeedOption = new SpruceDoubleOption("midnightcontrols.menu.y_axis_rotation_speed", 0.0, 100.0, .5f,
() -> MidnightControlsConfig.yAxisRotationSpeed,
value -> MidnightControlsConfig.yAxisRotationSpeed = value, option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))),
Text.translatable("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(new LiteralText(String.valueOf(option.get()))), value -> MidnightControlsConfig.mouseSpeed = value, option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))),
new TranslatableText("midnightcontrols.tooltip.mouse_speed")); Text.translatable("midnightcontrols.tooltip.mouse_speed"));
this.resetOption = SpruceSimpleActionOption.reset(btn -> { this.resetOption = SpruceSimpleActionOption.reset(btn -> {
// TODO // TODO
MidnightControlsConfig.init("midnightcontrols", MidnightControlsConfig.class); 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());
}); });
// 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,
new TranslatableText("midnightcontrols.tooltip.analog_movement")); Text.translatable("midnightcontrols.tooltip.analog_movement"));
this.doubleTapToSprintOption = new SpruceToggleBooleanOption("midnightcontrols.menu.double_tap_to_sprint",
() -> MidnightControlsConfig.doubleTapToSprint, value -> MidnightControlsConfig.doubleTapToSprint = value,
Text.translatable("midnightcontrols.tooltip.double_tap_to_sprint"));
this.autoJumpOption = new SpruceToggleBooleanOption("options.autoJump", this.autoJumpOption = new SpruceToggleBooleanOption("options.autoJump",
() -> this.client.options.autoJump, () -> this.client.options.getAutoJump().getValue(),
newValue -> this.client.options.autoJump = newValue, newValue -> this.client.options.getAutoJump().setValue(newValue),
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, new TranslatableText("midnightcontrols.tooltip.fast_block_placing")); value -> MidnightControlsConfig.fastBlockPlacing = value, Text.translatable("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, new TranslatableText("midnightcontrols.tooltip.reacharound.horizontal")); value -> MidnightControlsConfig.horizontalReacharound = value, Text.translatable("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, new TranslatableText("midnightcontrols.tooltip.reacharound.vertical")); value -> MidnightControlsConfig.verticalReacharound = value, Text.translatable("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, new TranslatableText("midnightcontrols.tooltip.fly_drifting")); value -> MidnightControlsConfig.flyDrifting = value, Text.translatable("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, new TranslatableText("midnightcontrols.tooltip.fly_drifting_vertical")); value -> MidnightControlsConfig.verticalFlyDrifting = value, Text.translatable("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()),
new TranslatableText("midnightcontrols.tooltip.controller_type")); Text.translatable("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, new TranslatableText("midnightcontrols.tooltip.hud_enable")); this.mod::setHudEnabled, Text.translatable("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()),
new TranslatableText("midnightcontrols.tooltip.hud_side")); Text.translatable("midnightcontrols.tooltip.hud_side"));
// Controller options // Controller options
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(new LiteralText(value.substring(0, Math.min(value.length(), 5)))); return option.getDisplayText(Text.literal(value.substring(0, Math.min(value.length(), 5))));
}, new TranslatableText("midnightcontrols.tooltip.right_dead_zone")); }, Text.translatable("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(new LiteralText(value.substring(0, Math.min(value.length(), 5)))); return option.getDisplayText(Text.literal(value.substring(0, Math.min(value.length(), 5))));
}, new TranslatableText("midnightcontrols.tooltip.left_dead_zone")); }, Text.translatable("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, new TranslatableText("midnightcontrols.tooltip.unfocused_input")); value -> MidnightControlsConfig.unfocusedInput = value, Text.translatable("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, new TranslatableText("midnightcontrols.tooltip.virtual_mouse")); value -> MidnightControlsConfig.virtualMouse = value, Text.translatable("midnightcontrols.tooltip.virtual_mouse"));
} }
@Override @Override
public void removed() { public void removed() {
MidnightControlsConfig.isEditing = false;
MidnightControlsConfig.save(); MidnightControlsConfig.save();
super.removed(); super.removed();
} }
@Override @Override
public void onClose() { public void close() {
MidnightControlsConfig.isEditing = false;
MidnightControlsConfig.save(); MidnightControlsConfig.save();
super.onClose(); super.close();
} }
private int getTextHeight() { private int getTextHeight() {
@@ -262,32 +280,35 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
var tabs = new SpruceTabbedWidget(Position.of(0, 24), this.width, this.height - 32 - 24, var tabs = new SpruceTabbedWidget(Position.of(0, 24), this.width, this.height - 32 - 24,
null, null,
Math.max(116, this.width / 8), 0); Math.max(116, this.width / 8), 0);
tabs.getList().setBackground(new MidnightControlsBackground());
this.addDrawableChild(tabs); this.addDrawableChild(tabs);
tabs.addSeparatorEntry(new TranslatableText("midnightcontrols.menu.separator.general")); tabs.addSeparatorEntry(Text.translatable("midnightcontrols.menu.separator.general"));
tabs.addTabEntry(new TranslatableText("midnightcontrols.menu.title.general"), null, tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.general"), null,
this::buildGeneralTab); this::buildGeneralTab);
tabs.addTabEntry(new TranslatableText("midnightcontrols.menu.title.gameplay"), null, tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.gameplay"), null,
this::buildGameplayTab); this::buildGameplayTab);
tabs.addTabEntry(new TranslatableText("midnightcontrols.menu.title.visual"), null, tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.visual"), null,
this::buildVisualTab); this::buildVisualTab);
tabs.addSeparatorEntry(new TranslatableText("options.controls")); tabs.addSeparatorEntry(Text.translatable("options.controls"));
tabs.addTabEntry(new TranslatableText("midnightcontrols.menu.title.controller_controls"), null, tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.controller_controls"), null,
this::buildControllerControlsTab); this::buildControllerControlsTab);
tabs.addSeparatorEntry(new TranslatableText("midnightcontrols.menu.separator.controller")); tabs.addSeparatorEntry(Text.translatable("midnightcontrols.menu.separator.controller"));
tabs.addTabEntry(new TranslatableText("midnightcontrols.menu.title.controller"), null, tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.controller"), null,
this::buildControllerTab); this::buildControllerTab);
tabs.addTabEntry(new TranslatableText("midnightcontrols.menu.title.mappings.string"), null, tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.mappings.string"), null,
this::buildMappingsStringEditorTab); this::buildMappingsStringEditorTab);
} }
public SpruceOptionListWidget buildGeneralTab(int width, int height) { public SpruceOptionListWidget buildGeneralTab(int width, int height) {
var list = new SpruceOptionListWidget(Position.origin(), width, height); var list = new SpruceOptionListWidget(Position.origin(), width, height);
list.setBackground(new MidnightControlsBackground(130));
list.addSingleOptionEntry(this.inputModeOption); list.addSingleOptionEntry(this.inputModeOption);
list.addSingleOptionEntry(this.autoSwitchModeOption); list.addSingleOptionEntry(this.autoSwitchModeOption);
list.addSingleOptionEntry(this.rotationSpeedOption); list.addSingleOptionEntry(this.rotationSpeedOption);
list.addSingleOptionEntry(this.yAxisRotationSpeedOption);
list.addSingleOptionEntry(this.mouseSpeedOption); list.addSingleOptionEntry(this.mouseSpeedOption);
list.addSingleOptionEntry(this.virtualMouseOption); list.addSingleOptionEntry(this.virtualMouseOption);
return list; return list;
@@ -295,18 +316,21 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
public SpruceOptionListWidget buildGameplayTab(int width, int height) { public SpruceOptionListWidget buildGameplayTab(int width, int height) {
var list = new SpruceOptionListWidget(Position.origin(), width, height); var list = new SpruceOptionListWidget(Position.origin(), width, height);
list.setBackground(new MidnightControlsBackground(130));
list.addSingleOptionEntry(this.analogMovementOption); list.addSingleOptionEntry(this.analogMovementOption);
list.addSingleOptionEntry(this.fastBlockPlacingOption); list.addSingleOptionEntry(this.doubleTapToSprintOption);
list.addSingleOptionEntry(this.frontBlockPlacingOption); if (MidnightControls.isExtrasLoaded) list.addSingleOptionEntry(this.fastBlockPlacingOption);
list.addSingleOptionEntry(this.verticalReacharoundOption); if (MidnightControls.isExtrasLoaded) list.addSingleOptionEntry(this.frontBlockPlacingOption);
list.addSingleOptionEntry(this.flyDriftingOption); if (MidnightControls.isExtrasLoaded) list.addSingleOptionEntry(this.verticalReacharoundOption);
list.addSingleOptionEntry(this.flyVerticalDriftingOption); if (MidnightControls.isExtrasLoaded) list.addSingleOptionEntry(this.flyDriftingOption);
if (MidnightControls.isExtrasLoaded) list.addSingleOptionEntry(this.flyVerticalDriftingOption);
list.addSingleOptionEntry(this.autoJumpOption); list.addSingleOptionEntry(this.autoJumpOption);
return list; return list;
} }
public SpruceOptionListWidget buildVisualTab(int width, int height) { public SpruceOptionListWidget buildVisualTab(int width, int height) {
var list = new SpruceOptionListWidget(Position.origin(), width, height); var list = new SpruceOptionListWidget(Position.origin(), width, height);
list.setBackground(new MidnightControlsBackground(130));
list.addSingleOptionEntry(this.controllerTypeOption); list.addSingleOptionEntry(this.controllerTypeOption);
list.addSingleOptionEntry(this.virtualMouseSkinOption); list.addSingleOptionEntry(this.virtualMouseSkinOption);
list.addSingleOptionEntry(new SpruceSeparatorOption("midnightcontrols.menu.title.hud", true, null)); list.addSingleOptionEntry(new SpruceSeparatorOption("midnightcontrols.menu.title.hud", true, null));
@@ -323,17 +347,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),
new TranslatableText("midnightcontrols.controller.mappings.1", SDL2_GAMEPAD_TOOL), Text.translatable("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(new TranslatableText("chat.link.open")); gamepadToolUrlLabel.setTooltip(Text.translatable("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),
new TranslatableText("midnightcontrols.controller.mappings.3", Formatting.GREEN.toString(), Formatting.RESET.toString()), Text.translatable("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();
@@ -345,6 +369,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
labels.addChild(aboutMappings3); labels.addChild(aboutMappings3);
var list = new SpruceOptionListWidget(Position.origin(), width, listHeight); var list = new SpruceOptionListWidget(Position.origin(), width, listHeight);
list.setBackground(new MidnightControlsBackground(130));
list.addSingleOptionEntry(this.controllerOption); list.addSingleOptionEntry(this.controllerOption);
list.addSingleOptionEntry(this.secondControllerOption); list.addSingleOptionEntry(this.secondControllerOption);
list.addSingleOptionEntry(this.unfocusedInputOption); list.addSingleOptionEntry(this.unfocusedInputOption);
@@ -368,4 +393,39 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
public void renderTitle(MatrixStack matrices, int mouseX, int mouseY, float delta) { public void renderTitle(MatrixStack matrices, int mouseX, int mouseY, float delta) {
drawCenteredText(matrices, this.textRenderer, 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 {
private int transparency = 160;
public MidnightControlsBackground() {}
public MidnightControlsBackground(int transparency) {
this.transparency = transparency;
}
@Override
public void render(MatrixStack matrixStack, SpruceWidget widget, int vOffset, int mouseX, int mouseY, float delta) {
fill(matrixStack, widget.getX(), widget.getY(), widget.getX() + widget.getWidth(), widget.getY() + widget.getHeight(), MidnightColorUtil.hex2Rgb("#000000"));
}
private void fill(MatrixStack matrixStack, int x2, int y2, int x1, int y1, Color color) {
matrixStack.push();
Matrix4f matrix = matrixStack.peek().getPositionMatrix();
float r = (float)(color.getRed()) / 255.0F;
float g = (float)(color.getGreen()) / 255.0F;
float b = (float)(color.getBlue()) / 255.0F;
float t = (float)(transparency) / 255.0F;
BufferBuilder bufferBuilder = Tessellator.getInstance().getBuffer();
RenderSystem.enableBlend();
RenderSystem.disableTexture();
RenderSystem.defaultBlendFunc();
RenderSystem.setShader(GameRenderer::getPositionColorShader);
bufferBuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR);
bufferBuilder.vertex(matrix, (float)x1, (float)y2, 0.0F).color(r, g, b, t).next();
bufferBuilder.vertex(matrix, (float)x2, (float)y2, 0.0F).color(r, g, b, t).next();
bufferBuilder.vertex(matrix, (float)x2, (float)y1, 0.0F).color(r, g, b, t).next();
bufferBuilder.vertex(matrix, (float)x1, (float)y1, 0.0F).color(r, g, b, t).next();
BufferRenderer.drawWithShader(bufferBuilder.end());
RenderSystem.enableTexture();
RenderSystem.disableBlend();
matrixStack.pop();
}
}
} }

View File

@@ -14,8 +14,7 @@ import dev.lambdaurora.spruceui.option.SpruceSimpleActionOption;
import dev.lambdaurora.spruceui.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.LiteralText; 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;
@@ -35,7 +34,7 @@ public class ReloadControllerMappingsOption {
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.TUTORIAL_HINT, client.getToastManager().add(SystemToast.create(client, SystemToast.Type.TUTORIAL_HINT,
new TranslatableText("midnightcontrols.controller.mappings.updated"), LiteralText.EMPTY)); Text.translatable("midnightcontrols.controller.mappings.updated"), Text.empty()));
}, new TranslatableText("midnightcontrols.tooltip.reload_controller_mappings")); }, Text.translatable("midnightcontrols.tooltip.reload_controller_mappings"));
} }
} }

View File

@@ -10,10 +10,13 @@
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.MidnightRing;
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.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.client.util.math.MatrixStack;
import net.minecraft.text.TranslatableText; import net.minecraft.text.Text;
/** /**
* Represents the controls ring screen. * Represents the controls ring screen.
@@ -26,10 +29,19 @@ public class RingScreen extends Screen {
protected final MidnightControlsClient mod; protected final MidnightControlsClient mod;
public RingScreen() { public RingScreen() {
super(new TranslatableText("midnightcontrols.menu.title.ring")); super(Text.literal("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(new ButtonWidget(5, 5, 20, 20, Text.of(""), button -> this.mod.ring.cyclePage(false)));
this.addDrawableChild(new ButtonWidget(width - 25, 5, 20, 20, Text.of(""), button -> this.mod.ring.cyclePage(true)));
}
}
@Override @Override
public boolean shouldPause() { public boolean shouldPause() {
return false; return false;
@@ -40,16 +52,39 @@ public class RingScreen extends Screen {
super.render(matrices, mouseX, mouseY, delta); super.render(matrices, mouseX, mouseY, delta);
RingPage page = this.mod.ring.getCurrentPage(); RingPage page = this.mod.ring.getCurrentPage();
page.render(matrices, this.textRenderer, this.width, this.height, mouseX, mouseY, delta); page.render(matrices, this.textRenderer, this.width, this.height, mouseX, mouseY, delta);
} }
@Override
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 (midnightcontrolsClient.BINDING_RING.matchesMouse(button)) { if (mod.ring.getCurrentPage().onClick(width, height, (int) mouseX, (int) mouseY)) {
this.onClose(); this.close();
return true; return true;
}*/ }
return false; return false;
} }
} }

View File

@@ -9,20 +9,20 @@
package eu.midnightdust.midnightcontrols.client.gui; package eu.midnightdust.midnightcontrols.client.gui;
import dev.lambdaurora.spruceui.widget.SpruceTexturedButtonWidget; import dev.lambdaurora.spruceui.Position;
import dev.lambdaurora.spruceui.widget.SpruceButtonWidget;
import eu.midnightdust.midnightcontrols.client.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.gui.widget.SilentTexturedButtonWidget;
import eu.midnightdust.midnightcontrols.client.util.KeyBindingAccessor; import eu.midnightdust.midnightcontrols.client.util.KeyBindingAccessor;
import net.minecraft.client.gui.screen.ChatScreen; import net.minecraft.client.gui.screen.ChatScreen;
import net.minecraft.client.gui.screen.GameMenuScreen; import net.minecraft.client.gui.screen.GameMenuScreen;
import net.minecraft.client.gui.screen.Screen; 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.ButtonWidget;
import net.minecraft.client.gui.widget.TexturedButtonWidget; import net.minecraft.client.gui.widget.TexturedButtonWidget;
import net.minecraft.client.option.KeyBinding;
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.util.Arm; import net.minecraft.util.Arm;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
@@ -37,265 +37,259 @@ 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 = new Identifier("midnightcontrols", "textures/gui/widgets.png"); public static final Identifier WIDGETS_LOCATION = new Identifier("midnightcontrols", "textures/gui/widgets.png");
private MidnightControlsClient mod; private MidnightControlsClient mod;
private SpruceTexturedButtonWidget jumpButton; private SilentTexturedButtonWidget jumpButton;
private SpruceTexturedButtonWidget flyButton; private SilentTexturedButtonWidget flyButton;
private SpruceTexturedButtonWidget flyUpButton; private SilentTexturedButtonWidget flyUpButton;
private SpruceTexturedButtonWidget flyDownButton; private SilentTexturedButtonWidget flyDownButton;
private int flyButtonEnableTicks = 0; private int flyButtonEnableTicks = 0;
private int forwardButtonTick = 0; private int forwardButtonTick = 0;
private SpruceTexturedButtonWidget forwardLeftButton; private SilentTexturedButtonWidget forwardLeftButton;
private SpruceTexturedButtonWidget forwardRightButton; private SilentTexturedButtonWidget forwardRightButton;
private SpruceTexturedButtonWidget startSneakButton; private SilentTexturedButtonWidget startSneakButton;
private SpruceTexturedButtonWidget endSneakButton; 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; this.passEvents = true;
} }
// @Override @Override
// public boolean shouldPause() public boolean shouldPause()
// { {
// return false; return false;
// } }
//
// @Override @Override
// public boolean keyPressed(int keyCode, int scanCode, int modifiers) public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
// { super.keyPressed(keyCode,scanCode,modifiers);
// super.keyPressed(keyCode,scanCode,modifiers); //return false;
// //return false; return true;
// return true; }
// }
// private void pauseGame(boolean bl) {
// private void pauseGame(boolean bl) if (this.client == null)
// { return;
// if (this.client == null) boolean bl2 = this.client.isIntegratedServerRunning() && !this.client.getServer().isRemote();
// return; if (bl2) {
// boolean bl2 = this.client.isIntegratedServerRunning() && !this.client.getServer().isRemote(); this.client.setScreen(new GameMenuScreen(!bl));
// if (bl2) { this.client.getSoundManager().pauseAll();
// this.client.setScreen(new GameMenuScreen(!bl)); } else {
// this.client.getSoundManager().pauseAll(); this.client.setScreen(new GameMenuScreen(true));
// } else { }
// this.client.setScreen(new GameMenuScreen(true)); }
// }
// } /**
// * Updates the forward button ticks cooldown.
// /** *
// * Updates the forward button ticks cooldown. * @param state The button state.
// * *
// * @param state The button state. */
// * private void updateForwardButtonsState(boolean state) {
// */ if (state)
// private void updateForwardButtonsState(boolean state) this.forwardButtonTick = -1;
// { else
// if (state) this.forwardButtonTick = 20;
// this.forwardButtonTick = -1; }
// else
// this.forwardButtonTick = 20; /**
// } * Updates the jump buttons.
// */
// /** private void updateJumpButtons() {
// * Updates the jump buttons. if (this.client == null)
// */ return;
// private void updateJumpButtons() if (!this.client.interactionManager.isFlyingLocked()) {
// { boolean oldStateFly = this.flyButton.isVisible();
// if (this.client == null) this.jumpButton.setVisible(false);
// return; this.flyButton.setVisible(true);
// if (!this.client.interactionManager.isFlyingLocked()) { this.flyUpButton.setVisible(true);
// boolean oldStateFly = this.flyButton.visible; this.flyDownButton.setVisible(true);
// this.jumpButton.visible = false; if (oldStateFly != this.flyButton.isVisible()) {
// this.flyButton.visible = true; this.flyButtonEnableTicks = 5;
// this.flyUpButton.visible = true; this.setJump(false);
// this.flyDownButton.visible = true; } else if (this.flyButtonEnableTicks > 0)
// if (oldStateFly != this.flyButton.visible) { this.flyButtonEnableTicks--;
// this.flyButtonEnableTicks = 5; } else {
// this.handleJump(null, false); this.jumpButton.setVisible(true);
// } else if (this.flyButtonEnableTicks > 0) this.flyButton.setVisible(false);
// this.flyButtonEnableTicks--; this.flyUpButton.setVisible(false);
// } else { this.flyDownButton.setVisible(false);
// this.jumpButton.visible = true; }
// this.flyButton.visible = false; }
// this.flyUpButton.visible = false;
// this.flyDownButton.visible = false; /**
// } * Handles the jump button.
// } *
// * @param btn The pressed button.
// /** */
// * Handles the jump button. private void handleJump(SpruceButtonWidget btn) {
// * ((KeyBindingAccessor) this.client.options.jumpKey).midnightcontrols$handlePressState(btn.isActive());
// * @param btn The pressed button. }
// * @param state The state of the jump button. /**
// */ * Handles the jump button.
// private void handleJump(ButtonWidget btn, boolean state) *
// { * @param state The state.
// ((KeyBindingAccessor) this.client.options.keyJump).midnightcontrols$handlePressState(state); */
// } private void setJump(boolean state) {
// ((KeyBindingAccessor) this.client.options.jumpKey).midnightcontrols$handlePressState(state);
// @Override }
// public void tick()
// { @Override
// if (this.forwardButtonTick > 0) { public void tick() {
// this.forwardButtonTick--; if (this.forwardButtonTick > 0) {
// } else if (this.forwardButtonTick == 0) { this.forwardButtonTick--;
// if (this.forwardLeftButton.visible) } else if (this.forwardButtonTick == 0) {
// this.forwardLeftButton.visible = false; if (this.forwardLeftButton.isVisible())
// if (this.forwardRightButton.visible) this.forwardLeftButton.setVisible(false);
// this.forwardRightButton.visible = false; if (this.forwardRightButton.isVisible())
// } this.forwardRightButton.setVisible(false);
// this.updateJumpButtons(); }
// } this.updateJumpButtons();
// }
// @Override
// protected void init() @Override
// { protected void init() {
// super.init(); super.init();
// int scaledWidth = this.client.getWindow().getScaledWidth(); int scaledWidth = this.client.getWindow().getScaledWidth();
// int scaledHeight = this.client.getWindow().getScaledHeight(); int scaledHeight = this.client.getWindow().getScaledHeight();
// this.addDrawableChild(new TexturedButtonWidget(scaledWidth / 2 - 20, 0, 20, 20, 0, 106, 20, ButtonWidget.WIDGETS_LOCATION, 256, 256, this.addDrawableChild(new TexturedButtonWidget(scaledWidth / 2 - 20, 0, 20, 20, 0, 106, 20, new Identifier("textures/gui/widgets.png"), 256, 256,
// btn -> this.client.setScreen(new ChatScreen("")), LiteralText.EMPTY)); btn -> this.client.setScreen(new ChatScreen("")), Text.empty()));
// this.addDrawableChild(new TexturedButtonWidget(scaledWidth / 2, 0, 20, 20, 0, 0, 20, WIDGETS_LOCATION, 256, 256, this.addDrawableChild(new TexturedButtonWidget(scaledWidth / 2, 0, 20, 20, 0, 0, 20, WIDGETS_LOCATION, 256, 256,
// btn -> this.pauseGame(false))); btn -> this.pauseGame(false)));
// // 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.mainArm == Arm.LEFT) { if (this.client.options.getMainArm().getValue() == Arm.LEFT) {
// inventoryButtonX = inventoryButtonX - 91 - 24; inventoryButtonX = inventoryButtonX - 91 - 24;
// } else { } else {
// inventoryButtonX = inventoryButtonX + 91 + 4; inventoryButtonX = inventoryButtonX + 91 + 4;
// } }
// this.addDrawableChild(new TexturedButtonWidget(inventoryButtonX, inventoryButtonY, 20, 20, 20, 0, 20, WIDGETS_LOCATION, 256, 256, this.addDrawableChild(new TexturedButtonWidget(inventoryButtonX, inventoryButtonY, 20, 20, 20, 0, 20, WIDGETS_LOCATION, 256, 256,
// btn -> { btn -> {
// if (this.client.interactionManager.hasRidingInventory()) { if (this.client.interactionManager.hasRidingInventory()) {
// this.client.player.openRidingInventory(); this.client.player.openRidingInventory();
// } else { } else {
// this.client.getTutorialManager().onInventoryOpened(); this.client.getTutorialManager().onInventoryOpened();
// this.client.openScreen(new InventoryScreen(this.client.player)); this.client.setScreen(new InventoryScreen(this.client.player));
// } }
// })); }));
// 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) {
// jumpButtonX = scaledWidth - 20 - 20; jumpButtonX = scaledWidth - 20 - 20;
// swapHandsX = jumpButtonX - 5 - 40; swapHandsX = jumpButtonX - 5 - 40;
// sneakButtonX = 10 + 20 + 5; sneakButtonX = 10 + 20 + 5;
// } else { } else {
// jumpButtonX = 20; jumpButtonX = 20;
// swapHandsX = jumpButtonX + 5 + 40; swapHandsX = jumpButtonX + 5 + 40;
// sneakButtonX = scaledWidth - 10 - 40 - 5; sneakButtonX = scaledWidth - 10 - 40 - 5;
// } }
// // Swap items hand. // Swap items hand.
// this.addDrawableChild(new SpruceTexturedButtonWidget(swapHandsX, sneakButtonY, 20, 20, 0, 160, 20, WIDGETS_LOCATION, this.addDrawableChild(new SilentTexturedButtonWidget(Position.of(swapHandsX, sneakButtonY), 20, 20, Text.empty(),
// (btn, state) -> { button -> {
// if (state) { if (button.isActive()) {
// if (!this.client.player.isSpectator()) { if (!this.client.player.isSpectator()) {
// 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));
// // Drop // Drop
// this.addDrawableChild(new SpruceTexturedButtonWidget(swapHandsX, sneakButtonY + 5 + 20, 20, 20, 20, 160, 20, WIDGETS_LOCATION, this.addDrawableChild(new SilentTexturedButtonWidget(Position.of(swapHandsX, sneakButtonY + 5 + 20), 20, 20, Text.empty(), btn ->
// (btn, state) -> ((KeyBindingAccessor) this.client.options.keyDrop).midnightcontrols$handlePressState(state))); ((KeyBindingAccessor) this.client.options.dropKey).midnightcontrols$handlePressState(btn.isActive()), 0, 160, 20, WIDGETS_LOCATION));
// // Jump keys // Jump keys
// this.addDrawableChild(this.jumpButton = new SpruceTexturedButtonWidget(jumpButtonX, sneakButtonY, 20, 20, 0, 40, 20, WIDGETS_LOCATION, this.addDrawableChild(this.jumpButton = new SilentTexturedButtonWidget(Position.of(jumpButtonX, sneakButtonY), 20, 20, Text.empty(), this::handleJump, 0, 40, 20, WIDGETS_LOCATION));
// this::handleJump)); this.addDrawableChild(this.flyButton = new SilentTexturedButtonWidget(Position.of(jumpButtonX, sneakButtonY), 20, 20, Text.empty(),btn -> {
// this.addDrawableChild(this.flyButton = new SpruceTexturedButtonWidget(jumpButtonX, sneakButtonY, 20, 20, 20, 40, 20, WIDGETS_LOCATION, if (this.flyButtonEnableTicks == 0) this.client.player.getAbilities().flying = false;
// (btn, state) -> { }, 20, 40, 20, WIDGETS_LOCATION)
// if (this.flyButtonEnableTicks == 0) this.client..abilities.flying = false; );
// })); this.addDrawableChild(this.flyUpButton = new SilentTexturedButtonWidget(Position.of(jumpButtonX, sneakButtonY - 5 - 20), 20, 20,Text.empty(),
// this.addDrawableChild(this.flyUpButton = new SpruceTexturedButtonWidget(jumpButtonX, sneakButtonY - 5 - 20, 20, 20, 40, 40, 20, WIDGETS_LOCATION, this::handleJump, 40, 40, 20, WIDGETS_LOCATION
// this::handleJump)); ));
// this.addDrawableChild(this.flyDownButton = new SpruceTexturedButtonWidget(jumpButtonX, sneakButtonY + 20 + 5, 20, 20, 60, 40, 20, WIDGETS_LOCATION, this.addDrawableChild(this.flyDownButton = new SilentTexturedButtonWidget(Position.of(jumpButtonX, sneakButtonY + 20 + 5), 20, 20, Text.empty(),
// (btn, state) -> ((KeyBindingAccessor) this.client.options.keySneak).midnightcontrols$handlePressState(state))); btn -> ((KeyBindingAccessor) this.client.options.sneakKey).midnightcontrols$handlePressState(btn.isActive()), 60, 40, 20, WIDGETS_LOCATION
// this.updateJumpButtons(); ));
// // Movements keys this.updateJumpButtons();
// this.addDrawableChild((this.startSneakButton = new SpruceTexturedButtonWidget(sneakButtonX, sneakButtonY, 20, 20, 0, 120, 20, WIDGETS_LOCATION, // Movements keys
// (btn, state) -> { this.addDrawableChild((this.startSneakButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX, sneakButtonY), 20, 20, Text.empty(), btn -> {
// if (state) { if (btn.isActive()) {
// ((KeyBindingAccessor) this.client.options.keySneak).midnightcontrols$handlePressState(true); ((KeyBindingAccessor) this.client.options.sneakKey).midnightcontrols$handlePressState(true);
// this.startSneakButton.setVisible(false); this.startSneakButton.setVisible(false);
// this.endSneakButton.setVisible(true); this.endSneakButton.setVisible(true);
// } }
// }))); }, 0, 120, 20, WIDGETS_LOCATION))
// this.addDrawableChild((this.endSneakButton = new SpruceTexturedButtonWidget(sneakButtonX, sneakButtonY, 20, 20, 20, 120, 20, WIDGETS_LOCATION, );
// (btn, state) -> { this.addDrawableChild((this.endSneakButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX, sneakButtonY), 20, 20, Text.empty(), btn -> {
// if (state) { if (btn.isActive()) {
// ((KeyBindingAccessor) this.client.options.keySneak).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)));
// this.endSneakButton.setVisible(false); this.endSneakButton.setVisible(false);
// this.addDrawableChild(this.forwardLeftButton = new SpruceTexturedButtonWidget(sneakButtonX - 20 - 5, sneakButtonY - 5 - 20, 20, 20, 80, 80, 20, WIDGETS_LOCATION, this.addDrawableChild(this.forwardLeftButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX - 20 - 5, sneakButtonY - 5 - 20), 20, 20, Text.empty(), btn -> {
// (btn, state) -> { ((KeyBindingAccessor) this.client.options.forwardKey).midnightcontrols$handlePressState(btn.isActive());
// ((KeyBindingAccessor) this.client.options.keyForward).midnightcontrols$handlePressState(state); ((KeyBindingAccessor) this.client.options.leftKey).midnightcontrols$handlePressState(btn.isActive());
// ((KeyBindingAccessor) this.client.options.keyLeft).midnightcontrols$handlePressState(state); this.updateForwardButtonsState(btn.isActive());
// this.updateForwardButtonsState(state); }, 80, 80, 20, WIDGETS_LOCATION
// })); ));
// this.forwardLeftButton.setVisible(false); this.forwardLeftButton.setVisible(false);
// this.addDrawableChild(new SpruceTexturedButtonWidget(sneakButtonX, sneakButtonY - 5 - 20, 20, 20, 0, 80, 20, WIDGETS_LOCATION, this.addDrawableChild(new SilentTexturedButtonWidget(Position.of(sneakButtonX, sneakButtonY - 5 - 20), 20, 20, Text.empty(), btn -> {
// (btn, state) -> { ((KeyBindingAccessor) this.client.options.forwardKey).midnightcontrols$handlePressState(btn.isActive());
// ((KeyBindingAccessor) this.client.options.keyForward).midnightcontrols$handlePressState(state); this.updateForwardButtonsState(btn.isActive());
// this.updateForwardButtonsState(state); this.forwardLeftButton.setVisible(true);
// this.forwardLeftButton.setVisible(true); this.forwardRightButton.setVisible(true);
// this.forwardRightButton.setVisible(true); }, 0, 80, 20, WIDGETS_LOCATION
// })); ));
// this.addDrawableChild(this.forwardRightButton = new SpruceTexturedButtonWidget(sneakButtonX + 20 + 5, sneakButtonY - 5 - 20, 20, 20, 100, 80, 20, WIDGETS_LOCATION, this.addDrawableChild(this.forwardRightButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX + 20 + 5, sneakButtonY - 5 - 20), 20, 20, Text.empty(), btn -> {
// (btn, state) -> { ((KeyBindingAccessor) this.client.options.forwardKey).midnightcontrols$handlePressState(btn.isActive());
// ((KeyBindingAccessor) this.client.options.keyForward).midnightcontrols$handlePressState(state); ((KeyBindingAccessor) this.client.options.rightKey).midnightcontrols$handlePressState(btn.isActive());
// ((KeyBindingAccessor) this.client.options.keyRight).midnightcontrols$handlePressState(state); this.updateForwardButtonsState(btn.isActive());
// this.updateForwardButtonsState(state); }, 100, 80, 20, WIDGETS_LOCATION
// })); ));
// this.forwardRightButton.setVisible(true); this.forwardRightButton.setVisible(true);
// this.addDrawableChild(new SpruceTexturedButtonWidget(sneakButtonX + 20 + 5, sneakButtonY, 20, 20, 20, 80, 20, WIDGETS_LOCATION, this.addDrawableChild(new SilentTexturedButtonWidget(Position.of(sneakButtonX + 20 + 5, sneakButtonY), 20, 20, Text.empty(),
// (btn, state) -> ((KeyBindingAccessor) this.client.options.keyRight).midnightcontrols$handlePressState(state))); btn -> ((KeyBindingAccessor) this.client.options.rightKey).midnightcontrols$handlePressState(btn.isActive()), 20, 80, 20, WIDGETS_LOCATION
// this.addDrawableChild(new SpruceTexturedButtonWidget(sneakButtonX, sneakButtonY + 20 + 5, 20, 20, 40, 80, 20, WIDGETS_LOCATION, ));
// (btn, state) -> ((KeyBindingAccessor) this.client.options.keyBack).midnightcontrols$handlePressState(state))); this.addDrawableChild(new SilentTexturedButtonWidget(Position.of(sneakButtonX, sneakButtonY + 20 + 5), 20, 20, Text.empty(),
// this.addDrawableChild(new SpruceTexturedButtonWidget(sneakButtonX - 20 - 5, sneakButtonY, 20, 20, 60, 80, 20, WIDGETS_LOCATION, btn -> ((KeyBindingAccessor) this.client.options.backKey).midnightcontrols$handlePressState(btn.isActive()), 40, 80, 20, WIDGETS_LOCATION
// (btn, state) -> ((KeyBindingAccessor) this.client.options.keyLeft).midnightcontrols$handlePressState(state))); ));
// this.addDrawableChild(new SilentTexturedButtonWidget(Position.of(sneakButtonX - 20 - 5, sneakButtonY), 20, 20, Text.empty(),
// this.children().forEach(button -> { btn -> ((KeyBindingAccessor) this.client.options.leftKey).midnightcontrols$handlePressState(btn.isActive()), 60, 80, 20, WIDGETS_LOCATION
// if (button instanceof SpruceTexturedButtonWidget) { ));
// ((SpruceTexturedButtonWidget) button).setSilent(true); }
// }
// }); @Override
// } public boolean mouseClicked(double mouseX, double mouseY, int button) {
// if (mouseY >= (double) (this.height - 22) && this.client != null && this.client.player != null) {
// @Override int centerX = this.width / 2;
// public boolean mouseClicked(double mouseX, double mouseY, int button) if (mouseX >= (double) (centerX - 90) && mouseX <= (double) (centerX + 90)) {
// { for (int slot = 0; slot < 9; ++slot) {
// if (mouseY >= (double) (this.height - 22) && this.client != null && this.client.player != null) { int slotX = centerX - 90 + slot * 20 + 2;
// int centerX = this.width / 2; if (mouseX >= (double) slotX && mouseX <= (double) (slotX + 20)) {
// if (mouseX >= (double) (centerX - 90) && mouseX <= (double) (centerX + 90)) { this.client.player.getInventory().selectedSlot = slot;
// for (int slot = 0; slot < 9; ++slot) { return true;
// int slotX = centerX - 90 + slot * 20 + 2; }
// if (mouseX >= (double) slotX && mouseX <= (double) (slotX + 20)) { }
// this.client.player.getInventory().selectedSlot = slot; }
// return true; }
// } return super.mouseClicked(mouseX, mouseY, button);
// } }
// }
// } @Override
// return super.mouseClicked(mouseX, mouseY, button); public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
// } if (button == GLFW.GLFW_MOUSE_BUTTON_1 && this.client != null) {
// if (deltaY > 0.01)
// @Override this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs(deltaY / 5.0), 2);
// public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) else if (deltaY < 0.01)
// { this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs(deltaY / 5.0), 1);
// if (button == GLFW.GLFW_MOUSE_BUTTON_1 && this.client != null) {
// if (deltaY > 0.01) if (deltaX > 0.01)
// this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs(deltaY / 5.0), 2); this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_X, (float) Math.abs(deltaX / 5.0), 2);
// else if (deltaY < 0.01) else if (deltaX < 0.01)
// this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs(deltaY / 5.0), 1); this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_X, (float) Math.abs(deltaX / 5.0), 1);
// }
// if (deltaX > 0.01) return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY);
// this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_X, (float) Math.abs(deltaX / 5.0), 2); }
// 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);
// }
} }

View File

@@ -16,7 +16,6 @@ import dev.lambdaurora.spruceui.SpruceTexts;
import dev.lambdaurora.spruceui.widget.AbstractSpruceIconButtonWidget; import dev.lambdaurora.spruceui.widget.AbstractSpruceIconButtonWidget;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.util.math.MatrixStack; 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;
@@ -35,13 +34,13 @@ 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]) : new LiteralText("<>"))); (length > 0 ? ButtonBinding.getLocalizedButtonName(binding.getButton()[0]) : Text.literal("<>")));
} }
@Override @Override
public Text getMessage() { public Text getMessage() {
if (this.binding.getButton().length > 1) if (this.binding.getButton().length > 1)
return LiteralText.EMPTY; return Text.empty();
return super.getMessage(); return super.getMessage();
} }

View File

@@ -17,9 +17,10 @@ import dev.lambdaurora.spruceui.Position;
import dev.lambdaurora.spruceui.SpruceTexts; import dev.lambdaurora.spruceui.SpruceTexts;
import dev.lambdaurora.spruceui.widget.SpruceButtonWidget; import dev.lambdaurora.spruceui.widget.SpruceButtonWidget;
import dev.lambdaurora.spruceui.widget.container.SpruceContainerWidget; import dev.lambdaurora.spruceui.widget.container.SpruceContainerWidget;
import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsSettingsScreen;
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.client.util.math.MatrixStack;
import net.minecraft.text.TranslatableText; import net.minecraft.text.Text;
import org.aperlambda.lambdacommon.utils.function.Predicates; import org.aperlambda.lambdacommon.utils.function.Predicates;
import java.util.ArrayList; import java.util.ArrayList;
@@ -46,9 +47,10 @@ 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,
new TranslatableText("midnightcontrols.menu.keyboard_controls"), Text.translatable("midnightcontrols.menu.keyboard_controls"),
btn -> this.client.setScreen(new ControlsOptionsScreen(null, this.client.options)))); btn -> this.client.setScreen(new ControlsOptionsScreen(null, this.client.options))));
this.bindingsListWidget = new ControlsListWidget(Position.of(this, 0, 43), this.width, this.height - 43 - 35, this); this.bindingsListWidget = new ControlsListWidget(Position.of(this, 0, 43), this.width, this.height - 43 - 35, this);
this.bindingsListWidget.setBackground(new MidnightControlsSettingsScreen.MidnightControlsBackground(130));
this.addChild(this.bindingsListWidget); this.addChild(this.bindingsListWidget);
this.addChild(this.resetButton = new SpruceButtonWidget(Position.of(this, this.width / 2 - 155, this.height - 29), 150, 20, this.addChild(this.resetButton = new SpruceButtonWidget(Position.of(this, this.width / 2 - 155, this.height - 29), 150, 20,
SpruceTexts.CONTROLS_RESET_ALL, SpruceTexts.CONTROLS_RESET_ALL,
@@ -57,7 +59,7 @@ public class ControllerControlsWidget extends SpruceContainerWidget {
@Override @Override
public void renderWidget(MatrixStack matrices, int mouseX, int mouseY, float delta) { public void renderWidget(MatrixStack matrices, int mouseX, int mouseY, float delta) {
drawCenteredText(matrices, this.client.textRenderer, new TranslatableText("midnightcontrols.menu.title.controller_controls"), drawCenteredText(matrices, this.client.textRenderer, Text.translatable("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(matrices, mouseX, mouseY, delta); super.renderWidget(matrices, mouseX, mouseY, delta);

View File

@@ -27,9 +27,7 @@ import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
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.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;
@@ -93,17 +91,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() ? new TranslatableText("narrator.controls.unbound", bindingName) return binding.isNotBound() ? Text.translatable("narrator.controls.unbound", bindingName)
: new TranslatableText("narrator.controls.bound", bindingName, super.getNarrationMessage()); : Text.translatable("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, new TranslatableText("controls.reset"), 44, 20, Text.translatable("controls.reset"),
btn -> MidnightControlsConfig.setButtonBinding(binding, binding.getDefaultButton())) { btn -> MidnightControlsConfig.setButtonBinding(binding, binding.getDefaultButton())) {
protected Text getNarrationMessage() { protected Text getNarrationMessage() {
return new TranslatableText("narrator.controls.reset", bindingName); return Text.translatable("narrator.controls.reset", bindingName);
} }
}; };
this.children.add(this.resetButton); this.children.add(this.resetButton);
@@ -116,7 +114,7 @@ public class ControlsListWidget extends SpruceEntryListWidget<ControlsListWidget
MidnightControlsClient.get().input.beginControlsInput(null); MidnightControlsClient.get().input.beginControlsInput(null);
}) { }) {
protected Text getNarrationMessage() { protected Text getNarrationMessage() {
return new TranslatableText("midnightcontrols.narrator.unbound", bindingName); return Text.translatable("midnightcontrols.narrator.unbound", bindingName);
} }
}; };
this.children.add(this.unbindButton); this.children.add(this.unbindButton);
@@ -243,9 +241,9 @@ public class ControlsListWidget extends SpruceEntryListWidget<ControlsListWidget
this.editButton.update(); this.editButton.update();
if (focused) { if (focused) {
var text = new LiteralText("> ").formatted(Formatting.WHITE); var text = Text.literal("> ").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(new LiteralText(" <").formatted(Formatting.WHITE))); this.editButton.setMessage(text.append(Text.literal(" <").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));
@@ -264,7 +262,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,
new LiteralText(category.getTranslatedName())) { Text.literal(category.getTranslatedName())) {
@Override @Override
public int getWidth() { public int getWidth() {
return CategoryEntry.this.getWidth() - 4; return CategoryEntry.this.getWidth() - 4;

View File

@@ -0,0 +1,26 @@
package eu.midnightdust.midnightcontrols.client.gui.widget;
import dev.lambdaurora.spruceui.Position;
import dev.lambdaurora.spruceui.widget.SpruceTexturedButtonWidget;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
public class SilentTexturedButtonWidget extends SpruceTexturedButtonWidget {
public SilentTexturedButtonWidget(Position position, int width, int height, Text message, PressAction action, int u, int v, int hoveredVOffset, Identifier texture) {
super(position, width, height, message, action, u, v, hoveredVOffset, texture);
}
public SilentTexturedButtonWidget(Position position, int width, int height, Text message, boolean showMessage, PressAction action, int u, int v, int hoveredVOffset, Identifier texture) {
super(position, width, height, message, showMessage, action, u, v, hoveredVOffset, texture);
}
public SilentTexturedButtonWidget(Position position, int width, int height, Text message, PressAction action, int u, int v, int hoveredVOffset, Identifier texture, int textureWidth, int textureHeight) {
super(position, width, height, message, action, u, v, hoveredVOffset, texture, textureWidth, textureHeight);
}
public SilentTexturedButtonWidget(Position position, int width, int height, Text message, boolean showMessage, PressAction action, int u, int v, int hoveredVOffset, Identifier texture, int textureWidth, int textureHeight) {
super(position, width, height, message, showMessage, action, u, v, hoveredVOffset, texture, textureWidth, textureHeight);
}
@Override
public void playDownSound() {}
}

View File

@@ -17,4 +17,6 @@ import org.spongepowered.asm.mixin.gen.Accessor;
public interface ClickableWidgetAccessor { public interface ClickableWidgetAccessor {
@Accessor("height") @Accessor("height")
int getHeight(); int getHeight();
@Accessor("focused")
void setFocused(boolean value);
} }

View File

@@ -10,6 +10,7 @@
package eu.midnightdust.midnightcontrols.client.mixin; 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.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.MovementHandler; import eu.midnightdust.midnightcontrols.client.controller.MovementHandler;
@@ -19,12 +20,15 @@ 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;
/** /**
@@ -34,6 +38,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity { public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity {
private boolean midnightcontrols$driftingPrevented = false; private boolean midnightcontrols$driftingPrevented = false;
public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile, @Nullable PlayerPublicKey publicKey) {
super(world, profile, publicKey);
}
@Shadow @Shadow
protected abstract boolean hasMovementInput(); protected abstract boolean hasMovementInput();
@@ -47,13 +55,13 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity
@Shadow @Shadow
protected abstract boolean isCamera(); protected abstract boolean isCamera();
public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile) { @Shadow protected int ticksLeftToDoubleTapSprint;
super(world, profile);
}
@Inject(method = "move(Lnet/minecraft/entity/MovementType;Lnet/minecraft/util/math/Vec3d;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/AbstractClientPlayerEntity;move(Lnet/minecraft/entity/MovementType;Lnet/minecraft/util/math/Vec3d;)V")) @Inject(method = "move(Lnet/minecraft/entity/MovementType;Lnet/minecraft/util/math/Vec3d;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/AbstractClientPlayerEntity;move(Lnet/minecraft/entity/MovementType;Lnet/minecraft/util/math/Vec3d;)V"))
public void onMove(MovementType type, Vec3d movement, CallbackInfo ci) { public void onMove(MovementType type, Vec3d movement, CallbackInfo ci) {
var mod = MidnightControlsClient.get(); if (!MidnightControlsConfig.doubleTapToSprint) ticksLeftToDoubleTapSprint = 0;
if (!MidnightControls.isExtrasLoaded) return;
if (type == MovementType.SELF) { if (type == MovementType.SELF) {
if (this.getAbilities().flying && (!MidnightControlsConfig.flyDrifting || !MidnightControlsConfig.verticalFlyDrifting)) { if (this.getAbilities().flying && (!MidnightControlsConfig.flyDrifting || !MidnightControlsConfig.verticalFlyDrifting)) {
if (!this.hasMovementInput()) { if (!this.hasMovementInput()) {
@@ -68,7 +76,7 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity
} }
} }
@Inject(method = "tickMovement", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/input/Input;tick(Z)V", shift = At.Shift.AFTER)) @Inject(method = "tickMovement", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/input/Input;tick(ZF)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);
} }
@@ -76,7 +84,7 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity
@Inject(method = "tickMovement", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;isCamera()Z")) @Inject(method = "tickMovement", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;isCamera()Z"))
public void onTickMovement(CallbackInfo ci) { public void onTickMovement(CallbackInfo ci) {
if (this.getAbilities().flying && this.isCamera()) { if (this.getAbilities().flying && this.isCamera()) {
if (MidnightControlsConfig.verticalFlyDrifting) if (MidnightControlsConfig.verticalFlyDrifting || !MidnightControls.isExtrasLoaded)
return; return;
int moving = 0; int moving = 0;
if (this.input.sneaking) { if (this.input.sneaking) {

View File

@@ -9,15 +9,18 @@
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.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.ButtonWidget; 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 org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@@ -26,17 +29,28 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
* Injects the new controls settings button. * Injects the new controls settings button.
*/ */
@Mixin(ControlsOptionsScreen.class) @Mixin(ControlsOptionsScreen.class)
public 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 text) { public ControlsOptionsScreenMixin(Screen parent, GameOptions gameOptions, Text text) {
super(parent, gameOptions, text); super(parent, gameOptions, text);
} }
@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;"))
private void addAlternativeControllerButton(CallbackInfo ci) {
if (showAlternativeButton) {
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) -> {
this.client.setScreen(new MidnightControlsSettingsScreen(this, false));
}, Text.translatable("midnightcontrols.menu.title.controller")));
}
}
@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;")) @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;"))
private void addControllerButton(CallbackInfo ci) { private void addControllerButton(CallbackInfo ci) {
int i = this.width / 2 - 155; if (!showAlternativeButton) {
int j = i + 160; int i = this.width / 2 - 155;
int k = this.height / 6 - 12 + 48;; int j = i + 160;
this.addDrawableChild(new ButtonWidget(j, k, 150, 20, new TranslatableText("midnightcontrols.menu.title.controller").append("..."), (button) -> { int k = this.height / 6 - 12 + 48;
this.client.setScreen(new MidnightControlsSettingsScreen(this, false)); this.addDrawableChild(new ButtonWidget(j, k, 150, 20, Text.translatable("midnightcontrols.menu.title.controller").append("..."), (button) -> {
})); this.client.setScreen(new MidnightControlsSettingsScreen(this, false));
}));
}
} }
} }

View File

@@ -29,7 +29,9 @@ public interface CreativeInventoryScreenAccessor {
* @return the selected tab index * @return the selected tab index
*/ */
@Accessor("selectedTab") @Accessor("selectedTab")
int getSelectedTab(); static int getSelectedTab() {
return 0;
}
/** /**
* Sets the selected tab. * Sets the selected tab.

View File

@@ -10,6 +10,8 @@
package eu.midnightdust.midnightcontrols.client.mixin; package eu.midnightdust.midnightcontrols.client.mixin;
import net.minecraft.client.option.GameOptions; import net.minecraft.client.option.GameOptions;
import net.minecraft.client.option.SimpleOption;
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;
@@ -22,13 +24,13 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
* Sets the default of the Auto-Jump option to false. * Sets the default of the Auto-Jump option to false.
*/ */
@Mixin(GameOptions.class) @Mixin(GameOptions.class)
public class GameOptionsMixin { public abstract class GameOptionsMixin {
@Shadow
public boolean autoJump; @Shadow public abstract SimpleOption<Boolean> getAutoJump();
@Inject(method = "load", at = @At("HEAD")) @Inject(method = "load", at = @At("HEAD"))
public void onInit(CallbackInfo ci) { public void onInit(CallbackInfo ci) {
// Set default value of the Auto-Jump option to false. // Set default value of the Auto-Jump option to false.
this.autoJump = false; getAutoJump().setValue(false);
} }
} }

View File

@@ -12,7 +12,9 @@ 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.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;
@@ -20,9 +22,11 @@ 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 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;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;
import org.spongepowered.asm.mixin.gen.Invoker; import org.spongepowered.asm.mixin.gen.Invoker;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
@@ -34,7 +38,6 @@ 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 {
@Accessor("x") @Accessor("x")
public abstract int getX(); public abstract int getX();
@@ -53,18 +56,27 @@ public abstract class HandledScreenMixin implements HandledScreenAccessor {
@Inject(method = "render", at = @At("RETURN")) @Inject(method = "render", at = @At("RETURN"))
public void onRender(MatrixStack matrices, 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) { if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && MidnightControlsConfig.hudEnable) {
var client = MinecraftClient.getInstance(); var client = MinecraftClient.getInstance();
matrices.push();
int x = 2, y = client.getWindow().getScaledHeight() - 2 - MidnightControlsRenderer.ICON_SIZE; int x = 2, y = client.getWindow().getScaledHeight() - 2 - MidnightControlsRenderer.ICON_SIZE;
if (MidnightControlsCompat.isEMIPresent() && EMICompat.isEMIEnabled()) {
x = MidnightControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_A}, "midnightcontrols.action.pickup_all", true, client) + 2; x += 42;
x = MidnightControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_B}, "midnightcontrols.action.exit", true, client) + 2; }
if (!ButtonBinding.TAKE_ALL.isNotBound()) x = MidnightControlsRenderer.drawButtonTip(matrices, x, y, ButtonBinding.TAKE_ALL,true, client) + 2;
if (!ButtonBinding.EXIT.isNotBound()) x = MidnightControlsRenderer.drawButtonTip(matrices, x, y, ButtonBinding.EXIT, true, client) + 2;
if (MidnightControlsCompat.isReiPresent()) { if (MidnightControlsCompat.isReiPresent()) {
x = 2; x = 2;
y -= 24; y -= 24;
} }
x = MidnightControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_X}, "midnightcontrols.action.pickup", true, client) + 2; if (MidnightControlsCompat.isEMIPresent() && EMICompat.isEMIEnabled() && EMICompat.isSearchBarCentered()) {
MidnightControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_Y}, "midnightcontrols.action.quick_move", true, client); x = client.getWindow().getScaledWidth() - 55 - client.textRenderer.getWidth(Text.translatable("midnightcontrols.action.pickup"))
- client.textRenderer.getWidth(Text.translatable("midnightcontrols.action.quick_move"))
- MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.TAKE) - MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.QUICK_MOVE);
}
if (!ButtonBinding.TAKE.isNotBound()) x = MidnightControlsRenderer.drawButtonTip(matrices, x, y, ButtonBinding.TAKE, true, client);
if (!ButtonBinding.QUICK_MOVE.isNotBound()) MidnightControlsRenderer.drawButtonTip(matrices, x, y, ButtonBinding.QUICK_MOVE, true, client);
matrices.pop();
} }
} }
} }

View File

@@ -28,7 +28,7 @@ public class KeyBindingMixin implements KeyBindingAccessor {
if (!this.pressed) if (!this.pressed)
this.pressed = true; this.pressed = true;
++this.timesPressed; ++this.timesPressed;
return oldPressed != this.pressed; return !oldPressed;
} }
@Override @Override

View File

@@ -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;
}
}

View File

@@ -54,10 +54,6 @@ public abstract class MinecraftClientMixin {
@Nullable @Nullable
public ClientPlayerInteractionManager interactionManager; public ClientPlayerInteractionManager interactionManager;
@Shadow
@Nullable
public ClientWorld world;
@Shadow @Shadow
@Final @Final
public GameRenderer gameRenderer; public GameRenderer gameRenderer;
@@ -104,21 +100,19 @@ 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();
} }
@Inject(method = "render", at = @At("HEAD")) @Inject(method = "render", at = @At("HEAD"))
private void onRender(boolean fullRender, CallbackInfo ci) { private void onRender(CallbackInfo ci) {
MidnightControlsClient.get().onRender((MinecraftClient) (Object) (this)); MidnightControlsClient.get().onRender((MinecraftClient) (Object) (this));
} }
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/GameRenderer;render(FJZ)V", shift = At.Shift.AFTER)) @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/GameRenderer;render(FJZ)V", shift = At.Shift.AFTER))
private void renderVirtualCursor(boolean fullRender, CallbackInfo ci) { private void renderVirtualCursor(boolean fullRender, CallbackInfo ci) {
MidnightControlsRenderer.renderVirtualCursor(new MatrixStack(), (MinecraftClient) (Object) this); MidnightControlsRenderer.renderVirtualCursor(new MatrixStack(), (MinecraftClient) (Object) this);
@@ -138,7 +132,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, this.world, hand, hitResult); var result = this.interactionManager.interactBlock(this.player, hand, hitResult);
if (result.isAccepted()) { if (result.isAccepted()) {
if (result.shouldSwingHand()) { if (result.shouldSwingHand()) {
this.player.swingHand(hand); this.player.swingHand(hand);

View File

@@ -20,6 +20,7 @@ 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.gen.Accessor;
import org.spongepowered.asm.mixin.gen.Invoker; import org.spongepowered.asm.mixin.gen.Invoker;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
@@ -35,6 +36,9 @@ public abstract class MouseMixin implements MouseAccessor {
@Final @Final
private MinecraftClient client; private MinecraftClient client;
@Accessor
public abstract void setLeftButtonClicked(boolean value);
@Invoker("onCursorPos") @Invoker("onCursorPos")
public abstract void midnightcontrols$onCursorPos(long window, double x, double y); public abstract void midnightcontrols$onCursorPos(long window, double x, double y);

View File

@@ -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();
}

View File

@@ -9,6 +9,8 @@
package eu.midnightdust.midnightcontrols.client.mixin; package eu.midnightdust.midnightcontrols.client.mixin;
import com.mojang.blaze3d.systems.RenderSystem;
import eu.midnightdust.lib.util.MidnightColorUtil;
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 net.minecraft.block.ShapeContext; import net.minecraft.block.ShapeContext;
@@ -30,6 +32,8 @@ 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 java.awt.*;
/** /**
* Represents a mixin to WorldRenderer. * Represents a mixin to WorldRenderer.
* <p> * <p>
@@ -49,7 +53,7 @@ public abstract class WorldRendererMixin {
private BufferBuilderStorage bufferBuilders; private BufferBuilderStorage bufferBuilders;
@Shadow @Shadow
private static void drawShapeOutline(MatrixStack matrixStack, VertexConsumer vertexConsumer, VoxelShape voxelShape, double d, double e, double f, float g, float h, float i, float j) { public static void drawShapeOutline(MatrixStack matrixStack, VertexConsumer vertexConsumer, VoxelShape voxelShape, double d, double e, double f, float g, float h, float i, float j) {
} }
@Inject( @Inject(
@@ -86,12 +90,20 @@ 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()));
int[] color = MidnightControlsConfig.reacharoundOutlineColor; Color rgb = MidnightColorUtil.hex2Rgb(MidnightControlsConfig.reacharoundOutlineColorHex);
if (MidnightControlsConfig.reacharoundOutlineColorHex.isEmpty()) rgb = MidnightColorUtil.radialRainbow(1,1);
var vertexConsumer = this.bufferBuilders.getEntityVertexConsumers().getBuffer(RenderLayer.getLines()); RenderSystem.defaultBlendFunc();
RenderSystem.disableTexture();
RenderSystem.disableBlend();
RenderSystem.setShader(GameRenderer::getPositionColorShader);
RenderSystem.setShaderColor(rgb.getRed(), rgb.getGreen(), rgb.getBlue(), MidnightControlsConfig.reacharoundOutlineColorAlpha);
matrices.push();
var vertexConsumer = this.bufferBuilders.getOutlineVertexConsumers().getBuffer(RenderLayer.getLines());
drawShapeOutline(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(),
color[0] / 255.f, color[1] / 255.f, color[2] / 255.f, color[3] / 255.f); rgb.getRed() / 255.f, rgb.getGreen() / 255.f, rgb.getBlue() / 255.f, MidnightControlsConfig.reacharoundOutlineColorAlpha / 255.f);
matrices.pop();
} }
} }
} }

View File

@@ -10,23 +10,29 @@
package eu.midnightdust.midnightcontrols.client.ring; package eu.midnightdust.midnightcontrols.client.ring;
import com.electronwill.nightconfig.core.Config; import com.electronwill.nightconfig.core.Config;
import eu.midnightdust.midnightcontrols.client.ButtonState;
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
import eu.midnightdust.midnightcontrols.client.util.KeyBindingAccessor; import eu.midnightdust.midnightcontrols.client.util.KeyBindingAccessor;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer; import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.option.KeyBinding; import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.option.StickyKeyBinding;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.TranslatableText; import net.minecraft.text.OrderedText;
import net.minecraft.text.Text;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.function.Supplier; import java.util.function.Supplier;
public class KeyBindingRingAction extends RingAction { public class ButtonBindingRingAction extends RingAction {
public static final Factory FACTORY = new Factory(); public static final Factory FACTORY = new Factory();
public final KeyBinding binding; public final ButtonBinding binding;
public KeyBindingRingAction(@NotNull Config config, @NotNull KeyBinding binding) { public ButtonBindingRingAction(@NotNull ButtonBinding binding) {
super(config); super();
this.binding = binding; this.binding = binding;
} }
@@ -37,19 +43,19 @@ public class KeyBindingRingAction extends RingAction {
@Override @Override
public void onAction(@NotNull RingButtonMode mode) { public void onAction(@NotNull RingButtonMode mode) {
KeyBindingAccessor accessor = (KeyBindingAccessor) this.binding; binding.handle(MinecraftClient.getInstance(), 1.0f, ButtonState.PRESS);
switch (mode) { if (binding.asKeyBinding().isPresent()) {
case PRESS, HOLD -> accessor.midnightcontrols$handlePressState(this.activated); binding.asKeyBinding().get().setPressed(true);
case TOGGLE -> { ((KeyBindingAccessor)binding.asKeyBinding().get()).midnightcontrols$press();
accessor.midnightcontrols$handlePressState(!this.binding.isPressed());
this.activated = !this.binding.isPressed();
}
} }
} }
@Override @Override
public void drawIcon(@NotNull MatrixStack matrices, @NotNull TextRenderer textRenderer, int x, int y, boolean hovered) { 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); List<OrderedText> lines = textRenderer.wrapLines(Text.translatable(this.getName()), MidnightRing.ELEMENT_SIZE);
for (int i = 0; i < lines.size(); ++i) {
drawCenteredTextWithShadow(matrices, 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 { protected static class Factory implements RingAction.Factory {

View File

@@ -1,36 +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 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);
}
}

View File

@@ -9,10 +9,12 @@
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;
@@ -28,7 +30,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 = 50; public static final int ELEMENT_SIZE = 75;
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));
@@ -41,7 +43,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 twice a ring action: \"" + name + "\"."); this.mod.warn("Tried to register a ring action twice: \"" + name + "\".");
return; return;
} }
this.actionFactories.put(name, factory); this.actionFactories.put(name, factory);
@@ -50,17 +52,54 @@ public final class MidnightRing {
/** /**
* Loads the ring from configuration. * Loads the ring from configuration.
*/ */
public void load() { public void loadFromConfig() {
// List<Config> configPages = MidnightControlsConfig.ringPages; List<String> configBindings = MidnightControlsConfig.ringBindings;
// if (configPages != null) { if (configBindings != null) {
// this.pages.clear(); this.pages.clear();
// for (var configPage : configPages) { int bindingIndex = 0;
// RingPage.parseRingPage(configPage).ifPresent(this.pages::add); for (int i = 0; i < MathHelper.ceil(configBindings.size() / 8f); ++i) {
// } this.pages.add(new RingPage(i+1 + " / " + MathHelper.ceil(configBindings.size() / 8f)));
// } }
// if (this.pages.isEmpty()) {
// this.pages.add(RingPage.DEFAULT); for (String binding : configBindings) {
// } ButtonBinding buttonBinding = InputManager.getBinding(binding);
if (buttonBinding != null) {
RingPage page = this.pages.get(MathHelper.fastFloor(bindingIndex / 8f));
page.actions[bindingIndex - 8 * (MathHelper.fastFloor(bindingIndex / 8f))] = (new ButtonBindingRingAction(buttonBinding));
++bindingIndex;
}
}
}
if (this.pages.isEmpty()) {
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.fastFloor(bindingIndex / 8f));
page.actions[bindingIndex - 8 * (MathHelper.fastFloor(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() {
@@ -70,4 +109,13 @@ 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();
}
}
} }

View File

@@ -15,7 +15,6 @@ 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.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;
@@ -30,11 +29,9 @@ import java.util.function.Supplier;
* @since 1.4.0 * @since 1.4.0
*/ */
public abstract class RingAction extends DrawableHelper implements Nameable { public abstract class RingAction extends DrawableHelper implements Nameable {
protected Config config;
protected boolean activated = false; protected boolean activated = false;
public RingAction(@NotNull Config config) { public RingAction() {
this.config = config;
} }
/** /**
@@ -43,7 +40,7 @@ public abstract class RingAction extends DrawableHelper implements Nameable {
* @return the text name * @return the text name
*/ */
public Text getTextName() { public Text getTextName() {
return new TranslatableText(this.getName()); return Text.translatable(this.getName());
} }
/** /**
@@ -63,8 +60,8 @@ public abstract class RingAction extends DrawableHelper implements Nameable {
public abstract void onAction(@NotNull RingButtonMode mode); public abstract void onAction(@NotNull RingButtonMode mode);
public void render(@NotNull MatrixStack matrices, @NotNull TextRenderer textRenderer, int x, int y, boolean hovered) { public void render(@NotNull MatrixStack matrices, @NotNull TextRenderer textRenderer, int x, int y, boolean hovered, int index) {
fill(matrices, x, y, x + MidnightRing.ELEMENT_SIZE, y + MidnightRing.ELEMENT_SIZE, hovered ? 0xbb777777 : 0xbb000000); fill(matrices, x, y, x + MidnightRing.ELEMENT_SIZE, y + MidnightRing.ELEMENT_SIZE, hovered || RingPage.selected == index ? 0xbb777777 : 0xbb000000);
drawIcon(matrices, textRenderer, x, y, hovered); drawIcon(matrices, textRenderer, x, y, hovered);
} }

View File

@@ -10,7 +10,6 @@
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;
@@ -31,7 +30,7 @@ public enum RingButtonMode implements Nameable {
RingButtonMode(@NotNull String name) { RingButtonMode(@NotNull String name) {
this.name = name; this.name = name;
this.text = new TranslatableText(this.getTranslationKey()); this.text = Text.translatable(this.getTranslationKey());
} }
/** /**

View File

@@ -10,11 +10,17 @@
package eu.midnightdust.midnightcontrols.client.ring; package eu.midnightdust.midnightcontrols.client.ring;
import com.electronwill.nightconfig.core.Config; import com.electronwill.nightconfig.core.Config;
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer; import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawableHelper; 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.List;
import java.util.Optional; import java.util.Optional;
@@ -29,7 +35,8 @@ 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;
private RingAction[] actions = new RingAction[8]; public static int selected = -1;
public RingAction[] actions = new RingAction[8];
public RingPage(@NotNull String name) { public RingPage(@NotNull String name) {
this.name = name; this.name = name;
@@ -51,6 +58,7 @@ public class RingPage extends DrawableHelper {
public void render(@NotNull MatrixStack matrices, @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) drawCenteredText(matrices, 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;
@@ -59,47 +67,74 @@ public class RingPage extends DrawableHelper {
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(matrices, textRenderer, x, y, isHovered(x, y, mouseX, mouseY)); ringAction.render(matrices, textRenderer, x, y, isHovered(x, y, mouseX, mouseY), i);
x += 55; x += MidnightRing.ELEMENT_SIZE + 5;
} }
y += 55; y += MidnightRing.ELEMENT_SIZE + 5;
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(matrices, textRenderer, x, y, isHovered(x, y, mouseX, mouseY)); ringAction.render(matrices, textRenderer, x, y, isHovered(x, y, mouseX, mouseY), i);
x += 55 * 2; x += (MidnightRing.ELEMENT_SIZE + 5) * 2;
} }
y += 55; y += MidnightRing.ELEMENT_SIZE + 5;
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(matrices, textRenderer, x, y, isHovered(x, y, mouseX, mouseY)); ringAction.render(matrices, textRenderer, x, y, isHovered(x, y, mouseX, mouseY), i);
x += 55; x += MidnightRing.ELEMENT_SIZE + 5;
} }
} }
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; return mouseX >= x && mouseY >= y && mouseX <= x + MidnightRing.ELEMENT_SIZE && mouseY <= y + MidnightRing.ELEMENT_SIZE && selected < 0;
} }
/** /**
* Tries to parse a ring page configuration. * Renders the ring page.
* *
* @param config the configuration * @param width the screen width
* @return an optional ring page * @param height the screen height
* @param mouseX the mouse X-coordinate
* @param mouseY the mouse Y-coordinate
*/ */
public static @NotNull Optional<RingPage> parseRingPage(@NotNull Config config) { public boolean onClick(int width, int height, int mouseX, int mouseY) {
String name = config.get("name"); int centerX = width / 2;
if (name == null) int centerY = height / 2;
return Optional.empty();
var page = new RingPage(name); int offset = MidnightRing.ELEMENT_SIZE + (MidnightRing.ELEMENT_SIZE / 2) + 5;
List<Config> actionConfigs = config.get("actions"); int y = centerY - offset;
int x = centerX - offset;
for (int i = 0; i < 3; i++) {
return Optional.of(page); var ringAction = this.actions[i];
if (ringAction != null && isHovered(x,y,mouseX,mouseY)) {
ringAction.activate(RingButtonMode.PRESS);
return true;
}
x += MidnightRing.ELEMENT_SIZE + 5;
}
y += MidnightRing.ELEMENT_SIZE + 5;
x = centerX - offset;
for (int i = 3; i < 5; i++) {
var ringAction = this.actions[i];
if (ringAction != null && isHovered(x,y,mouseX,mouseY)) {
ringAction.activate(RingButtonMode.PRESS);
return true;
}
x += (MidnightRing.ELEMENT_SIZE + 5) * 2;
}
y += MidnightRing.ELEMENT_SIZE + 5;
x = centerX - offset;
for (int i = 5; i < 8; i++) {
var ringAction = this.actions[i];
if (ringAction != null && isHovered(x,y,mouseX,mouseY)) {
ringAction.activate(RingButtonMode.PRESS);
return true;
}
x += MidnightRing.ELEMENT_SIZE + 5;
}
return false;
} }
} }

View File

@@ -14,4 +14,5 @@ package eu.midnightdust.midnightcontrols.client.util;
*/ */
public interface MouseAccessor { public interface MouseAccessor {
void midnightcontrols$onCursorPos(long window, double x, double y); void midnightcontrols$onCursorPos(long window, double x, double y);
void setLeftButtonClicked(boolean value);
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -0,0 +1,162 @@
{
"midnightcontrols.midnightconfig.title": "MidnightControls Erweiterte Konfiguration",
"key.midnightcontrols.look_down": "Nach unten schauen",
"key.midnightcontrols.look_left": "Nach links schauen",
"key.midnightcontrols.look_right": "Nach rechts schauen",
"key.midnightcontrols.look_up": "Nach oben schauen",
"key.midnightcontrols.ring": "Öffne Ring mit ungebundenen Aktionen",
"midnightcontrols.action.attack": "Angreifen",
"midnightcontrols.action.back": "Zurück",
"midnightcontrols.action.chat": "Chat öffnen",
"midnightcontrols.action.controls_ring": "Öffne Ring mit ungebundenen Aktionen",
"midnightcontrols.action.drop_item": "Item droppen",
"midnightcontrols.action.exit": "Schließen",
"midnightcontrols.action.forward": "Vorwärts",
"midnightcontrols.action.hit": "Schlagen",
"midnightcontrols.action.hotbar_left": "Hotbar nach links",
"midnightcontrols.action.hotbar_right": "Hotbar nach rechts",
"midnightcontrols.action.inventory": "Inventar",
"midnightcontrols.action.jump": "Springen",
"midnightcontrols.action.left": "Links",
"midnightcontrols.action.pause_game": "Spiel pausieren",
"midnightcontrols.action.pick_block": "Block auswählen",
"midnightcontrols.action.pickup": "Aufheben",
"midnightcontrols.action.pickup_all": "Alles aufheben",
"midnightcontrols.action.place": "Platzieren",
"midnightcontrols.action.player_list": "Spielerliste",
"midnightcontrols.action.quick_move": "Schnell bewegen",
"midnightcontrols.action.right": "Rechts",
"midnightcontrols.action.screenshot": "Screenshot aufnehmen",
"midnightcontrols.action.sneak": "Schleichen",
"midnightcontrols.action.sprint": "Sprinten",
"midnightcontrols.action.swap_hands": "Hände wechseln",
"midnightcontrols.action.toggle_perspective": "Perspektive wechseln",
"midnightcontrols.action.toggle_smooth_camera": "Cinematische Kamera",
"midnightcontrols.action.page_back": "Vorherige Seite",
"midnightcontrols.action.page_next": "Nächste Seite",
"midnightcontrols.action.take": "Item nehmen",
"midnightcontrols.action.take_all": "Stack nehmen",
"midnightcontrols.action.use": "Benutzen",
"midnightcontrols.action.zoom": "Zoom",
"midnightcontrols.action.zoom_in": "Zoom erhöhen",
"midnightcontrols.action.zoom_out": "Zoom verringern",
"midnightcontrols.action.zoom_reset": "Zoom zurücksetzen",
"midnightcontrols.button.left_bumper": "Linke Schultertaste",
"midnightcontrols.button.right_bumper": "Rechte Schultertaste",
"midnightcontrols.button.back": "Zurück",
"midnightcontrols.button.start": "Start",
"midnightcontrols.button.guide": "Guide",
"midnightcontrols.button.left_thumb": "Linker Stick",
"midnightcontrols.button.right_thumb": "Rechter Stick",
"midnightcontrols.button.dpad_up": "Steuerkreuz hoch",
"midnightcontrols.button.dpad_right": "Steuerkreuz rechts",
"midnightcontrols.button.dpad_down": "Steuerkreuz runter",
"midnightcontrols.button.dpad_left": "Steuerkreuz links",
"midnightcontrols.button.l4": "L4",
"midnightcontrols.button.l5": "L5",
"midnightcontrols.button.r4": "R4",
"midnightcontrols.button.r5": "L5",
"midnightcontrols.axis.left_x+": "Links X+",
"midnightcontrols.axis.left_y+": "Links Y+",
"midnightcontrols.axis.right_x+": "Rechts X+",
"midnightcontrols.axis.right_y+": "Rechts Y+",
"midnightcontrols.axis.left_trigger": "Linker Trigger",
"midnightcontrols.axis.right_trigger": "Rechter Trigger",
"midnightcontrols.axis.left_x-": "Links X-",
"midnightcontrols.axis.left_y-": "Links Y-",
"midnightcontrols.axis.right_x-": "Rechts X-",
"midnightcontrols.axis.right_y-": "Rechts Y-",
"midnightcontrols.button.unknown": "Unbekannt (%d)",
"midnightcontrols.controller.tutorial.title": "Spiele Minecraft mit Controller!",
"midnightcontrols.controller.tutorial.description": "Gehe zu %s -> %s -> %s",
"midnightcontrols.controller.connected": "Controller %d verbunden.",
"midnightcontrols.controller.disconnected": "Controller %d getrennt.",
"midnightcontrols.controller.mappings.1": "Um die Controller-Mappings anzupassen, benutze %s",
"midnightcontrols.controller.mappings.3": "und füge die Controller-Mappings in den Mapping-Editor ein.",
"midnightcontrols.controller.mappings.error": "Fehler beim Laden der Controller-Mappings.",
"midnightcontrols.controller.mappings.error.write": "Fehler beim Schreiben der Controller Mappings.",
"midnightcontrols.controller.mappings.updated": "Mappings aktualisiert!",
"midnightcontrols.controller_type.default": "Standard",
"midnightcontrols.controls_mode.default": "Tastatur/Maus",
"midnightcontrols.controls_mode.controller": "Controller",
"midnightcontrols.controls_mode.touchscreen": "Touchscreen (In Arbeit)",
"midnightcontrols.hud_side.left": "Links",
"midnightcontrols.hud_side.right": "Rechts",
"midnightcontrols.menu.analog_movement": "Analoge Bewegung",
"midnightcontrols.menu.auto_switch_mode": "Automatischer Wechsel",
"midnightcontrols.menu.controller": "Controller",
"midnightcontrols.menu.controller2": "Zweiter Controller",
"midnightcontrols.menu.controller_type": "Controller-Typ",
"midnightcontrols.menu.controls_mode": "Modus",
"midnightcontrols.menu.double_tap_to_sprint": "Doppel-Tipp zum Sprinten",
"midnightcontrols.menu.fast_block_placing": "Schnelles Bauen",
"midnightcontrols.menu.fly_drifting": "Flug-Drifting",
"midnightcontrols.menu.fly_drifting_vertical": "Vertikales Flug-Drifting",
"midnightcontrols.menu.hud_enable": "HUD aktivieren",
"midnightcontrols.menu.hud_side": "HUD-Seite",
"midnightcontrols.menu.invert_right_x_axis": "X rechts umkehren",
"midnightcontrols.menu.invert_right_y_axis": "Y rechts umkehren",
"midnightcontrols.menu.keyboard_controls": "Tastatureinstellungen...",
"midnightcontrols.menu.left_dead_zone": "Tote Zone des linken Sticks",
"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_y_value": "Maximalwert Linke Y-Achse",
"midnightcontrols.menu.max_right_x_value": "Maximalwert Rechte X-Achse",
"midnightcontrols.menu.max_right_y_value": "Maximalwert Rechte Y-Achse",
"midnightcontrols.menu.mouse_speed": "Mausgeschwindigkeit",
"midnightcontrols.menu.reacharound.horizontal": "Vorderes Blockplatzieren",
"midnightcontrols.menu.reacharound.vertical": "Vertikales Umgreifen",
"midnightcontrols.menu.reload_controller_mappings": "Controller-Mappings neuladen",
"midnightcontrols.menu.right_dead_zone": "Tote Zone des rechten Sticks",
"midnightcontrols.menu.rotation_speed": "Rotationsgeschwindigkeit (X-Achse)",
"midnightcontrols.menu.y_axis_rotation_speed": "Rotationsgeschwindigkeit (Y-Achse)",
"midnightcontrols.menu.separator.controller": "Controller",
"midnightcontrols.menu.separator.general": "Generell",
"midnightcontrols.menu.title": "MidnightControls - Einstellungen",
"midnightcontrols.menu.title.controller": "Controlleroptionen",
"midnightcontrols.menu.title.controller_controls": "Controller Aktionen",
"midnightcontrols.menu.title.gameplay": "Gameplay Optionen",
"midnightcontrols.menu.title.general": "Generelle Optionen",
"midnightcontrols.menu.title.hud": "HUD Optionen",
"midnightcontrols.menu.title.mappings.string": "Mapping-Datei Editor",
"midnightcontrols.menu.title.visual": "Visuelle Optionen",
"midnightcontrols.menu.unfocused_input": "Unfokussierte Eingabe",
"midnightcontrols.menu.virtual_mouse": "Virtuelle Maus",
"midnightcontrols.menu.virtual_mouse.skin": "Aussehen der Virtuellen Maus",
"midnightcontrols.narrator.unbound": "%s entbunden",
"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_dark": "Standard Dunkel",
"midnightcontrols.virtual_mouse.skin.second_light": "Alternativ Hell",
"midnightcontrols.virtual_mouse.skin.second_dark": "Alternativ Dunkel",
"midnightcontrols.button.a": "A",
"midnightcontrols.button.b": "B",
"midnightcontrols.button.x": "X",
"midnightcontrols.button.y": "Y",
"modmenu.descriptionTranslation.midnightcontrols": "Fügt Controller-Unterstützung hinzu und verbessert allgemein die Steuerung.\nBasiert auf der LambdaControls mod, deren Entwicklung leider eingestellt wurde.",
"modmenu.summaryTranslation.midnightcontrols": "Fügt Controller-Unterstützung hinzu und verbessert allgemein die Steuerung."
}

View File

@@ -4,12 +4,14 @@
"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": "Show controls ring", "key.midnightcontrols.ring": "Open Unbound Keybind Ring",
"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.drop_item": "Drop Item", "midnightcontrols.action.drop_item": "Drop Item",
"midnightcontrols.action.exit": "Exit", "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",
@@ -26,18 +28,29 @@
"midnightcontrols.action.quick_move": "Quick move", "midnightcontrols.action.quick_move": "Quick move",
"midnightcontrols.action.right": "Right", "midnightcontrols.action.right": "Right",
"midnightcontrols.action.screenshot": "Take Screenshot", "midnightcontrols.action.screenshot": "Take Screenshot",
"midnightcontrols.action.slot_up": "Move Slot up",
"midnightcontrols.action.slot_down": "Move Slot down",
"midnightcontrols.action.slot_left": "Move Slot left",
"midnightcontrols.action.slot_right": "Move Slot right",
"midnightcontrols.action.sneak": "Sneak", "midnightcontrols.action.sneak": "Sneak",
"midnightcontrols.action.sprint": "Sprint", "midnightcontrols.action.sprint": "Sprint",
"midnightcontrols.action.swap_hands": "Swap Hands", "midnightcontrols.action.swap_hands": "Swap Hands",
"midnightcontrols.action.toggle_perspective": "Toggle Perspective", "midnightcontrols.action.toggle_perspective": "Toggle Perspective",
"midnightcontrols.action.toggle_smooth_camera": "Toggle Cinematic Camera", "midnightcontrols.action.toggle_smooth_camera": "Toggle Cinematic Camera",
"midnightcontrols.action.page_back": "Previous Page",
"midnightcontrols.action.page_next": "Next Page",
"midnightcontrols.action.tab_back": "Previous Tab",
"midnightcontrols.action.tab_next": "Next Tab",
"midnightcontrols.action.take": "Take Item",
"midnightcontrols.action.take_all": "Take Stack",
"midnightcontrols.action.use": "Use", "midnightcontrols.action.use": "Use",
"midnightcontrols.action.zoom": "Zoom", "midnightcontrols.action.zoom": "Zoom",
"midnightcontrols.action.zoom_in": "Increase Zoom", "midnightcontrols.action.zoom_in": "Increase Zoom",
"midnightcontrols.action.zoom_out": "Decrease Zoom", "midnightcontrols.action.zoom_out": "Decrease Zoom",
"midnightcontrols.action.zoom_reset": "Reset Zoom", "midnightcontrols.action.zoom_reset": "Reset Zoom",
"midnightcontrols.action.key.emotecraft.fastchoose": "Fast Choose Emote", "midnightcontrols.action.emi_page_left": "Previous Page",
"midnightcontrols.action.key.emotecraft.stop": "Stop Emote", "midnightcontrols.action.emi_page_right": "Next Page",
"midnightcontrols.category.emi": "EMI",
"midnightcontrols.button.a": "A", "midnightcontrols.button.a": "A",
"midnightcontrols.button.b": "B", "midnightcontrols.button.b": "B",
"midnightcontrols.button.x": "X", "midnightcontrols.button.x": "X",
@@ -68,6 +81,8 @@
"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.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.",
"midnightcontrols.controller.mappings.1": "To configure the controller mappings, please use %s", "midnightcontrols.controller.mappings.1": "To configure the controller mappings, please use %s",
@@ -75,23 +90,27 @@
"midnightcontrols.controller.mappings.error": "Error while loading mappings.", "midnightcontrols.controller.mappings.error": "Error while loading mappings.",
"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",
"midnightcontrols.controller_type.switch": "Switch", "midnightcontrols.controller_type.dualsense": "DualSense",
"midnightcontrols.controller_type.xbox": "Xbox", "midnightcontrols.controller_type.switch": "Switch/Wii Controller",
"midnightcontrols.controller_type.steam": "Steam", "midnightcontrols.controller_type.xbox": "Xbox One/Series Controller",
"midnightcontrols.controller_type.ouya": "OUYA", "midnightcontrols.controller_type.xbox_360": "Xbox 360 Controller",
"midnightcontrols.controller_type.steam_controller": "Steam Controller",
"midnightcontrols.controller_type.steam_deck": "Steam Deck",
"midnightcontrols.controller_type.ouya": "OUYA 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", "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.auto_switch_mode": "Auto Switch Mode", "midnightcontrols.menu.auto_switch_mode": "Auto Switch Mode",
"midnightcontrols.menu.controller": "Controller", "midnightcontrols.menu.controller": "Controller",
"midnightcontrols.menu.controller2": "Second Controller", "midnightcontrols.menu.controller2": "Second Controller",
"midnightcontrols.menu.controller_type": "Controller Type", "midnightcontrols.menu.controller_type": "Controller Type",
"midnightcontrols.menu.controls_mode": "Mode", "midnightcontrols.menu.controls_mode": "Mode",
"midnightcontrols.menu.double_tap_to_sprint": "Double-Tap to Sprint",
"midnightcontrols.menu.fast_block_placing": "Fast Block Placing", "midnightcontrols.menu.fast_block_placing": "Fast Block Placing",
"midnightcontrols.menu.fly_drifting": "Fly Drifting", "midnightcontrols.menu.fly_drifting": "Fly Drifting",
"midnightcontrols.menu.fly_drifting_vertical": "Vertical Fly Drifting", "midnightcontrols.menu.fly_drifting_vertical": "Vertical Fly Drifting",
@@ -100,7 +119,7 @@
"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.keyboard_controls": "Keyboard Controls...", "midnightcontrols.menu.keyboard_controls": "Keyboard Controls...",
"midnightcontrols.menu.left_dead_zone": "Left Dead Zone", "midnightcontrols.menu.left_dead_zone": "Left Stick Dead Zone",
"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_y_value": "Left Y Axis Max Value", "midnightcontrols.menu.max_left_y_value": "Left Y Axis Max Value",
@@ -110,13 +129,14 @@
"midnightcontrols.menu.reacharound.horizontal": "Front Block Placing", "midnightcontrols.menu.reacharound.horizontal": "Front Block Placing",
"midnightcontrols.menu.reacharound.vertical": "Vertical Reacharound", "midnightcontrols.menu.reacharound.vertical": "Vertical Reacharound",
"midnightcontrols.menu.reload_controller_mappings": "Reload Controller Mappings", "midnightcontrols.menu.reload_controller_mappings": "Reload Controller Mappings",
"midnightcontrols.menu.right_dead_zone": "Right Dead Zone", "midnightcontrols.menu.right_dead_zone": "Right Stick Dead Zone",
"midnightcontrols.menu.rotation_speed": "Rotation Speed", "midnightcontrols.menu.rotation_speed": "X Axis Rotation Speed",
"midnightcontrols.menu.y_axis_rotation_speed": "Y Axis Rotation Speed",
"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 Controls", "midnightcontrols.menu.title.controller_controls": "Controller Bindings",
"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",
@@ -127,17 +147,18 @@
"midnightcontrols.menu.virtual_mouse.skin": "Virtual Mouse Skin", "midnightcontrols.menu.virtual_mouse.skin": "Virtual Mouse Skin",
"midnightcontrols.narrator.unbound": "Unbound %s", "midnightcontrols.narrator.unbound": "Unbound %s",
"midnightcontrols.not_bound": "Not bound", "midnightcontrols.not_bound": "Not bound",
"midnightcontrols.tooltip.analog_movement": "Enables analog movement when possible.", "midnightcontrols.tooltip.analog_movement": "When possible, enables analog movement.",
"midnightcontrols.tooltip.auto_switch_mode": "If the controls mode should be switched to Controller automatically if one is connected.", "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 Joy-Cons support for example.", "midnightcontrols.tooltip.controller2": "Second controller to use, which allows (for example) Joy-Cons support.",
"midnightcontrols.tooltip.controller_type": "The controller type to display the correct buttons.", "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.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.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": "While flying, enables Vanilla drifting/inertia.",
"midnightcontrols.tooltip.fly_drifting_vertical": "While flying, enables Vanilla vertical drifting/intertia.", "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_enable": "Toggles the on-screen controller button indicator.",
"midnightcontrols.tooltip.hud_side": "The position of the HUD.", "midnightcontrols.tooltip.hud_side": "The position of the HUD.",
"midnightcontrols.tooltip.left_dead_zone": "The dead zone for the controller's left analogue stick.", "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_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_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_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.",
@@ -146,12 +167,14 @@
"midnightcontrols.tooltip.reacharound.horizontal": "Enables front block placing, §cmight be considered cheating on some servers§r.", "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.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.reload_controller_mappings": "Reloads the controller mappings file.",
"midnightcontrols.tooltip.right_dead_zone": "The dead zone for the controller's right analogue stick.", "midnightcontrols.tooltip.right_dead_zone": "The dead zone for the controller's right analog stick.",
"midnightcontrols.tooltip.rotation_speed": "The camera rotation speed in controller mode.", "midnightcontrols.tooltip.rotation_speed": "The camera's X Axis rotation speed in controller mode.",
"midnightcontrols.tooltip.unfocused_input": "Allow controller input when the window is not focused.", "midnightcontrols.tooltip.y_axis_rotation_speed": "The camera's Y Axis rotation speed in controller mode.",
"midnightcontrols.tooltip.virtual_mouse": "Enable the virtual mouse which is handful in the case of a splitscreen.", "midnightcontrols.tooltip.unfocused_input": "Allows controller input when the window is not focused.",
"midnightcontrols.tooltip.virtual_mouse": "Enables the virtual mouse, which is useful 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",
} "modmenu.descriptionTranslation.midnightcontrols": "Adds controller support and enhanced controls overall.\nForked from LambdaControls, which sadly got discontinued."
}

View File

@@ -104,7 +104,8 @@
"midnightcontrols.menu.reacharound.vertical": "Alcance vertical", "midnightcontrols.menu.reacharound.vertical": "Alcance vertical",
"midnightcontrols.menu.reload_controller_mappings": "Recargar asignaciones de controlador", "midnightcontrols.menu.reload_controller_mappings": "Recargar asignaciones de controlador",
"midnightcontrols.menu.right_dead_zone": "Zona muerta derecha", "midnightcontrols.menu.right_dead_zone": "Zona muerta derecha",
"midnightcontrols.menu.rotation_speed": "Velocidad de rotación", "midnightcontrols.menu.rotation_speed": "Velocidad de rotación (eje X)",
"midnightcontrols.menu.y_axis_rotation_speed": "Velocidad de rotación (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",
@@ -140,7 +141,8 @@
"midnightcontrols.tooltip.reacharound.vertical": "Habilita el alcance vertical, §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.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.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.", "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.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.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",

View File

@@ -0,0 +1,132 @@
{
"midnightcontrols.midnightconfig.title": "MidnightControls täpsem seadistus",
"key.midnightcontrols.look_down": "Vaata alla",
"key.midnightcontrols.look_left": "Vaata vasakule",
"key.midnightcontrols.look_right": "Vaata paremale",
"key.midnightcontrols.look_up": "Vaata üles",
"key.midnightcontrols.ring": "Kuva juhtnupuringi",
"midnightcontrols.action.attack": "Ründa",
"midnightcontrols.action.back": "Tagasi",
"midnightcontrols.action.chat": "Ava vestlus",
"midnightcontrols.action.drop_item": "Viska ese",
"midnightcontrols.action.exit": "Välju",
"midnightcontrols.action.forward": "Edasi",
"midnightcontrols.action.hit": "Löö",
"midnightcontrols.action.hotbar_left": "Plokiriba vasakule",
"midnightcontrols.action.hotbar_right": "Plokiriba paremale",
"midnightcontrols.action.inventory": "Seljakott",
"midnightcontrols.action.jump": "Hüppa",
"midnightcontrols.action.left": "Vasakule",
"midnightcontrols.action.pause_game": "Mäng pausile",
"midnightcontrols.action.pick_block": "Vali plokk",
"midnightcontrols.action.pickup": "Korja üles",
"midnightcontrols.action.pickup_all": "Korja kõik üles",
"midnightcontrols.action.place": "Aseta",
"midnightcontrols.action.player_list": "Mängijate loend",
"midnightcontrols.action.quick_move": "Kiirliigutus",
"midnightcontrols.action.right": "Paremale",
"midnightcontrols.action.screenshot": "Loo kuvatõmmis",
"midnightcontrols.action.sneak": "Hiili",
"midnightcontrols.action.sprint": "Jookse",
"midnightcontrols.action.swap_hands": "Vaheta käsi",
"midnightcontrols.action.toggle_perspective": "Lülita perspektiivi",
"midnightcontrols.action.toggle_smooth_camera": "Lülita kinemaatilist kaamerat",
"midnightcontrols.action.page_back": "Eelmine leht",
"midnightcontrols.action.page_next": "Järgmine leht",
"midnightcontrols.action.take": "Võta ese",
"midnightcontrols.action.take_all": "Võta kuhi",
"midnightcontrols.action.use": "Kasuta",
"midnightcontrols.action.zoom": "Suumi",
"midnightcontrols.action.zoom_in": "Suurenda suumi",
"midnightcontrols.action.zoom_out": "Vähenda suumi",
"midnightcontrols.action.zoom_reset": "Lähtesta suum",
"midnightcontrols.action.key.emotecraft.fastchoose": "Vali kiirelt liigutus",
"midnightcontrols.action.key.emotecraft.stop": "Peata liigutus",
"midnightcontrols.button.left_bumper": "Vasak külgnupp",
"midnightcontrols.button.right_bumper": "Parem külgnupp",
"midnightcontrols.button.left_thumb": "Vasak pöidlanupp",
"midnightcontrols.button.right_thumb": "Parem pöidlanupp",
"midnightcontrols.button.dpad_up": "DPAD üles",
"midnightcontrols.button.dpad_right": "DPAD paremale",
"midnightcontrols.button.dpad_down": "DPAD alla",
"midnightcontrols.button.dpad_left": "DPAD vasakule",
"midnightcontrols.axis.left_x+": "Vasak X+",
"midnightcontrols.axis.left_y+": "Vasak Y+",
"midnightcontrols.axis.right_x+": "Parem X+",
"midnightcontrols.axis.right_y+": "Parem Y+",
"midnightcontrols.axis.left_trigger": "Vasak käiviti",
"midnightcontrols.axis.right_trigger": "Parem käiviti",
"midnightcontrols.axis.left_x-": "Vasak X-",
"midnightcontrols.axis.left_y-": "Vasak Y-",
"midnightcontrols.axis.right_x-": "Parem X-",
"midnightcontrols.axis.right_y-": "Parem Y-",
"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.disconnected": "Mängupult %d lahti ühendatud.",
"midnightcontrols.controller.mappings.1": "Mängupuldi vastenduste seadistamiseks palun kasuta %s",
"midnightcontrols.controller.mappings.3": "ning aseta vastendus vastenduste failiredaktorisse.",
"midnightcontrols.controller.mappings.error": "Vastenduste laadimisel esines viga.",
"midnightcontrols.controller.mappings.error.write": "Vastenduste faili kirjutamisel esines viga.",
"midnightcontrols.controller.mappings.updated": "Vastendused uuendatud!",
"midnightcontrols.controller_type.default": "vaikimisi",
"midnightcontrols.controls_mode.default": "klaviatuur/hiir",
"midnightcontrols.controls_mode.controller": "mängupult",
"midnightcontrols.controls_mode.touchscreen": "puuteekraan (arenduses)",
"midnightcontrols.hud_side.left": "vasak",
"midnightcontrols.hud_side.right": "parem",
"midnightcontrols.menu.analog_movement": "Analoogliikumine",
"midnightcontrols.menu.auto_switch_mode": "Vaheta režiimi automaatselt",
"midnightcontrols.menu.controller": "Mängupult",
"midnightcontrols.menu.controller2": "Teine mängupult",
"midnightcontrols.menu.controller_type": "Mängupuldi tüüp",
"midnightcontrols.menu.controls_mode": "Režiim",
"midnightcontrols.menu.double_tap_to_sprint": "Jooksmiseks topeltkoputa",
"midnightcontrols.menu.fast_block_placing": "Kiire plokiasetus",
"midnightcontrols.menu.fly_drifting": "Lennutriivimine",
"midnightcontrols.menu.fly_drifting_vertical": "Vertikaalne lennutriivimine",
"midnightcontrols.menu.hud_enable": "Nähtav liides",
"midnightcontrols.menu.hud_side": "Liidese pool",
"midnightcontrols.menu.invert_right_x_axis": "Pööratud parem X",
"midnightcontrols.menu.invert_right_y_axis": "Pööratud parem Y",
"midnightcontrols.menu.keyboard_controls": "Klaviatuuri juhtnupud...",
"midnightcontrols.menu.left_dead_zone": "Vasak surnud tsoon",
"midnightcontrols.menu.mappings.open_input_str": "Ava vastenduste failiredaktor",
"midnightcontrols.menu.max_left_x_value": "Vasaku X-telje maks. väärtus",
"midnightcontrols.menu.max_left_y_value": "Vasaku Y-telje maks. väärtus",
"midnightcontrols.menu.max_right_x_value": "Parema X-telje maks. väärtus",
"midnightcontrols.menu.max_right_y_value": "Parema Y-telje maks. väärtus",
"midnightcontrols.menu.mouse_speed": "Hiire kiirus",
"midnightcontrols.menu.reacharound.horizontal": "Ploki etteasetus",
"midnightcontrols.menu.reacharound.vertical": "Vertikaalne ümberasetus",
"midnightcontrols.menu.reload_controller_mappings": "Laadi mängupuldi vastendused uuesti",
"midnightcontrols.menu.right_dead_zone": "Parem surnud tsoon",
"midnightcontrols.menu.rotation_speed": "X-telje pöördekiirus",
"midnightcontrols.menu.y_axis_rotation_speed": "Y-telje pöördekiirus",
"midnightcontrols.menu.separator.controller": "Mängupult",
"midnightcontrols.menu.separator.general": "Üldine",
"midnightcontrols.menu.title": "MidnightControls - seaded",
"midnightcontrols.menu.title.controller": "Mängupuldi valikud",
"midnightcontrols.menu.title.controller_controls": "Mängupuldi juhtnupud",
"midnightcontrols.menu.title.gameplay": "Mängukogemuse valikud",
"midnightcontrols.menu.title.general": "Üldised valikud",
"midnightcontrols.menu.title.hud": "Liidese valikud",
"midnightcontrols.menu.title.mappings.string": "Vastenduste failiredaktor",
"midnightcontrols.menu.title.visual": "Välimuse valikud",
"midnightcontrols.menu.unfocused_input": "Fookustamata sisend",
"midnightcontrols.menu.virtual_mouse": "Virtuaalne hiir",
"midnightcontrols.menu.virtual_mouse.skin": "Virtuaalse hiire välimus",
"midnightcontrols.narrator.unbound": "Määramata %s",
"midnightcontrols.not_bound": "määramata",
"midnightcontrols.virtual_mouse.skin.default_light": "vaikimisi hele",
"midnightcontrols.virtual_mouse.skin.default_dark": "vaikimisi tume",
"midnightcontrols.virtual_mouse.skin.second_light": "teine hele",
"midnightcontrols.virtual_mouse.skin.second_dark": "teine tume",
"modmenu.descriptionTranslation.midnightcontrols": "Lisab mängupuldi toe ning täiendab juhtnuppe üldiselt.\nFork loodud LambdaControls-ist, mille toetamine kahjuks lõpetati."
}

View File

@@ -104,7 +104,8 @@
"midnightcontrols.menu.reacharound.vertical": "Placement vertical", "midnightcontrols.menu.reacharound.vertical": "Placement vertical",
"midnightcontrols.menu.reload_controller_mappings": "Recharger les manettes", "midnightcontrols.menu.reload_controller_mappings": "Recharger les manettes",
"midnightcontrols.menu.right_dead_zone": "Zone morte axe droit", "midnightcontrols.menu.right_dead_zone": "Zone morte axe droit",
"midnightcontrols.menu.rotation_speed": "Vitesse de rotation", "midnightcontrols.menu.rotation_speed": "Vitesse de rotation (X)",
"midnightcontrols.menu.y_axis_rotation_speed": "Vitesse de rotation (Y)",
"midnightcontrols.menu.separator.general": "Général", "midnightcontrols.menu.separator.general": "Général",
"midnightcontrols.menu.separator.controller": "Manette", "midnightcontrols.menu.separator.controller": "Manette",
"midnightcontrols.menu.title": "midnightcontrols - Paramètres", "midnightcontrols.menu.title": "midnightcontrols - Paramètres",
@@ -140,7 +141,8 @@
"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.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.tooltip.reload_controller_mappings": "Recharge le fichier de configuration des manettes.", "midnightcontrols.tooltip.reload_controller_mappings": "Recharge le fichier de configuration des manettes.",
"midnightcontrols.tooltip.right_dead_zone": "Zone morte de l'axe droit de la manette.", "midnightcontrols.tooltip.right_dead_zone": "Zone morte de l'axe droit de la manette.",
"midnightcontrols.tooltip.rotation_speed": "Change la vitesse de rotation de la caméra.", "midnightcontrols.tooltip.rotation_speed": "Change la vitesse de rotation de la caméra. (X)",
"midnightcontrols.tooltip.y_axis_rotation_speed": "Change la vitesse de rotation de la caméra. (Y)",
"midnightcontrols.tooltip.unfocused_input": "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.tooltip.virtual_mouse": "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",

View File

@@ -104,7 +104,8 @@
"midnightcontrols.menu.reacharound.vertical": "Placement vertical", "midnightcontrols.menu.reacharound.vertical": "Placement vertical",
"midnightcontrols.menu.reload_controller_mappings": "Recharger les manettes", "midnightcontrols.menu.reload_controller_mappings": "Recharger les manettes",
"midnightcontrols.menu.right_dead_zone": "Zone morte axe droit", "midnightcontrols.menu.right_dead_zone": "Zone morte axe droit",
"midnightcontrols.menu.rotation_speed": "Vitesse de rotation", "midnightcontrols.menu.rotation_speed": "Vitesse de rotation (X)",
"midnightcontrols.menu.y_axis_rotation_speed": "Vitesse de rotation (Y)",
"midnightcontrols.menu.separator.general": "Général", "midnightcontrols.menu.separator.general": "Général",
"midnightcontrols.menu.separator.controller": "Manette", "midnightcontrols.menu.separator.controller": "Manette",
"midnightcontrols.menu.title": "midnightcontrols - Paramètres", "midnightcontrols.menu.title": "midnightcontrols - Paramètres",
@@ -140,7 +141,8 @@
"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.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.tooltip.reload_controller_mappings": "Recharge le fichier de configuration des manettes.", "midnightcontrols.tooltip.reload_controller_mappings": "Recharge le fichier de configuration des manettes.",
"midnightcontrols.tooltip.right_dead_zone": "Zone morte de l'axe droit de la manette.", "midnightcontrols.tooltip.right_dead_zone": "Zone morte de l'axe droit de la manette.",
"midnightcontrols.tooltip.rotation_speed": "Change la vitesse de rotation de la caméra.", "midnightcontrols.tooltip.rotation_speed": "Change la vitesse de rotation de la caméra. (X)",
"midnightcontrols.tooltip.y_axis_rotation_speed": "Change la vitesse de rotation de la caméra. (Y)",
"midnightcontrols.tooltip.unfocused_input": "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.tooltip.virtual_mouse": "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",

View File

@@ -0,0 +1,158 @@
{
"midnightcontrols.midnightconfig.title": "MidnightControls 고급 설정",
"key.midnightcontrols.look_down": "아래쪽 보기",
"key.midnightcontrols.look_left": "왼쪽 보기",
"key.midnightcontrols.look_right": "오른쪽 보기",
"key.midnightcontrols.look_up": "위쪽 보기",
"key.midnightcontrols.ring": "컨트롤 링 표시",
"midnightcontrols.action.attack": "공격",
"midnightcontrols.action.back": "뒤로",
"midnightcontrols.action.chat": "채팅 열기",
"midnightcontrols.action.drop_item": "아이템 버리기",
"midnightcontrols.action.exit": "종료",
"midnightcontrols.action.forward": "앞으로",
"midnightcontrols.action.hit": "때리기",
"midnightcontrols.action.hotbar_left": "단축 바 왼쪽",
"midnightcontrols.action.hotbar_right": "단축 바 오른쪽",
"midnightcontrols.action.inventory": "보관함",
"midnightcontrols.action.jump": "점프",
"midnightcontrols.action.left": "왼쪽",
"midnightcontrols.action.pause_game": "게임 일시 중지",
"midnightcontrols.action.pick_block": "블록 집기",
"midnightcontrols.action.pickup": "집기",
"midnightcontrols.action.pickup_all": "모두 집기",
"midnightcontrols.action.place": "놓기",
"midnightcontrols.action.player_list": "플레이어 목록",
"midnightcontrols.action.quick_move": "빠른 이동",
"midnightcontrols.action.right": "오른쪽",
"midnightcontrols.action.screenshot": "스크린샷 찍기",
"midnightcontrols.action.sneak": "은신",
"midnightcontrols.action.sprint": "달리기",
"midnightcontrols.action.swap_hands": "손 전환",
"midnightcontrols.action.toggle_perspective": "시점 토글",
"midnightcontrols.action.toggle_smooth_camera": "시네마틱 카메라 토글",
"midnightcontrols.action.use": "사용",
"midnightcontrols.action.zoom": "확대/축소",
"midnightcontrols.action.zoom_in": "확대",
"midnightcontrols.action.zoom_out": "축소",
"midnightcontrols.action.zoom_reset": "확대/축소 초기화",
"midnightcontrols.action.key.emotecraft.fastchoose": "이모트 빠른 선택",
"midnightcontrols.action.key.emotecraft.stop": "이모트 중지",
"midnightcontrols.button.a": "A",
"midnightcontrols.button.b": "B",
"midnightcontrols.button.x": "X",
"midnightcontrols.button.y": "Y",
"midnightcontrols.button.left_bumper": "왼쪽 범퍼",
"midnightcontrols.button.right_bumper": "오른쪽 범퍼",
"midnightcontrols.button.back": "뒤로",
"midnightcontrols.button.start": "시작",
"midnightcontrols.button.guide": "가이드",
"midnightcontrols.button.left_thumb": "왼쪽 엄지",
"midnightcontrols.button.right_thumb": "오른쪽 엄지",
"midnightcontrols.button.dpad_up": "DPAD 위",
"midnightcontrols.button.dpad_right": "DPAD 오른쪽",
"midnightcontrols.button.dpad_down": "DPAD 아래",
"midnightcontrols.button.dpad_left": "DPAD 왼쪽",
"midnightcontrols.button.l4": "L4",
"midnightcontrols.button.l5": "L5",
"midnightcontrols.button.r4": "R4",
"midnightcontrols.button.r5": "L5",
"midnightcontrols.axis.left_x+": "왼쪽 X+",
"midnightcontrols.axis.left_y+": "왼쪽 Y+",
"midnightcontrols.axis.right_x+": "오른쪽 X+",
"midnightcontrols.axis.right_y+": "오른쪽 Y+",
"midnightcontrols.axis.left_trigger": "왼쪽 트리거",
"midnightcontrols.axis.right_trigger": "오른쪽 트리거",
"midnightcontrols.axis.left_x-": "왼쪽 X-",
"midnightcontrols.axis.left_y-": "왼쪽 Y-",
"midnightcontrols.axis.right_x-": "오른쪽 X-",
"midnightcontrols.axis.right_y-": "오른쪽 Y-",
"midnightcontrols.button.unknown": "알 수 없음 (%d)",
"midnightcontrols.controller.connected": "컨트롤러 %d 연결됨.",
"midnightcontrols.controller.disconnected": "컨트롤러 %d 연결 끊김.",
"midnightcontrols.controller.mappings.1": "컨트롤러 매핑을 설정하려면, %s을 사용하세요",
"midnightcontrols.controller.mappings.3": "그리고 매핑 파일 편집기에 매핑을 붙여 넣으세요.",
"midnightcontrols.controller.mappings.error": "매핑을 불러오던 중 오류.",
"midnightcontrols.controller.mappings.error.write": "파일에 매핑 작성 중 오류.",
"midnightcontrols.controller.mappings.updated": "매핑 업데이트됨!",
"midnightcontrols.controller_type.default": "기본",
"midnightcontrols.controller_type.dualshock": "듀얼쇼크",
"midnightcontrols.controller_type.switch": "스위치",
"midnightcontrols.controller_type.xbox": "엑스박스",
"midnightcontrols.controller_type.steam": "스팀",
"midnightcontrols.controller_type.ouya": "우야",
"midnightcontrols.controls_mode.default": "키보드/마우스",
"midnightcontrols.controls_mode.controller": "컨트롤러",
"midnightcontrols.controls_mode.touchscreen": "터치스크린",
"midnightcontrols.hud_side.left": "왼쪽",
"midnightcontrols.hud_side.right": "오른쪽",
"midnightcontrols.menu.analog_movement": "아날로그 움직임",
"midnightcontrols.menu.auto_switch_mode": "자동 전환 모드",
"midnightcontrols.menu.controller": "컨트롤러",
"midnightcontrols.menu.controller2": "보조 컨트롤러",
"midnightcontrols.menu.controller_type": "컨트롤러 종류",
"midnightcontrols.menu.controls_mode": "모드",
"midnightcontrols.menu.fast_block_placing": "빠른 블록 배치",
"midnightcontrols.menu.fly_drifting": "비행 관성",
"midnightcontrols.menu.fly_drifting_vertical": "비행 수직 관성",
"midnightcontrols.menu.hud_enable": "HUD 사용",
"midnightcontrols.menu.hud_side": "HUD 측면",
"midnightcontrols.menu.invert_right_x_axis": "오른쪽 X 반전",
"midnightcontrols.menu.invert_right_y_axis": "오른쪽 Y 반전",
"midnightcontrols.menu.keyboard_controls": "키보드 컨트롤...",
"midnightcontrols.menu.left_dead_zone": "왼쪽 데드 존",
"midnightcontrols.menu.mappings.open_input_str": "매핑 파일 편집기 열기",
"midnightcontrols.menu.max_left_x_value": "왼쪽 X 축 최댓값",
"midnightcontrols.menu.max_left_y_value": "왼쪽 Y 축 최댓값",
"midnightcontrols.menu.max_right_x_value": "오른쪽 X 축 최댓값",
"midnightcontrols.menu.max_right_y_value": "오른쪽 Y 축 최댓값",
"midnightcontrols.menu.mouse_speed": "마우스 속도",
"midnightcontrols.menu.reacharound.horizontal": "블록 전면 배치",
"midnightcontrols.menu.reacharound.vertical": "블록 수직 배치",
"midnightcontrols.menu.reload_controller_mappings": "컨트롤러 매핑 다시 불러오기",
"midnightcontrols.menu.right_dead_zone": "오른쪽 데드 존",
"midnightcontrols.menu.rotation_speed": "회전 속도",
"midnightcontrols.menu.separator.controller": "컨트롤러",
"midnightcontrols.menu.separator.general": "일반",
"midnightcontrols.menu.title": "MidnightControls - 설정",
"midnightcontrols.menu.title.controller": "컨트롤러 옵션",
"midnightcontrols.menu.title.controller_controls": "컨트롤러 제어",
"midnightcontrols.menu.title.gameplay": "게임플레이 옵션",
"midnightcontrols.menu.title.general": "일반 옵션",
"midnightcontrols.menu.title.hud": "HUD 옵션",
"midnightcontrols.menu.title.mappings.string": "매핑 파일 편집기",
"midnightcontrols.menu.title.visual": "외형 옵션",
"midnightcontrols.menu.unfocused_input": "언포커스 인풋",
"midnightcontrols.menu.virtual_mouse": "가상 마우스",
"midnightcontrols.menu.virtual_mouse.skin": "가상 마우스 스킨",
"midnightcontrols.narrator.unbound": "%s 해제됨",
"midnightcontrols.not_bound": "바인딩되지 않음",
"midnightcontrols.tooltip.analog_movement": "가능한 경우 아날로그 움직임을 사용합니다.",
"midnightcontrols.tooltip.auto_switch_mode": "컨트롤러가 연결되면 자동으로 컨트롤 모드가 컨트롤러로 전환됩니다.",
"midnightcontrols.tooltip.controller2": "보조 컨트롤러를 사용하려면 Joy-Cons 지원을 허용하세요.",
"midnightcontrols.tooltip.controller_type": "올바른 버튼을 표시할 컨트롤러 종류입니다.",
"midnightcontrols.tooltip.controls_mode": "컨트롤 모드.",
"midnightcontrols.tooltip.fast_block_placing": "크리에이티브 모드에서 비행하는 동안 사용자 속도에 따른 빠른 블록 배치를 사용합니다. §c일부 서버에선 치팅 행위로 취급될 수 있습니다.",
"midnightcontrols.tooltip.fly_drifting": "비행하는 동안 바닐라처럼 관성을 적용합니다.",
"midnightcontrols.tooltip.fly_drifting_vertical": "비행하는 동안 바닐라처럼 수직 관성을 적용합니다.",
"midnightcontrols.tooltip.hud_enable": "화면 컨트롤러 버튼 표시기 토글",
"midnightcontrols.tooltip.hud_side": "HUD 위치.",
"midnightcontrols.tooltip.left_dead_zone": "컨트롤러 왼쪽 아날로그 스틱 데드 존.",
"midnightcontrols.tooltip.max_left_x_value": "모드가 인식하는 왼쪽 X 축 최댓값을 변경합니다. 사용자의 축이 전체 범위를 사용하지 않고 느리게 보일 경우 유용합니다.",
"midnightcontrols.tooltip.max_left_y_value": "모드가 인식하는 왼쪽 Y 축 최댓값을 변경합니다. 사용자의 축이 전체 범위를 사용하지 않고 느리게 보일 경우 유용합니다.",
"midnightcontrols.tooltip.max_right_x_value": "모드가 인식하는 오른쪽 X 축 최댓값을 변경합니다. 사용자의 축이 전체 범위를 사용하지 않고 느리게 보일 경우 유용합니다.",
"midnightcontrols.tooltip.max_right_y_value": "모드가 인식하는 오른쪽 Y 축 최댓값을 변경합니다. 사용자의 축이 전체 범위를 사용하지 않고 느리게 보일 경우 유용합니다.",
"midnightcontrols.tooltip.mouse_speed": "컨트롤러의 에뮬레이트된 마우스 속도.",
"midnightcontrols.tooltip.reacharound.horizontal": "블록 전면 배치를 사용합니다. §c일부 서버에선 치팅 행위로 취급될 수 있습니다§r.",
"midnightcontrols.tooltip.reacharound.vertical": "블록 수직 배치를 사용합니다. 블록 아래에 다른 블록을 배치할 수 있습니다. §c일부 서버에선 치팅 행위로 취급될 수 있습니다§r.",
"midnightcontrols.tooltip.reload_controller_mappings": "컨트롤러 매핑 파일을 다시 불러옵니다.",
"midnightcontrols.tooltip.right_dead_zone": "컨트롤러 오른쪽 아날로그 스틱 데드 존",
"midnightcontrols.tooltip.rotation_speed": "컨트롤러 모드에서 적용되는 카메라 회전 속도.",
"midnightcontrols.tooltip.unfocused_input": "창이 활성화된 상태가 아니여도 컨트롤러 입력 허용.",
"midnightcontrols.tooltip.virtual_mouse": "분할 화면에선 도움 되는 가상 마우스를 사용합니다.",
"midnightcontrols.virtual_mouse.skin.default_light": "기본 라이트",
"midnightcontrols.virtual_mouse.skin.default_dark": "기본 다크",
"midnightcontrols.virtual_mouse.skin.second_light": "두 번째 라이트",
"midnightcontrols.virtual_mouse.skin.second_dark": "두 번째 다크",
"modmenu.descriptionTranslation.midnightcontrols": "컨트롤러 제어 및 전반적인 향상된 제어 기능을 추가합니다.\n안타깝게도 업데이트가 끊긴 LambdaControls의 Fork 버전입니다."
}

View File

@@ -0,0 +1,177 @@
{
"midnightcontrols.midnightconfig.title": "Расширенная Конфигурация MidnightControls",
"key.midnightcontrols.look_down": "Смотреть Вниз",
"key.midnightcontrols.look_left": "Смотреть Налево",
"key.midnightcontrols.look_right": "Смотреть Направо",
"key.midnightcontrols.look_up": "Смотрeть Вверх",
"key.midnightcontrols.ring": "Показать Кольцо Управления",
"midnightcontrols.action.attack": "Атаковать",
"midnightcontrols.action.back": "Назад",
"midnightcontrols.action.chat": "Открыть Чат",
"midnightcontrols.action.debug_screen": "Открыть Отладку (F3)",
"midnightcontrols.action.drop_item": "Выбросить Предмет",
"midnightcontrols.action.exit": "Выйти",
"midnightcontrols.action.forward": "Вперед",
"midnightcontrols.action.hit": "Ударить",
"midnightcontrols.action.hotbar_left": "Панель Быстрого Доступа Налево",
"midnightcontrols.action.hotbar_right": "Панель Быстрого Доступа Направо",
"midnightcontrols.action.inventory": "Инвентарь",
"midnightcontrols.action.jump": "Прыжок",
"midnightcontrols.action.left": "Налево",
"midnightcontrols.action.pause_game": "Приостановить игру",
"midnightcontrols.action.pick_block": "Выбор Блока",
"midnightcontrols.action.pickup": "Взять Половину",
"midnightcontrols.action.pickup_all": "Взять Всё",
"midnightcontrols.action.place": "Поставить",
"midnightcontrols.action.player_list": "Лист Игроков",
"midnightcontrols.action.quick_move": "Переложить",
"midnightcontrols.action.right": "Направо",
"midnightcontrols.action.screenshot": "Сделать Скриншот",
"midnightcontrols.action.slot_up": "Двинуть На Слот Вверх",
"midnightcontrols.action.slot_down": "Двинуть На Слот Вниз",
"midnightcontrols.action.slot_left": "Двинуть На Слот Влево",
"midnightcontrols.action.slot_right": "Двинуть На Слот Вправо",
"midnightcontrols.action.sneak": "Красться",
"midnightcontrols.action.sprint": "Бег",
"midnightcontrols.action.swap_hands": "Поменять Руку",
"midnightcontrols.action.toggle_perspective": "Переключить Перспективу",
"midnightcontrols.action.toggle_smooth_camera": "Переключить Кинематографическую Камеру",
"midnightcontrols.action.page_back": "Предыдущая Страница",
"midnightcontrols.action.page_next": "Следующая Страница",
"midnightcontrols.action.tab_back": "Предыдущая Секция",
"midnightcontrols.action.tab_next": "Следующая Секция",
"midnightcontrols.action.take": "Взять Предмет",
"midnightcontrols.action.take_all": "Взять Стак",
"midnightcontrols.action.use": "Использовать",
"midnightcontrols.action.zoom": "Приблизить",
"midnightcontrols.action.zoom_in": "Увеличить Масштаб",
"midnightcontrols.action.zoom_out": "Уменьшить Масштаб",
"midnightcontrols.action.zoom_reset": "Сбросить Масштаб",
"midnightcontrols.action.emi_page_left": "Предыдущая Страница",
"midnightcontrols.action.emi_page_right": "Следующая Страница",
"midnightcontrols.category.emi": "ЕМИ",
"midnightcontrols.button.a": "A",
"midnightcontrols.button.b": "B",
"midnightcontrols.button.x": "X",
"midnightcontrols.button.y": "Y",
"midnightcontrols.button.left_bumper": "Левый Бампер",
"midnightcontrols.button.right_bumper": "Правый Бампер",
"midnightcontrols.button.back": "Назад",
"midnightcontrols.button.start": "Старт",
"midnightcontrols.button.guide": "Гайд Кнопка",
"midnightcontrols.button.left_thumb": "Левый Стик",
"midnightcontrols.button.right_thumb": "Правый Стик",
"midnightcontrols.button.dpad_up": "Крестовина Вверх",
"midnightcontrols.button.dpad_right": "Крестовина Вправо",
"midnightcontrols.button.dpad_down": "Крестовина Вниз",
"midnightcontrols.button.dpad_left": "Крестовина Влево",
"midnightcontrols.button.l4": "L4",
"midnightcontrols.button.l5": "L5",
"midnightcontrols.button.r4": "R4",
"midnightcontrols.button.r5": "L5",
"midnightcontrols.axis.left_x+": "Левый Стик X+",
"midnightcontrols.axis.left_y+": "Левый Стик Y+",
"midnightcontrols.axis.right_x+": "Правый Стик X+",
"midnightcontrols.axis.right_y+": "Правый Стик Y+",
"midnightcontrols.axis.left_trigger": "Левый Триггер",
"midnightcontrols.axis.right_trigger": "Правый Триггер",
"midnightcontrols.axis.left_x-": "Левый Стик X-",
"midnightcontrols.axis.left_y-": "Левый Стик Y-",
"midnightcontrols.axis.right_x-": "Правый Стик X-",
"midnightcontrols.axis.right_y-": "Правый Стик Y-",
"midnightcontrols.button.unknown": "Неизвестный (%d)",
"midnightcontrols.controller.connected": "Контроллер %d Был Присоединен.",
"midnightcontrols.controller.disconnected": "Контроллер %d Был Отключён.",
"midnightcontrols.controller.mappings.1": "Чтобы настроить раскладку контроллера, используйте %s",
"midnightcontrols.controller.mappings.3": "и вставте ваш итог в редактор файлов раскладок.",
"midnightcontrols.controller.mappings.error": "Ошибка при загрузке раскладки.",
"midnightcontrols.controller.mappings.error.write": "Ошибка при записи раскладки в файл.",
"midnightcontrols.controller.mappings.updated": "Раскладка обновлена!",
"midnightcontrols.controller_type.default": "По стандарту",
"midnightcontrols.controller_type.dualshock": "DualShock",
"midnightcontrols.controller_type.dualsense": "DualSense",
"midnightcontrols.controller_type.switch": "Switch",
"midnightcontrols.controller_type.xbox": "Xbox",
"midnightcontrols.controller_type.xbox_360": "Xbox 360",
"midnightcontrols.controller_type.steam_controller": "Steam Controller",
"midnightcontrols.controller_type.steam_deck": "Steam Deck",
"midnightcontrols.controller_type.ouya": "OUYA",
"midnightcontrols.controls_mode.default": "Клавиатура/Мышь",
"midnightcontrols.controls_mode.controller": "Контроллер",
"midnightcontrols.controls_mode.touchscreen": "Сенсорный Экран (Разраб.)",
"midnightcontrols.hud_side.left": "Больше Налево",
"midnightcontrols.hud_side.right": "Больше Направо",
"midnightcontrols.menu.analog_movement": "Аналоговое Движение",
"midnightcontrols.menu.auto_switch_mode": "Автоматическое Переключение",
"midnightcontrols.menu.controller": "Контроллер",
"midnightcontrols.menu.controller2": "Дополнительный Контроллер",
"midnightcontrols.menu.controller_type": "Тип контроллера",
"midnightcontrols.menu.controls_mode": "Тип",
"midnightcontrols.menu.double_tap_to_sprint": "Дважды Отвести Левый Стик, Чтобы Начать Бежать",
"midnightcontrols.menu.fast_block_placing": "Быстрая Поставка Блоков",
"midnightcontrols.menu.fly_drifting": "Инерция При Полёте",
"midnightcontrols.menu.fly_drifting_vertical": "Вертикальная Инерция При Полёте",
"midnightcontrols.menu.hud_enable": "Включить Иконоки Контроллера",
"midnightcontrols.menu.hud_side": "Расположение Интерфейса",
"midnightcontrols.menu.invert_right_x_axis": "Инвертировать Правый X",
"midnightcontrols.menu.invert_right_y_axis": "Инвертировать Правый Y",
"midnightcontrols.menu.keyboard_controls": "Клавиатурная Настройка...",
"midnightcontrols.menu.left_dead_zone": "Мертвая Зона Левого Стика",
"midnightcontrols.menu.mappings.open_input_str": "Открыть Редактор Файлов Раскладок",
"midnightcontrols.menu.max_left_x_value": "Максимальное Значение Ось Левого X",
"midnightcontrols.menu.max_left_y_value": "Максимальное Значение Ось Левого Y",
"midnightcontrols.menu.max_right_x_value": "Максимальное Значение Ось Правого X",
"midnightcontrols.menu.max_right_y_value": "Максимальное Значение Ось Правого Y",
"midnightcontrols.menu.mouse_speed": "Скорость Курсора",
"midnightcontrols.menu.reacharound.horizontal": "Размещение Переднего Блока",
"midnightcontrols.menu.reacharound.vertical": "Вертикальный Охват",
"midnightcontrols.menu.reload_controller_mappings": "Перезагрузить Раскладку Контроллера",
"midnightcontrols.menu.right_dead_zone": "Мертвая Зона Правого Стика",
"midnightcontrols.menu.rotation_speed": "Скорость Вращения По Оси X",
"midnightcontrols.menu.y_axis_rotation_speed": "Скорость Вращения По Оси Y",
"midnightcontrols.menu.separator.controller": "Контроллер",
"midnightcontrols.menu.separator.general": "Общие",
"midnightcontrols.menu.title": "MidnightControls - Настройки",
"midnightcontrols.menu.title.controller": "Настройки Контроллера",
"midnightcontrols.menu.title.controller_controls": "Управление Контроллером",
"midnightcontrols.menu.title.gameplay": "Во Время Игры Настройки",
"midnightcontrols.menu.title.general": "Общие Настройки",
"midnightcontrols.menu.title.hud": "Настройка Интерфейса",
"midnightcontrols.menu.title.mappings.string": "Редактор Файлов Раскладок",
"midnightcontrols.menu.title.visual": "Настройка Внешнего Вида",
"midnightcontrols.menu.unfocused_input": "Несфокусированный Ввод",
"midnightcontrols.menu.virtual_mouse": "Виртуальныя Мышка",
"midnightcontrols.menu.virtual_mouse.skin": "Дизайн Виртуальной Мышки",
"midnightcontrols.narrator.unbound": "Освобождённый %s",
"midnightcontrols.not_bound": "Не Назначанно",
"midnightcontrols.tooltip.analog_movement": "Включает аналоговое движение, когда это возможно.",
"midnightcontrols.tooltip.auto_switch_mode": "Автоматическое переключение на новый, только подключенный контроллер.",
"midnightcontrols.tooltip.controller2": "Дополнительный контроллер, например для Джой-конов.",
"midnightcontrols.tooltip.controller_type": "Тип контроллера, чтобы правильно сопоставить иконки кнопок.",
"midnightcontrols.tooltip.controls_mode": "Тип контроля над игрой.",
"midnightcontrols.tooltip.double_tap_to_sprint": "При двойном перемещением на левый стик, персонаж начинает бежать.",
"midnightcontrols.tooltip.fast_block_placing": "Во время полета в творческом режиме позволяет быстро размещать блоки в зависимости от вашей скорости. §cНа некоторых серверах это может расцениваться как читерство.§r",
"midnightcontrols.tooltip.fly_drifting": "Во время полета включает ванильную инерцию.",
"midnightcontrols.tooltip.fly_drifting_vertical": "Во время полета включает ванильную вертикальную инерцию.",
"midnightcontrols.tooltip.hud_enable": "Переключает видение иконок кнопок контроллера на экране.",
"midnightcontrols.tooltip.hud_side": "Расположение интерфейса в определённую сторону.",
"midnightcontrols.tooltip.left_dead_zone": "Мертвая зона для левого аналогового стика контроллера.",
"midnightcontrols.tooltip.max_left_x_value": "Изменяет то, что мод в итоге считает максимальным значением для левой оси X. Полезно, если ваша ось не использует весь диапазон и кажется медленной.",
"midnightcontrols.tooltip.max_left_y_value": "Изменяет то, что мод в итоге считает максимальным значением для левой оси Y. Полезно, если ваша ось не использует весь диапазон и кажется медленной.",
"midnightcontrols.tooltip.max_right_x_value": "Изменяет то, что мод в итоге считает максимальным значением для правой оси X. Полезно, если ваша ось не использует весь диапазон и кажется медленной.",
"midnightcontrols.tooltip.max_right_y_value": "Изменяет то, что мод в итоге считает максимальным значением для правой оси Y. Полезно, если ваша ось не использует весь диапазон и кажется медленной.",
"midnightcontrols.tooltip.mouse_speed": "Скорость мыши, эмулируемая контроллером.",
"midnightcontrols.tooltip.reacharound.horizontal": "Позволяет размещать передний блок перед собой. §cМожет рассматриваться как читерство на некоторых серверах§r.",
"midnightcontrols.tooltip.reacharound.vertical": "Обеспечивает вертикальный охват. §cМожет рассматриваться как мошенничество на некоторых серверах§r.",
"midnightcontrols.tooltip.reload_controller_mappings": "Перезагружает файл раскладки контроллеров.",
"midnightcontrols.tooltip.right_dead_zone": "Мертвая зона для правого аналогового стика контроллера.",
"midnightcontrols.tooltip.rotation_speed": "Скорость вращения камеры по оси X в режиме контроллера.",
"midnightcontrols.tooltip.y_axis_rotation_speed": "Скорость вращения камеры по оси Y в режиме контроллера.",
"midnightcontrols.tooltip.unfocused_input": "Разрешить ввод с контроллера, даже если игра на сфокусирована.",
"midnightcontrols.tooltip.virtual_mouse": "Включить виртуальную мышь, очень полезно при игре двоём на одном компьютере.",
"midnightcontrols.virtual_mouse.skin.default_light": "Обычный Светлый",
"midnightcontrols.virtual_mouse.skin.default_dark": "Обычный Тёмный",
"midnightcontrols.virtual_mouse.skin.second_light": "Дополнительный Светлый",
"midnightcontrols.virtual_mouse.skin.second_dark": "Дополнительный Тёмный",
"modmenu.descriptionTranslation.midnightcontrols": "Добавление поддержки контроллера и улучшенние элементов управления в целом.\nРазветвлен от LambdaControls, поддержка которого, к сожалению, прекращена.."
}

View File

@@ -98,7 +98,8 @@
"midnightcontrols.menu.reacharound.horizontal": "Alt Öne Blok Koyma", "midnightcontrols.menu.reacharound.horizontal": "Alt Öne Blok Koyma",
"midnightcontrols.menu.reacharound.vertical": "En Alta Blok Koyma", "midnightcontrols.menu.reacharound.vertical": "En Alta Blok Koyma",
"midnightcontrols.menu.reload_controller_mappings": "Oyun Kolu Eşleştirmelerini Yenile", "midnightcontrols.menu.reload_controller_mappings": "Oyun Kolu Eşleştirmelerini Yenile",
"midnightcontrols.menu.rotation_speed": "Dönme Hızı", "midnightcontrols.menu.rotation_speed": "Dönme Hızı (X)",
"midnightcontrols.menu.y_axis_rotation_speed": "Dönme Hızı (Y)",
"midnightcontrols.menu.title": "midnightcontrols - Ayarlar", "midnightcontrols.menu.title": "midnightcontrols - Ayarlar",
"midnightcontrols.menu.title.controller": "Oyun Kolu Seçenekleri", "midnightcontrols.menu.title.controller": "Oyun Kolu Seçenekleri",
"midnightcontrols.menu.title.controller_controls": "Oyun Kolu Kontrolleri", "midnightcontrols.menu.title.controller_controls": "Oyun Kolu Kontrolleri",
@@ -115,7 +116,6 @@
"midnightcontrols.tooltip.controller2": "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.tooltip.controller_type": "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.tooltip.controls_mode": "Kontrol Modu", "midnightcontrols.tooltip.controls_mode": "Kontrol Modu",
"midnightcontrols.tooltip.dead_zone": "Oyun kolunun analog çubukları için ayarlanan ölü bölge/dead zone",
"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.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.tooltip.fly_drifting": "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.tooltip.fly_drifting_vertical": "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.",
@@ -125,7 +125,8 @@
"midnightcontrols.tooltip.reacharound.horizontal": "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.tooltip.reacharound.vertical": "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.tooltip.reload_controller_mappings": "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.tooltip.rotation_speed": "Oyun kolu modunda olan kamera dönme hızı", "midnightcontrols.tooltip.rotation_speed": "Oyun kolu modunda olan kamera dönme hızı (X)",
"midnightcontrols.tooltip.y_axis_rotation_speed": "Oyun kolu modunda olan kamera dönme hızı (Y)",
"midnightcontrols.tooltip.unfocused_input": "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.tooltip.virtual_mouse": "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",

View File

@@ -104,7 +104,8 @@
"midnightcontrols.menu.reacharound.vertical": "垂直方向方块放置辅助", "midnightcontrols.menu.reacharound.vertical": "垂直方向方块放置辅助",
"midnightcontrols.menu.reload_controller_mappings": "重新加载手柄按键映射", "midnightcontrols.menu.reload_controller_mappings": "重新加载手柄按键映射",
"midnightcontrols.menu.right_dead_zone": "右摇杆死区", "midnightcontrols.menu.right_dead_zone": "右摇杆死区",
"midnightcontrols.menu.rotation_speed": "镜头旋转速度", "midnightcontrols.menu.rotation_speed": "镜头旋转速度 (X)",
"midnightcontrols.menu.y_axis_rotation_speed": "镜头旋转速度 (Y)",
"midnightcontrols.menu.separator.controller": "手柄", "midnightcontrols.menu.separator.controller": "手柄",
"midnightcontrols.menu.separator.general": "通用", "midnightcontrols.menu.separator.general": "通用",
"midnightcontrols.menu.title": "midnightcontrols — 设置", "midnightcontrols.menu.title": "midnightcontrols — 设置",
@@ -140,7 +141,8 @@
"midnightcontrols.tooltip.reacharound.vertical": "启用垂直方向方块放置辅助,可在脚下方块的下方放置方块。\n§c在部分服务器可能会被认定为作弊。", "midnightcontrols.tooltip.reacharound.vertical": "启用垂直方向方块放置辅助,可在脚下方块的下方放置方块。\n§c在部分服务器可能会被认定为作弊。",
"midnightcontrols.tooltip.reload_controller_mappings": "重新加载手柄的按键映射文件。", "midnightcontrols.tooltip.reload_controller_mappings": "重新加载手柄的按键映射文件。",
"midnightcontrols.tooltip.right_dead_zone": "右摇杆配置的死区。\n死区决定摇杆要偏离中心位置多远才能让摇杆的输入有效。", "midnightcontrols.tooltip.right_dead_zone": "右摇杆配置的死区。\n死区决定摇杆要偏离中心位置多远才能让摇杆的输入有效。",
"midnightcontrols.tooltip.rotation_speed": "手柄操作模式下的镜头旋转速度。", "midnightcontrols.tooltip.rotation_speed": "手柄操作模式下的镜头旋转速度。(X)",
"midnightcontrols.tooltip.y_axis_rotation_speed": "手柄操作模式下的镜头旋转速度。(Y)",
"midnightcontrols.tooltip.unfocused_input": "即使游戏窗口处于非活动状态,也允许手柄进行按键输入。", "midnightcontrols.tooltip.unfocused_input": "即使游戏窗口处于非活动状态,也允许手柄进行按键输入。",
"midnightcontrols.tooltip.virtual_mouse": "启用虚拟鼠标,在分屏的情况下很有用。", "midnightcontrols.tooltip.virtual_mouse": "启用虚拟鼠标,在分屏的情况下很有用。",
"midnightcontrols.virtual_mouse.skin.default_light": "默认样式(白色)", "midnightcontrols.virtual_mouse.skin.default_light": "默认样式(白色)",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 416 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 334 B

After

Width:  |  Height:  |  Size: 327 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -3,15 +3,28 @@
"id": "midnightcontrols", "id": "midnightcontrols",
"name": "MidnightControls", "name": "MidnightControls",
"version": "${version}", "version": "${version}",
"description": "Adds better controls, and controller support.", "description": "Adds controller support and enhanced controls overall.",
"authors": [ "authors": [
"LambdAurora", "LambdAurora",
"Motschen" "Motschen"
], ],
"contributors": [
"akemin-dayo",
"DioEgizio",
"Ivanoks",
"KiskaUWU",
"RaptaG",
"Madis0",
"FlashyReese",
"Hambaka",
"joaoh1",
"EnnuiL",
"egeesin"
],
"contact": { "contact": {
"homepage": "https://modrinth.com/mod/midnightcontrols", "homepage": "https://modrinth.com/mod/midnightcontrols",
"sources": "https://github.com/LambdAurora/midnightcontrols.git", "sources": "https://github.com/TeamMidnightDust/MidnightControls",
"issues": "https://github.com/LambdAurora/midnightcontrols/issues" "issues": "https://github.com/TeamMidnightDust/MidnightControls/issues"
}, },
"license": "MIT", "license": "MIT",
"icon": "assets/midnightcontrols/icon.png", "icon": "assets/midnightcontrols/icon.png",
@@ -37,17 +50,16 @@
"fabric": ">=0.36.0", "fabric": ">=0.36.0",
"minecraft": ">=1.17", "minecraft": ">=1.17",
"spruceui": ">=3.2.0", "spruceui": ">=3.2.0",
"java": ">=16" "java": ">=17"
}, },
"recommends": { "recommends": {
"modmenu": ">=1.12.2" "modmenu": ">=1.12.2"
}, },
"suggests": { "suggests": {
"flamingo": "*" "kontrolo": "*"
}, },
"breaks": { "breaks": {
"lambdacontrols": "*", "lambdacontrols": "*",
"modmenu": "<1.12.2", "modmenu": "<1.12.2"
"optifabric": "*"
} }
} }

View File

@@ -16,7 +16,9 @@
"MinecraftClientMixin", "MinecraftClientMixin",
"MouseMixin", "MouseMixin",
"RecipeBookWidgetAccessor", "RecipeBookWidgetAccessor",
"WorldRendererMixin" "WorldRendererMixin",
"KeyBindingRegistryImplAccessor",
"ScreenAccessor"
], ],
"injectors": { "injectors": {
"defaultRequire": 1 "defaultRequire": 1

View File

@@ -1,9 +1,10 @@
{ {
"required": true, "required": true,
"package": "dev.lambdaurora.midnightcontrols.client.compat.mixin", "package": "eu.midnightdust.midnightcontrols.client.compat.mixin",
"plugin": "eu.midnightdust.midnightcontrols.client.compat.MidnightControlsMixinPlugin", "plugin": "eu.midnightdust.midnightcontrols.client.compat.MidnightControlsMixinPlugin",
"compatibilityLevel": "JAVA_16", "compatibilityLevel": "JAVA_16",
"client": [ "client": [
"SodiumOptionsGUIAccessor"
], ],
"injectors": { "injectors": {
"defaultRequire": 1 "defaultRequire": 1

View File

@@ -0,0 +1,4 @@
Some of the textures in this Resourcepack are directly taken from the Bedrock assets and are therefore © Mojang Studios.
Credits go to Ivanoks for redrawing the Bedrock XBox controller icons in 15x15,
Motschen for creating the assets for the other controllers
and LambdAurora for the original assets, part of which are also included.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@@ -0,0 +1,6 @@
{
"pack": {
"pack_format": 9,
"description": "Makes controller tooltips use similar icons to Bedrock Edition"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,4 @@
Some of the textures in this Resourcepack are directly taken from the Console Edition assets and are therefore © Mojang Studios.
Credits go to Ivanoks for redrawing the Console Generic, Dualshock, DualSense, Switch, Xbox 360 and XBox One controller icons in 15x15,
Motschen for creating the assets for the other controllers
and LambdAurora for the original assets, part of which are also included.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Some files were not shown because too many files have changed in this diff Show More