Merge pull request #82 from TeamMidnightDust/1.18-temp
Backport 1.5.0 to 1.18
51
README.md
@@ -1,29 +1,29 @@
|
||||
<div align="center">
|
||||
<img src=https://github.com/TeamMidnightDust/MidnightControls/blob/1.19/src/main/resources/assets/midnightcontrols/icon.png>
|
||||
|
||||
# MidnightControls
|
||||
|
||||
<!-- modrinth_exclude.start -->
|
||||
 <!-- modrinth_exclude.end -->
|
||||
[](https://raw.githubusercontent.com/TeamMidnightDust/MidnightControls/master/LICENSE)
|
||||

|
||||
[![Mod loader: Quilt/Fabric]][quilt] <!-- modrinth_exclude.start -->
|
||||
[](https://github.com/TeamMidnightDust/MidnightControls/releases)
|
||||
[](https://www.curseforge.com/minecraft/mc-mods/midnightcontrols)
|
||||
<!-- modrinth_exclude.end -->
|
||||
[](https://www.curseforge.com/minecraft/mc-mods/midnightcontrols)
|
||||
[![Modrinth]](https://modrinth.com/mod/midnightcontrols)
|
||||
[](https://github.com/TeamMidnightDust/MidnightControls/releases)
|
||||

|
||||
[![Mod loader: Quilt/Fabric]][Quilt]
|
||||
[](https://www.oracle.com/java/technologies/downloads/#java17)
|
||||
[](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?
|
||||
|
||||
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!
|
||||
|
||||
This mod also adds controller support.
|
||||
|
||||
## ✅ Features:
|
||||
## Features:
|
||||
|
||||
- Controller support
|
||||
- Touchscreen support (very experimental and buggy).
|
||||
- Touchscreen support
|
||||
- Keyboard controls to look around.
|
||||
- Toggleable on screen button indicator (like in Bedrock Edition).
|
||||
- Vertical reach-around.
|
||||
@@ -47,14 +47,23 @@ This mod also adds controller support.
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
<!-- modrinth_exclude.start -->
|
||||
## Build
|
||||
|
||||
Just do `./gradlew build` and everything should build just fine!
|
||||
<!-- modrinth_exclude.end -->
|
||||
Clone the repo with:
|
||||
```
|
||||
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!
|
||||
|
||||
[Quilt]: https://quiltmc.org
|
||||
|
||||
[quilt]: https://quiltmc.org
|
||||
[Mod loader: Quilt/Fabric]: https://img.shields.io/badge/modloader-Quilt%2FFabric-blueviolet?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAADGAAAAxgGwdJvFAAAFU0lEQVR4nO1bwW7bOBCdCHtP+wUNxIvhS7yA7kkPOjf9AKPam4/OF2zzB96bblXhH0jPPkS5G1jnIvgib/IFtX/ALoYZemmKtEWRRe3aDzAsURbJGQ6HM4/02Wq1gmNGcNTSnxQA8IdakDK4AOCfJpj3SpiI98r2rAMAbxrWNWFFOMeL1nCJdXQa1gPTbpCbnm34ABIeBThv2hgAfOyVcF+2ZwkAfHGo54kVIRe6NVxiny4d6vpn2g36ugfqFLhwFB6kkUoc67k0XLv0qYKj9wEnBXiqZwEAf/ZKOOuV8BkLWBFesyI8A4C/LOt6AoC39C7HtBvg9Vt65hUnC/BUDzrOf1MGq5S9WkDZnuVle7ZqsBKgw/tO73K0hku8/u64EmhxsoA96MMvxdEroBIKO+CWoshnqqJPYTAGRJ8sql3QO3Op7D19D3z7AV8KeAGArFf+32lWhDwnKNuzuaUCclaE93KBiOU9hMQV+FLAOxz9lPHRR0VkZXs2oBDUNon5ULZnKOgcYwl4FTwna/K+CtRRwIK+dTnCCwkP9I0fkXmh4FcN+6UKqqtHblvtb+18po4TvKaPilsS8qVuYx5havsbJXS1I0ZVAXP1B5jfyzm+hAnN+We1XPluioX03kJtY9oNtG1T+b1aburDxhRAQVMGHw3z9k65F41nktmjUnjjrAj7ZXv27ECIyEKgBd7saBuka7lsPu0GA1MjR0+KVpwgMTlrMkN4YoztlZ/2camTvD0QjcWZF6KxMgcLyKbdAN+HKOb1y6PYH49gEsUwUKw1G48gi2KQZcApkYxH1eldUQBxeKbkRfXEQjDZ21+h2bMiHJDwH2wk1rSX0XWueHZd2yCZ/oVSnilTaA3VAiqjRRahQ0JBjuov3ijfPqAua0kUg67tmyjWCmvsS504wGQRnywjPJ8wtY3xw3827fjMBXziUalL3DcNrIzYRwXcTbvBZ7lgPHoNxKKYky1/+2xsHxXQbw2X/EIoggQHyjC9Yh8VcC6NshDc66jLOHpC5KSAPejDL8U+KuArboTQZgjHeARn+MFnvhvbRyfYaQ2XfNkTVFgUr/mIxlvkJuyjAjCae6BrYQUPW37vhDpT4MnAsCyIgbHBnYbcADJt7/t+deBCiSWsCG8sOv5IgU2FnJh2g+RnBDl1oCpgogqEx1TEURUFokx+tpCYnEzzjg1kh+fq/Ix9OXpG6OjjgI1VIGWcOMhlXh4PPdAz1VTe90rIU8Z/L9JUnALXSK4SjSUzOY+Y1ekyOlzjaamTvf3X8cjunBH1v6OeVtsG1QI66qYEVkoVmyA/O5fYmIHjgSsrskUavAc6q1BLeXXiANMZu0HKwGav7opGv+LticZqHOToLBeZrJRxC97qjOsowCTgZYO9OlNa25haMwgvsFMJPp3gLW1ji8b6dO89fhfYIbzAl23T4adtjyNvD6/mbbs9Xgs1hRcwWoIvCxDb47nQNm5aRDHvoPGcblNYCi+gtQSfU+AdLYfioLXYtHA9eruBhsILVJRwUIGQo/ACG0o4GAV4El5grQSffMA3SqbEnBdb1zeunfYsvAB3jL4UwE92KauA2NnNbLerNKhEqJ6Q+FIAOjpcATAVzjFHoC3qC9OurCW0W9s+6vXpAy4p0hPkSUL3ziNHiY3tqfNdQN4jORgnSEGMLyU8Udbq1QIEdEyRF3hSwlp4vKkwQimrHDuxAR6S4tleFIPzERnhSFXQEtbkD1kbwiMOlhJroISK8IiDpcQsp4NWeMRBc4I1lWAUHnHwpOgOJWwVHvFbsMIGJewUHvFb7QuQYxR/ttgIzbUAgB9KOM3uc+PN7QAAAABJRU5ErkJggg==
|
||||
|
||||
[Modrinth]: https://img.shields.io/modrinth/dt/bXX9h73M?logoColor=white&logo=data:image/svg%2bxml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNTEyIDUxNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTUwMy4xNiAzMjMuNTZDNTE0LjU1IDI4MS40NyA1MTUuMzIgMjM1LjkxIDUwMy4yIDE5MC43NkM0NjYuNTcgNTQuMjI5OSAzMjYuMDQgLTI2LjgwMDEgMTg5LjMzIDkuNzc5OTFDODMuODEwMSAzOC4wMTk5IDExLjM4OTkgMTI4LjA3IDAuNjg5OTQxIDIzMC40N0g0My45OUM1NC4yOSAxNDcuMzMgMTEzLjc0IDc0LjcyOTggMTk5Ljc1IDUxLjcwOThDMzA2LjA1IDIzLjI1OTggNDE1LjEzIDgwLjY2OTkgNDUzLjE3IDE4MS4zOEw0MTEuMDMgMTkyLjY1QzM5MS42NCAxNDUuOCAzNTIuNTcgMTExLjQ1IDMwNi4zIDk2LjgxOThMMjk4LjU2IDE0MC42NkMzMzUuMDkgMTU0LjEzIDM2NC43MiAxODQuNSAzNzUuNTYgMjI0LjkxQzM5MS4zNiAyODMuOCAzNjEuOTQgMzQ0LjE0IDMwOC41NiAzNjkuMTdMMzIwLjA5IDQxMi4xNkMzOTAuMjUgMzgzLjIxIDQzMi40IDMxMC4zIDQyMi40MyAyMzUuMTRMNDY0LjQxIDIyMy45MUM0NjguOTEgMjUyLjYyIDQ2Ny4zNSAyODEuMTYgNDYwLjU1IDMwOC4wN0w1MDMuMTYgMzIzLjU2WiIgZmlsbD0iIzMwYjI3YiIvPgogIDxwYXRoIGQ9Ik0zMjEuOTkgNTA0LjIyQzE4NS4yNyA1NDAuOCA0NC43NTAxIDQ1OS43NyA4LjExMDExIDMyMy4yNEMzLjg0MDExIDMwNy4zMSAxLjE3IDI5MS4zMyAwIDI3NS40Nkg0My4yN0M0NC4zNiAyODcuMzcgNDYuNDY5OSAyOTkuMzUgNDkuNjc5OSAzMTEuMjlDNTMuMDM5OSAzMjMuOCA1Ny40NSAzMzUuNzUgNjIuNzkgMzQ3LjA3TDEwMS4zOCAzMjMuOTJDOTguMTI5OSAzMTYuNDIgOTUuMzkgMzA4LjYgOTMuMjEgMzAwLjQ3QzY5LjE3IDIxMC44NyAxMjIuNDEgMTE4Ljc3IDIxMi4xMyA5NC43NjAxQzIyOS4xMyA5MC4yMTAxIDI0Ni4yMyA4OC40NDAxIDI2Mi45MyA4OS4xNTAxTDI1NS4xOSAxMzNDMjQ0LjczIDEzMy4wNSAyMzQuMTEgMTM0LjQyIDIyMy41MyAxMzcuMjVDMTU3LjMxIDE1NC45OCAxMTguMDEgMjIyLjk1IDEzNS43NSAyODkuMDlDMTM2Ljg1IDI5My4xNiAxMzguMTMgMjk3LjEzIDEzOS41OSAzMDAuOTlMMTg4Ljk0IDI3MS4zOEwxNzQuMDcgMjMxLjk1TDIyMC42NyAxODQuMDhMMjc5LjU3IDE3MS4zOUwyOTYuNjIgMTkyLjM4TDI2OS40NyAyMTkuODhMMjQ1Ljc5IDIyNy4zM0wyMjguODcgMjQ0LjcyTDIzNy4xNiAyNjcuNzlDMjM3LjE2IDI2Ny43OSAyNTMuOTUgMjg1LjYzIDI1My45OCAyODUuNjRMMjc3LjcgMjc5LjMzTDI5NC41OCAyNjAuNzlMMzMxLjQ0IDI0OS4xMkwzNDIuNDIgMjczLjgyTDMwNC4zOSAzMjAuNDVMMjQwLjY2IDM0MC42M0wyMTIuMDggMzA4LjgxTDE2Mi4yNiAzMzguN0MxODcuOCAzNjcuNzggMjI2LjIgMzgzLjkzIDI2Ni4wMSAzODAuNTZMMjc3LjU0IDQyMy41NUMyMTguMTMgNDMxLjQxIDE2MC4xIDQwNi44MiAxMjQuMDUgMzYxLjY0TDg1LjYzOTkgMzg0LjY4QzEzNi4yNSA0NTEuMTcgMjIzLjg0IDQ4NC4xMSAzMDkuNjEgNDYxLjE2QzM3MS4zNSA0NDQuNjQgNDE5LjQgNDAyLjU2IDQ0NS40MiAzNDkuMzhMNDg4LjA2IDM2NC44OEM0NTcuMTcgNDMxLjE2IDM5OC4yMiA0ODMuODIgMzIxLjk5IDUwNC4yMloiIGZpbGw9IiMzMGIyN2IiLz4KPC9zdmc+
|
||||
|
||||
@@ -68,8 +68,8 @@ repositories {
|
||||
url 'https://maven.gegy.dev'
|
||||
}
|
||||
maven {
|
||||
name 'CottonMC'
|
||||
url 'https://server.bbkr.space/artifactory/libs-snapshot'
|
||||
name = "CottonMC"
|
||||
url = "https://server.bbkr.space/artifactory/libs-release"
|
||||
}
|
||||
maven { url "https://maven.terraformersmc.com/releases/" }
|
||||
maven { url 'https://maven.kosmx.dev' }
|
||||
@@ -109,6 +109,7 @@ dependencies {
|
||||
// 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}")
|
||||
@@ -120,6 +121,7 @@ dependencies {
|
||||
|
||||
shadow 'com.electronwill.night-config:core:3.6.3'
|
||||
shadow 'com.electronwill.night-config:toml:3.6.3'
|
||||
apply plugin: 'java-library'
|
||||
}
|
||||
loom {
|
||||
accessWidenerPath = file("src/main/resources/midnightcontrols.accesswidener")
|
||||
|
||||
@@ -8,7 +8,7 @@ yarn_mappings=1.18.2+build.3
|
||||
loader_version=0.14.8
|
||||
|
||||
# Mod Properties
|
||||
mod_version = 1.4.1-1.18
|
||||
mod_version = 1.5.0
|
||||
maven_group = eu.midnightdust
|
||||
archives_base_name = midnightcontrols
|
||||
modrinth_id=bXX9h73M
|
||||
@@ -22,6 +22,7 @@ midnightlib_version=0.4.4
|
||||
modmenu_version=2.0.2
|
||||
emotecraft_version=2.1-MC1.18.1-fabric
|
||||
bendylib_version=2.0.+
|
||||
libgui_version=5.4.2+1.18.2
|
||||
emi_version=0.2.0+1.18.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.
|
||||
|
||||
BIN
icon.png
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 174 KiB |
|
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 184 KiB |
@@ -16,7 +16,6 @@ import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
|
||||
import net.fabricmc.loader.api.FabricLoader;
|
||||
import net.fabricmc.loader.api.ModContainer;
|
||||
import net.minecraft.network.PacketByteBuf;
|
||||
import net.minecraft.text.Text;
|
||||
import net.minecraft.util.Identifier;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
@@ -121,8 +121,10 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
|
||||
});
|
||||
|
||||
HudManager.register(this.hud = new MidnightControlsHud(this));
|
||||
FabricLoader.getInstance().getModContainer("midnightcontrols").ifPresent(modContainer ->
|
||||
ResourceManagerHelper.registerBuiltinResourcePack(new Identifier("midnightcontrols","bedrock"), modContainer, ResourcePackActivationType.NORMAL));
|
||||
FabricLoader.getInstance().getModContainer("midnightcontrols").ifPresent(modContainer -> {
|
||||
ResourceManagerHelper.registerBuiltinResourcePack(new Identifier("midnightcontrols","bedrock"), modContainer, ResourcePackActivationType.NORMAL);
|
||||
ResourceManagerHelper.registerBuiltinResourcePack(new Identifier("midnightcontrols","legacy"), modContainer, ResourcePackActivationType.NORMAL);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -192,9 +194,16 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
|
||||
// if (BINDING_RING.wasPressed()) {
|
||||
// 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) {
|
||||
this.input.onRender(client.getTickDelta(), client);
|
||||
this.input.onRender(client);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -61,12 +61,18 @@ public class MidnightControlsConfig extends MidnightConfig {
|
||||
@Entry(name = "Controller ID") public static Object controllerID = 0;
|
||||
@Entry(name = "2nd Controller ID") public static Object secondControllerID = -1;
|
||||
@Entry(name = "midnightcontrols.menu.controller_type") public static ControllerType controllerType = ControllerType.DEFAULT;
|
||||
@Entry(name = "Mouse screens") public static List<String> 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", "hardcorequesting.client.interfaces.GuiQuestBook", "hardcorequesting.client.interfaces.GuiReward", "hardcorequesting.client.interfaces.EditTrackerScreen");
|
||||
@Entry(name = "Mouse screens") public static List<String> 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",
|
||||
"hardcorequesting.client.interfaces.GuiQuestBook", "hardcorequesting.client.interfaces.GuiReward", "hardcorequesting.client.interfaces.EditTrackerScreen",
|
||||
"io.github.kosmx.emotes.arch.gui.screen.ingame.FastChosseScreen");
|
||||
@Entry(name = "Keybindings") public static Map<String, String> BINDINGS = new HashMap<>();
|
||||
|
||||
private static final Pattern BUTTON_BINDING_PATTERN = Pattern.compile("(-?\\d+)\\+?");
|
||||
@Entry(name = "Max analog values") public static double[] maxAnalogValues = new double[]{1, 1, 1, 1};
|
||||
@Entry public static boolean triggerFix = true;
|
||||
@Entry(name = "Trigger button fix") public static boolean triggerFix = true;
|
||||
@Entry(name = "Enable Hints") public static boolean enableHints = true;
|
||||
@Entry(name = "Command Keybinds") public static List<String> commandKeybinds = Lists.newArrayList();
|
||||
|
||||
/**
|
||||
* Loads the configuration
|
||||
|
||||
@@ -10,9 +10,10 @@
|
||||
package eu.midnightdust.midnightcontrols.client;
|
||||
|
||||
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.EMICompat;
|
||||
import eu.midnightdust.midnightcontrols.client.compat.LibGuiCompat;
|
||||
import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat;
|
||||
import eu.midnightdust.midnightcontrols.client.compat.SodiumCompat;
|
||||
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
||||
@@ -20,9 +21,7 @@ import eu.midnightdust.midnightcontrols.client.controller.Controller;
|
||||
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
||||
import eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay;
|
||||
import eu.midnightdust.midnightcontrols.client.gui.widget.ControllerControlsWidget;
|
||||
import eu.midnightdust.midnightcontrols.client.mixin.AdvancementsScreenAccessor;
|
||||
import eu.midnightdust.midnightcontrols.client.mixin.CreativeInventoryScreenAccessor;
|
||||
import eu.midnightdust.midnightcontrols.client.mixin.EntryListWidgetAccessor;
|
||||
import eu.midnightdust.midnightcontrols.client.mixin.*;
|
||||
import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor;
|
||||
import eu.midnightdust.midnightcontrols.client.util.MouseAccessor;
|
||||
import dev.lambdaurora.spruceui.navigation.NavigationDirection;
|
||||
@@ -45,10 +44,7 @@ import net.minecraft.client.gui.screen.ingame.MerchantScreen;
|
||||
import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen;
|
||||
import net.minecraft.client.gui.screen.multiplayer.MultiplayerServerListWidget;
|
||||
import net.minecraft.client.gui.screen.world.WorldListWidget;
|
||||
import net.minecraft.client.gui.widget.AlwaysSelectedEntryListWidget;
|
||||
import net.minecraft.client.gui.widget.EntryListWidget;
|
||||
import net.minecraft.client.gui.widget.PressableWidget;
|
||||
import net.minecraft.client.gui.widget.SliderWidget;
|
||||
import net.minecraft.client.gui.widget.*;
|
||||
import net.minecraft.screen.slot.Slot;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import org.aperlambda.lambdacommon.utils.Pair;
|
||||
@@ -82,6 +78,7 @@ public class MidnightInput {
|
||||
private float mouseSpeedX = 0.f;
|
||||
private float mouseSpeedY = 0.f;
|
||||
public int inventoryInteractionCooldown = 0;
|
||||
public int screenCloseCooldown = 0;
|
||||
|
||||
private ControllerControlsWidget controlsInput = null;
|
||||
|
||||
@@ -122,6 +119,8 @@ public class MidnightInput {
|
||||
// Decreases the cooldown for GUI actions.
|
||||
if (this.actionGuiCooldown > 0)
|
||||
--this.actionGuiCooldown;
|
||||
if (this.screenCloseCooldown > 0)
|
||||
--this.screenCloseCooldown;
|
||||
|
||||
InputManager.updateStates();
|
||||
|
||||
@@ -176,7 +175,7 @@ public class MidnightInput {
|
||||
*
|
||||
* @param client the client instance
|
||||
*/
|
||||
public void onRender(float tickDelta, @NotNull MinecraftClient client) {
|
||||
public void onRender(@NotNull MinecraftClient client) {
|
||||
if (!(client.currentScreen == null || client.currentScreen instanceof TouchscreenOverlay))
|
||||
return;
|
||||
|
||||
@@ -185,8 +184,8 @@ public class MidnightInput {
|
||||
return;
|
||||
|
||||
if (this.targetYaw != 0.f || this.targetPitch != 0.f) {
|
||||
float rotationYaw = (float) (player.prevYaw + (this.targetYaw / 0.10) * tickDelta);
|
||||
float rotationPitch = (float) (player.prevPitch + (this.targetPitch / 0.10) * tickDelta);
|
||||
float rotationYaw = (float) (player.prevYaw + (this.targetYaw / 0.10) * client.getTickDelta());
|
||||
float rotationPitch = (float) (player.prevPitch + (this.targetPitch / 0.10) * client.getTickDelta());
|
||||
client.player.setYaw(rotationYaw);
|
||||
client.player.setPitch(MathHelper.clamp(rotationPitch, -90.f, 90.f));
|
||||
if (client.player.isRiding() && client.player.getVehicle() != null) {
|
||||
@@ -302,6 +301,7 @@ public class MidnightInput {
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (FabricLoader.getInstance().isModLoaded("libgui")) LibGuiCompat.handlePress(client.currentScreen);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -330,7 +330,7 @@ public class MidnightInput {
|
||||
Screen.wrapScreenError(() -> client.currentScreen.mouseReleased(mouseX, mouseY, GLFW.GLFW_MOUSE_BUTTON_1),
|
||||
"mouseReleased event handler", client.currentScreen.getClass().getCanonicalName());
|
||||
}
|
||||
//this.actionGuiCooldown = 5;
|
||||
this.screenCloseCooldown = 5;
|
||||
} else {
|
||||
this.ignoreNextARelease = false;
|
||||
}
|
||||
@@ -472,6 +472,14 @@ public class MidnightInput {
|
||||
} else if (client.currentScreen != null) {
|
||||
if (axis == GLFW_GAMEPAD_AXIS_RIGHT_Y && absValue >= deadZone) {
|
||||
float finalValue = value;
|
||||
client.currentScreen.children().stream().filter(element -> element instanceof SpruceEntryListWidget)
|
||||
.map(element -> (SpruceEntryListWidget<?>) element)
|
||||
.filter(AbstractSpruceWidget::isFocusedOrHovered)
|
||||
.anyMatch(element -> {
|
||||
MidnightControls.get().log(String.valueOf(finalValue));
|
||||
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())
|
||||
@@ -479,14 +487,6 @@ public class MidnightInput {
|
||||
element.mouseScrolled(0.0, 0.0, -finalValue);
|
||||
return true;
|
||||
});
|
||||
client.currentScreen.children().stream().filter(element -> element instanceof SpruceEntryListWidget)
|
||||
.map(element -> (SpruceEntryListWidget<?>) element)
|
||||
.filter(element -> element.getType().isFocused())
|
||||
.anyMatch(element -> {
|
||||
MidnightControls.get().log(String.valueOf(finalValue));
|
||||
element.mouseScrolled(0.0, 0.0, -finalValue);
|
||||
return true;
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -621,7 +621,7 @@ public class MidnightInput {
|
||||
this.actionGuiCooldown = 2; // Prevent to press too quickly the focused element, so we have to skip 5 ticks.
|
||||
return false;
|
||||
} 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;
|
||||
} else if (element instanceof ParentElement entryList) {
|
||||
var focused = entryList.getFocused();
|
||||
@@ -672,6 +672,69 @@ public class MidnightInput {
|
||||
}
|
||||
if (FabricLoader.getInstance().isModLoaded("sodium"))
|
||||
SodiumCompat.handleInput(screen, direction.isLookingForward());
|
||||
// This still needs some work
|
||||
// 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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -328,7 +328,7 @@ public class InputHandlers {
|
||||
* @return true if the client is in game, else false
|
||||
*/
|
||||
public static boolean inGame(@NotNull MinecraftClient client, @NotNull ButtonBinding binding) {
|
||||
return client.currentScreen == null;
|
||||
return client.currentScreen == null && MidnightControlsClient.get().input.screenCloseCooldown <= 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -13,7 +13,17 @@ import eu.midnightdust.midnightcontrols.client.ButtonState;
|
||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.input.Input;
|
||||
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;
|
||||
|
||||
/**
|
||||
@@ -79,18 +89,20 @@ public final class MovementHandler implements PressAction {
|
||||
this.pressingBack = direction < 0;
|
||||
this.movementForward = direction * value;
|
||||
|
||||
// Slowing down if sneaking.
|
||||
if (client.player.input.sneaking)
|
||||
this.movementForward *= 0.3D;
|
||||
// Slowing down if sneaking or crawling.
|
||||
if (client.player.shouldSlowDown()) {
|
||||
this.movementForward *= MathHelper.clamp(0.3F + EnchantmentHelper.getSwiftSneakSpeedBoost(client.player), 0.0F, 1.0F);
|
||||
}
|
||||
} else {
|
||||
// Handle sideways movement.
|
||||
this.pressingLeft = direction > 0;
|
||||
this.pressingRight = direction < 0;
|
||||
this.movementSideways = direction * value;
|
||||
|
||||
// Slowing down if sneaking.
|
||||
if (client.player.input.sneaking)
|
||||
this.movementSideways *= 0.3D;
|
||||
// Slowing down if sneaking or crawling.
|
||||
if (client.player.shouldSlowDown()) {
|
||||
this.movementSideways *= MathHelper.clamp(0.3F + EnchantmentHelper.getSwiftSneakSpeedBoost(client.player), 0.0F, 1.0F);
|
||||
}
|
||||
}
|
||||
|
||||
return this.shouldOverrideMovement;
|
||||
|
||||
@@ -17,4 +17,6 @@ import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
public interface ClickableWidgetAccessor {
|
||||
@Accessor("height")
|
||||
int getHeight();
|
||||
@Accessor("focused")
|
||||
void setFocused(boolean value);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 2.7 KiB |
@@ -68,6 +68,8 @@
|
||||
"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",
|
||||
|
||||
@@ -80,6 +80,8 @@
|
||||
"midnightcontrols.axis.right_x-": "Right X-",
|
||||
"midnightcontrols.axis.right_y-": "Right Y-",
|
||||
"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.disconnected": "Controller %d disconnected.",
|
||||
"midnightcontrols.controller.mappings.1": "To configure the controller mappings, please use %s",
|
||||
|
||||
@@ -3,11 +3,12 @@
|
||||
"key.midnightcontrols.look_down": "Смотреть Вниз",
|
||||
"key.midnightcontrols.look_left": "Смотреть Налево",
|
||||
"key.midnightcontrols.look_right": "Смотреть Направо",
|
||||
"key.midnightcontrols.look_up": "Смотерть Вверх",
|
||||
"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": "Вперед",
|
||||
@@ -18,7 +19,7 @@
|
||||
"midnightcontrols.action.jump": "Прыжок",
|
||||
"midnightcontrols.action.left": "Налево",
|
||||
"midnightcontrols.action.pause_game": "Приостановить игру",
|
||||
"midnightcontrols.action.pick_block": "Выбор Блок",
|
||||
"midnightcontrols.action.pick_block": "Выбор Блока",
|
||||
"midnightcontrols.action.pickup": "Взять Половину",
|
||||
"midnightcontrols.action.pickup_all": "Взять Всё",
|
||||
"midnightcontrols.action.place": "Поставить",
|
||||
@@ -26,13 +27,19 @@
|
||||
"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_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": "Использовать",
|
||||
@@ -40,8 +47,9 @@
|
||||
"midnightcontrols.action.zoom_in": "Увеличить Масштаб",
|
||||
"midnightcontrols.action.zoom_out": "Уменьшить Масштаб",
|
||||
"midnightcontrols.action.zoom_reset": "Сбросить Масштаб",
|
||||
"midnightcontrols.action.key.emotecraft.fastchoose": "Быстрый Выбор Эмоции",
|
||||
"midnightcontrols.action.key.emotecraft.stop": "Прекратить Эмоцию",
|
||||
"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",
|
||||
@@ -79,15 +87,18 @@
|
||||
"midnightcontrols.controller.mappings.error": "Ошибка при загрузке раскладки.",
|
||||
"midnightcontrols.controller.mappings.error.write": "Ошибка при записи раскладки в файл.",
|
||||
"midnightcontrols.controller.mappings.updated": "Раскладка обновлена!",
|
||||
"midnightcontrols.controller_type.default": "По обычному",
|
||||
"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.steam": "Steam",
|
||||
"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.controls_mode.touchscreen": "Сенсорный Экран (Разраб.)",
|
||||
"midnightcontrols.hud_side.left": "Больше Налево",
|
||||
"midnightcontrols.hud_side.right": "Больше Направо",
|
||||
"midnightcontrols.menu.analog_movement": "Аналоговое Движение",
|
||||
|
||||
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 416 B |
|
Before Width: | Height: | Size: 334 B After Width: | Height: | Size: 327 B |
|
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 3.1 KiB |
@@ -12,6 +12,9 @@
|
||||
"akemin-dayo",
|
||||
"DioEgizio",
|
||||
"Ivanoks",
|
||||
"KiskaUWU",
|
||||
"RaptaG",
|
||||
"Madis0",
|
||||
"FlashyReese",
|
||||
"Hambaka",
|
||||
"joaoh1",
|
||||
@@ -53,7 +56,7 @@
|
||||
"modmenu": ">=1.12.2"
|
||||
},
|
||||
"suggests": {
|
||||
"quilt_loader": "*"
|
||||
"kontrolo": "*"
|
||||
},
|
||||
"breaks": {
|
||||
"lambdacontrols": "*",
|
||||
|
||||
@@ -17,7 +17,8 @@
|
||||
"MouseMixin",
|
||||
"RecipeBookWidgetAccessor",
|
||||
"WorldRendererMixin",
|
||||
"KeyBindingRegistryImplAccessor"
|
||||
"KeyBindingRegistryImplAccessor",
|
||||
"ScreenAccessor"
|
||||
],
|
||||
"injectors": {
|
||||
"defaultRequire": 1
|
||||
|
||||
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 1.8 KiB |
4
src/main/resources/resourcepacks/legacy/CREDITS
Normal 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.
|
||||
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 7.8 KiB |
6
src/main/resources/resourcepacks/legacy/pack.mcmeta
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"pack": {
|
||||
"pack_format": 9,
|
||||
"description": "Makes the controller buttons look like from Console Edition"
|
||||
}
|
||||
}
|
||||
BIN
src/main/resources/resourcepacks/legacy/pack.png
Normal file
|
After Width: | Height: | Size: 14 KiB |