mirror of
https://github.com/TeamMidnightDust/MidnightControls.git
synced 2025-12-16 16:45:09 +01:00
Compare commits
20 Commits
v1.10.0+1.
...
50103ce4cf
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
50103ce4cf | ||
|
|
9e12381471 | ||
|
|
f004f0a32d | ||
|
|
c07f3d94dd | ||
|
|
6007ef315d | ||
|
|
1c26eeed5e | ||
|
|
e35850c5d5 | ||
|
|
78900ac83e | ||
|
|
7d791fac89 | ||
|
|
bf60595c12 | ||
|
|
b96547dafb | ||
|
|
ab869f4f76 | ||
|
|
84df412162 | ||
|
|
afb80fd89c | ||
|
|
b835a6c4ca | ||
|
|
3eec0dda4a | ||
|
|
35ab81f696 | ||
|
|
e08547a641 | ||
|
|
c93cc729f4 | ||
|
|
1595fffc2c |
25
.github/workflows/build.yml
vendored
Normal file
25
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
name: Build with Gradle
|
||||
|
||||
on: [ push, pull_request ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
- name: Validate Gradle Wrapper
|
||||
uses: gradle/actions/wrapper-validation@v3
|
||||
- name: Set up JDK 21
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: 21
|
||||
check-latest: true
|
||||
- name: Build with Gradle
|
||||
run: ./gradlew build
|
||||
- name: Upload artifacts to GitHub
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: MidnightControls-Artifacts
|
||||
path: /build/libs/
|
||||
23
.github/workflows/gradlebuild.yml
vendored
23
.github/workflows/gradlebuild.yml
vendored
@@ -1,23 +0,0 @@
|
||||
name: Gradle Build
|
||||
|
||||
on: [ push, pull_request ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Set up JDK 16
|
||||
uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: 16
|
||||
server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
|
||||
settings-path: ${{ github.workspace }} # location for the settings.xml file
|
||||
|
||||
- name: Build with Gradle
|
||||
run: ./gradlew build
|
||||
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: Artifacts
|
||||
path: ./build/libs/
|
||||
23
.github/workflows/modrinth_update.yml
vendored
23
.github/workflows/modrinth_update.yml
vendored
@@ -1,23 +0,0 @@
|
||||
name: Gradle Build
|
||||
|
||||
on:
|
||||
release:
|
||||
types:
|
||||
- published
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Set up JDK 16
|
||||
uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: 16
|
||||
server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
|
||||
settings-path: ${{ github.workspace }} # location for the settings.xml file
|
||||
|
||||
- name: Build with Gradle
|
||||
env:
|
||||
MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }}
|
||||
run: ./gradlew publishModrinth
|
||||
40
.github/workflows/gradlepublish.yml → .github/workflows/publish.yml
vendored
Executable file → Normal file
40
.github/workflows/gradlepublish.yml → .github/workflows/publish.yml
vendored
Executable file → Normal file
@@ -1,30 +1,24 @@
|
||||
name: Gradle Package
|
||||
name: Publish to Modrinth
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- '*'
|
||||
release:
|
||||
types:
|
||||
- published
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
publish:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Set up JDK 16
|
||||
uses: actions/setup-java@v1
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
- name: Validate Gradle Wrapper
|
||||
uses: gradle/actions/wrapper-validation@v3
|
||||
- name: Set up JDK 21
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: 16
|
||||
server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
|
||||
settings-path: ${{ github.workspace }} # location for the settings.xml file
|
||||
|
||||
- name: Build with Gradle
|
||||
run: ./gradlew build
|
||||
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: Artifacts
|
||||
path: ./build/libs/
|
||||
|
||||
distribution: 'temurin'
|
||||
java-version: 21
|
||||
check-latest: true
|
||||
# The USERNAME and PASSWORD need to correspond to the credentials environment variables used in
|
||||
# the publishing section of your build.gradle
|
||||
- name: Publish to GitHub Packages and other Mavens
|
||||
@@ -38,3 +32,7 @@ jobs:
|
||||
midnightcontrols_MAVEN: ${{ secrets.MAVEN_URL }}
|
||||
MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }}
|
||||
MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }}
|
||||
- name: Publish to Modrinth
|
||||
env:
|
||||
MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }}
|
||||
run: ./gradlew publishModrinth
|
||||
@@ -8,7 +8,7 @@
|
||||
[](https://github.com/TeamMidnightDust/MidnightControls/releases)
|
||||

|
||||
[![Mod loader: Quilt/Fabric]][Quilt]
|
||||
[](https://www.oracle.com/java/technologies/downloads/#java17)
|
||||
[](https://www.oracle.com/java/technologies/downloads/#java21)
|
||||
[](LICENSE)
|
||||
|
||||
A Fabric Minecraft mod which adds better controls, reach-around and controller support.
|
||||
|
||||
@@ -13,6 +13,9 @@ repositories {
|
||||
maven {
|
||||
url = "https://api.modrinth.com/maven"
|
||||
}
|
||||
flatDir {
|
||||
dirs("localMaven")
|
||||
}
|
||||
}
|
||||
|
||||
subprojects {
|
||||
@@ -22,6 +25,9 @@ subprojects {
|
||||
url = "https://api.modrinth.com/maven"
|
||||
}
|
||||
maven { url 'https://jitpack.io' }
|
||||
flatDir {
|
||||
dirs("../localMaven")
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
||||
@@ -39,7 +39,7 @@ dependencies {
|
||||
modCompileOnlyApi "org.quiltmc:quilt-json5:1.0.0"
|
||||
modImplementation "maven.modrinth:sodium:${project.sodium_version}-fabric"
|
||||
modCompileOnlyApi "maven.modrinth:emi:${project.emi_version}"
|
||||
modCompileOnlyApi "maven.modrinth:emotecraft:${project.emotecraft_version}"
|
||||
modImplementation "maven.modrinth:emotecraft:${project.emotecraft_version}"
|
||||
modCompileOnlyApi "io.github.kosmx:bendy-lib:${project.bendylib_version}"
|
||||
modCompileOnlyApi "dev.isxander:yet-another-config-lib:${project.yacl_version}"
|
||||
modCompileOnlyApi "maven.modrinth:inventory-tabs-updated:${project.inventorytabs_version}"
|
||||
|
||||
@@ -86,12 +86,16 @@ public class MidnightControlsClient extends MidnightControls {
|
||||
int period = 1; // repeat every 0.001 sec. (1000 times a second)
|
||||
Timer timer = new Timer();
|
||||
timer.scheduleAtFixedRate(new TimerTask() {
|
||||
public void run() { // TODO: Add a try/catch here after the alpha testing period
|
||||
if (lateInitDone && client.isRunning()) {
|
||||
if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && (client.isWindowFocused() || MidnightControlsConfig.unfocusedInput)) {
|
||||
input.tickCameraStick();
|
||||
input.updateCamera();
|
||||
public void run() {
|
||||
try {
|
||||
if (lateInitDone && client.isRunning()) {
|
||||
if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && (client.isWindowFocused() || MidnightControlsConfig.unfocusedInput)) {
|
||||
input.tickCameraStick();
|
||||
input.updateCamera();
|
||||
}
|
||||
}
|
||||
} catch (Exception | Error e) {
|
||||
MidnightControls.logger.error("Exception encountered in camera loop: ",e);
|
||||
}
|
||||
}
|
||||
}, delay, period);
|
||||
@@ -200,6 +204,7 @@ public class MidnightControlsClient extends MidnightControls {
|
||||
RainbowColor.tick();
|
||||
TouchInput.tick();
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when opening a screen.
|
||||
*/
|
||||
|
||||
@@ -1,36 +1,51 @@
|
||||
package eu.midnightdust.midnightcontrols.client.compat;
|
||||
|
||||
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
||||
import io.github.kosmx.emotes.arch.gui.EmoteMenuImpl;
|
||||
import io.github.kosmx.emotes.arch.gui.screen.ingame.FastChosseScreen;
|
||||
import eu.midnightdust.midnightcontrols.client.mixin.MouseAccessor;
|
||||
import io.github.kosmx.emotes.arch.screen.ingame.FastMenuScreen;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
import org.joml.Vector2i;
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
|
||||
public class EmotecraftCompat {
|
||||
private static final MinecraftClient client = MinecraftClient.getInstance();
|
||||
|
||||
public static void openEmotecraftScreen(Screen parent) {
|
||||
client.setScreen(new EmoteMenuImpl(parent));
|
||||
client.setScreen(new FastMenuScreen(parent));
|
||||
}
|
||||
public static boolean isEmotecraftScreen(Screen screen) {
|
||||
return screen instanceof FastChosseScreen;
|
||||
return screen instanceof FastMenuScreen;
|
||||
}
|
||||
|
||||
static int prevIndex = -1;
|
||||
public static void handleEmoteSelector(int index) {
|
||||
if (client.currentScreen instanceof FastChosseScreen) {
|
||||
int x = client.getWindow().getWidth() / 2;
|
||||
int y = client.getWindow().getHeight() / 2;
|
||||
switch (index) {
|
||||
case 0, 3, 5 -> x -= 200;
|
||||
case 2, 4, 7 -> x += 200;
|
||||
}
|
||||
switch (index) {
|
||||
case 0, 1, 2 -> y -= 200;
|
||||
case 5, 6, 7 -> y += 200;
|
||||
}
|
||||
InputManager.queueMousePosition(x, y);
|
||||
try {
|
||||
if (client.currentScreen instanceof FastMenuScreen) {
|
||||
boolean stickReleased = index == -1 && prevIndex != -1;
|
||||
var pos = calcMousePos(stickReleased ? prevIndex : index);
|
||||
InputManager.queueMousePosition(pos.x, pos.y);
|
||||
InputManager.INPUT_MANAGER.updateMousePosition(client);
|
||||
|
||||
InputManager.INPUT_MANAGER.updateMousePosition(client);
|
||||
if (stickReleased) {
|
||||
((MouseAccessor) client.mouse).midnightcontrols$onMouseButton(client.getWindow().getHandle(), GLFW.GLFW_MOUSE_BUTTON_LEFT, GLFW.GLFW_PRESS, 0);
|
||||
prevIndex = -1;
|
||||
}
|
||||
else prevIndex = index;
|
||||
} else prevIndex = -1;
|
||||
} catch (Exception ignored) {}
|
||||
}
|
||||
public static Vector2i calcMousePos(int index) {
|
||||
int x = client.getWindow().getWidth() / 2;
|
||||
int y = client.getWindow().getHeight() / 2;
|
||||
switch (index) {
|
||||
case 0, 3, 5 -> x -= 275;
|
||||
case 2, 4, 7 -> x += 275;
|
||||
}
|
||||
switch (index) {
|
||||
case 0, 1, 2 -> y -= 275;
|
||||
case 5, 6, 7 -> y += 275;
|
||||
}
|
||||
return new Vector2i(x, y);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ import eu.midnightdust.midnightcontrols.client.util.MathUtil;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.network.ClientPlayerEntity;
|
||||
import net.minecraft.entity.attribute.EntityAttributes;
|
||||
import net.minecraft.util.PlayerInput;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -48,11 +49,8 @@ public final class MovementHandler implements PressAction {
|
||||
public void applyMovement(@NotNull ClientPlayerEntity player) {
|
||||
if (!this.shouldOverrideMovement)
|
||||
return;
|
||||
// TODO
|
||||
// player.input.playerInput.pressingForward = this.pressingForward;
|
||||
// player.input.pressingBack = this.pressingBack;
|
||||
// player.input.pressingLeft = this.pressingLeft;
|
||||
// player.input.pressingRight = this.pressingRight;
|
||||
player.input.playerInput = new PlayerInput(this.pressingForward, this.pressingBack, this.pressingLeft, this.pressingRight,
|
||||
player.input.playerInput.jump(), player.input.playerInput.sneak(), player.input.playerInput.sprint());
|
||||
|
||||
polarUtil.calculate(this.movementSideways, this.movementForward, this.slowdownFactor);
|
||||
player.input.movementForward = polarUtil.polarY;
|
||||
|
||||
@@ -14,6 +14,7 @@ import eu.midnightdust.midnightcontrols.MidnightControlsConstants;
|
||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
||||
import eu.midnightdust.midnightcontrols.client.util.platform.NetworkUtil;
|
||||
import org.thinkingstudio.obsidianui.background.Background;
|
||||
import org.thinkingstudio.obsidianui.mixin.DrawContextAccessor;
|
||||
import org.thinkingstudio.obsidianui.widget.SpruceWidget;
|
||||
import eu.midnightdust.lib.util.MidnightColorUtil;
|
||||
import eu.midnightdust.midnightcontrols.MidnightControls;
|
||||
@@ -501,27 +502,24 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
||||
}
|
||||
@Override
|
||||
public void render(DrawContext context, SpruceWidget widget, int vOffset, int mouseX, int mouseY, float delta) {
|
||||
fill(context.getMatrices(), widget.getX(), widget.getY(), widget.getX() + widget.getWidth(), widget.getY() + widget.getHeight(), MidnightColorUtil.hex2Rgb("#000000"));
|
||||
fill(context, widget.getX(), widget.getY(), widget.getX() + widget.getWidth(), widget.getY() + widget.getHeight(), Color.black);
|
||||
}
|
||||
private static void fill(MatrixStack matrixStack, int x2, int y2, int x1, int y1, Color color) {
|
||||
matrixStack.push();
|
||||
private static void fill(DrawContext context, int x2, int y2, int x1, int y1, Color color) {
|
||||
RenderLayer renderLayer = RenderLayer.getGui();
|
||||
VertexConsumer vertexConsumer = ((DrawContextAccessor)context).getVertexConsumers().getBuffer(renderLayer);
|
||||
|
||||
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().begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR);
|
||||
RenderSystem.enableBlend();
|
||||
RenderSystem.defaultBlendFunc();
|
||||
//RenderSystem.setShader(GameRenderer::getPositionColorProgram);
|
||||
bufferBuilder.vertex(matrix, (float)x1, (float)y2, 0.0F).color(r, g, b, t);
|
||||
bufferBuilder.vertex(matrix, (float)x2, (float)y2, 0.0F).color(r, g, b, t);
|
||||
bufferBuilder.vertex(matrix, (float)x2, (float)y1, 0.0F).color(r, g, b, t);
|
||||
bufferBuilder.vertex(matrix, (float)x1, (float)y1, 0.0F).color(r, g, b, t);
|
||||
BufferRenderer.drawWithGlobalProgram(bufferBuilder.end());
|
||||
vertexConsumer.vertex((float)x1, (float)y2, 0.0F).color(r, g, b, t);
|
||||
vertexConsumer.vertex((float)x2, (float)y2, 0.0F).color(r, g, b, t);
|
||||
vertexConsumer.vertex((float)x2, (float)y1, 0.0F).color(r, g, b, t);
|
||||
vertexConsumer.vertex((float)x1, (float)y1, 0.0F).color(r, g, b, t);
|
||||
RenderSystem.disableBlend();
|
||||
matrixStack.pop();
|
||||
context.draw();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,108 @@
|
||||
package eu.midnightdust.midnightcontrols.client.gui;
|
||||
|
||||
import net.minecraft.client.gui.DrawContext;
|
||||
import net.minecraft.client.gui.widget.TextFieldWidget;
|
||||
import net.minecraft.text.Text;
|
||||
import org.thinkingstudio.obsidianui.Position;
|
||||
import org.thinkingstudio.obsidianui.SpruceTexts;
|
||||
import org.thinkingstudio.obsidianui.screen.SpruceScreen;
|
||||
import org.thinkingstudio.obsidianui.widget.SpruceButtonWidget;
|
||||
import org.thinkingstudio.obsidianui.widget.container.SpruceContainerWidget;
|
||||
|
||||
public class VirtualKeyboardScreen extends SpruceScreen {
|
||||
private SpruceContainerWidget container;
|
||||
private TextFieldWidget bufferDisplay;
|
||||
private final StringBuilder buffer;
|
||||
private final CloseCallback closeCallback;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface CloseCallback {
|
||||
void onClose(String text);
|
||||
}
|
||||
|
||||
public VirtualKeyboardScreen(String initialText, CloseCallback closeCallback) {
|
||||
super(Text.literal("Virtual Keyboard"));
|
||||
|
||||
this.buffer = new StringBuilder(initialText);
|
||||
this.closeCallback = closeCallback;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
super.init();
|
||||
|
||||
this.bufferDisplay = new TextFieldWidget(this.textRenderer, this.width / 2 - 100, this.height / 4 - 40, 200, 20, Text.literal(""));
|
||||
this.bufferDisplay.setEditable(false);
|
||||
this.bufferDisplay.setMaxLength(1024);
|
||||
this.bufferDisplay.setText(buffer.toString());
|
||||
this.addDrawableChild(this.bufferDisplay);
|
||||
|
||||
rebuildKeyboard();
|
||||
|
||||
this.addDrawableChild(container);
|
||||
this.addDrawableChild(new SpruceButtonWidget(Position.of(this, this.width / 2 - 50, this.height - 30), 100, 20, SpruceTexts.GUI_DONE, btn -> this.close()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(DrawContext drawContext, int mouseX, int mouseY, float delta) {
|
||||
super.render(drawContext, mouseX, mouseY, delta);
|
||||
drawContext.drawCenteredTextWithShadow(this.textRenderer, this.title, this.width / 2, 10, 0xFFFFFF);
|
||||
}
|
||||
|
||||
|
||||
private void rebuildKeyboard() {
|
||||
this.container = new SpruceContainerWidget(Position.of(0, this.height / 4 - 10), this.width, this.height / 2);
|
||||
|
||||
|
||||
var row1 = new String[]{"q", "w", "e", "r", "t", "y", "u", "i", "o", "p"};
|
||||
var row2 = new String[]{"a", "s", "d", "f", "g", "h", "j", "k", "l"};
|
||||
var row3 = new String[]{"z", "x", "c", "v", "b", "n", "m"};
|
||||
|
||||
addKeyRow(0, row1);
|
||||
addKeyRow(1, row2);
|
||||
addKeyRow(2, row3);
|
||||
}
|
||||
|
||||
private void addKeyRow(int rowOffset, String... keys) {
|
||||
int keyWidth = 20;
|
||||
int spacing = 2;
|
||||
int totalWidth = (keyWidth + spacing) * keys.length - spacing;
|
||||
int startX = (this.width - totalWidth) / 2;
|
||||
int y = this.height / 4 + rowOffset * 24;
|
||||
|
||||
for (int i = 0; i < keys.length; i++) {
|
||||
String key = keys[i];
|
||||
this.container.addChild(new SpruceButtonWidget(Position.of(startX + i * (keyWidth + spacing), y), keyWidth, 20, Text.literal(key), btn -> handleKeyPress(key)));
|
||||
}
|
||||
}
|
||||
|
||||
private void handleKeyPress(String key) {
|
||||
if (this.client == null) return;
|
||||
|
||||
// TODO
|
||||
if (key.equals("\b")) {
|
||||
if (!buffer.isEmpty()) {
|
||||
buffer.deleteCharAt(buffer.length() - 1);
|
||||
}
|
||||
} else {
|
||||
buffer.append(key);
|
||||
}
|
||||
|
||||
if (this.bufferDisplay != null) {
|
||||
this.bufferDisplay.setText(buffer.toString());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldPause() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
super.close();
|
||||
if (closeCallback != null) {
|
||||
closeCallback.onClose(buffer.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package eu.midnightdust.midnightcontrols.client.mixin;
|
||||
|
||||
import net.minecraft.block.entity.SignText;
|
||||
import net.minecraft.client.gui.screen.ingame.AbstractSignEditScreen;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
|
||||
@Mixin(AbstractSignEditScreen.class)
|
||||
public interface AbstractSignEditScreenAccessor {
|
||||
@Accessor("text")
|
||||
SignText midnightcontrols$getText();
|
||||
|
||||
@Accessor("text")
|
||||
void midnightcontrols$setText(SignText text);
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package eu.midnightdust.midnightcontrols.client.mixin;
|
||||
|
||||
import net.minecraft.client.gui.screen.ingame.BookEditScreen;
|
||||
import net.minecraft.client.util.SelectionManager;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
import org.spongepowered.asm.mixin.gen.Invoker;
|
||||
|
||||
@Mixin(BookEditScreen.class)
|
||||
public interface BookEditScreenAccessor {
|
||||
@Accessor("signing")
|
||||
boolean midnightcontrols$isSigning();
|
||||
|
||||
@Accessor("title")
|
||||
String midnightcontrols$getTitle();
|
||||
|
||||
@Accessor("title")
|
||||
void midnightcontrols$setTitle(String title);
|
||||
|
||||
@Accessor("currentPageSelectionManager")
|
||||
SelectionManager midnightcontrols$getCurrentPageSelectionManager();
|
||||
|
||||
@Invoker("getCurrentPageContent")
|
||||
String midnightcontrols$getCurrentPageContent();
|
||||
|
||||
@Invoker("setPageContent")
|
||||
void midnightcontrols$setPageContent(String newContent);
|
||||
}
|
||||
@@ -77,7 +77,7 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity
|
||||
}
|
||||
}
|
||||
|
||||
@Inject(method = "tickMovement", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/input/Input;tick(ZF)V", shift = At.Shift.AFTER))
|
||||
@Inject(method = "tickMovement", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/input/Input;tick()V", shift = At.Shift.AFTER))
|
||||
public void onInputUpdate(CallbackInfo ci) {
|
||||
MovementHandler.HANDLER.applyMovement((ClientPlayerEntity) (Object) this);
|
||||
}
|
||||
|
||||
@@ -58,4 +58,10 @@ public interface CreativeInventoryScreenAccessor {
|
||||
*/
|
||||
@Invoker("hasScrollbar")
|
||||
boolean midnightcontrols$hasScrollbar();
|
||||
|
||||
/**
|
||||
* Triggers searching the creative inventory from the current value of the internal {@link net.minecraft.client.gui.widget.TextFieldWidget}
|
||||
*/
|
||||
@Invoker("search")
|
||||
void midnightcontrols$search();
|
||||
}
|
||||
|
||||
@@ -33,17 +33,24 @@ import static eu.midnightdust.midnightcontrols.MidnightControls.id;
|
||||
@Mixin(GameOptionsScreen.class)
|
||||
public abstract class GameOptionsScreenMixin extends Screen {
|
||||
@Shadow @Nullable protected OptionListWidget body;
|
||||
@Unique TextIconButtonWidget midnightcontrols$button = TextIconButtonWidget.builder(Text.translatable("midnightcontrols.menu.title.controller"), (button -> this.client.setScreen(new MidnightControlsSettingsScreen(this, false))), true)
|
||||
@Unique TextIconButtonWidget midnightcontrols$button = TextIconButtonWidget.builder(Text.translatable("midnightcontrols.menu.title.controller"),
|
||||
(button -> this.client.setScreen(new MidnightControlsSettingsScreen(this, false))), true)
|
||||
.dimension(20,20).texture(id("icon/controller"), 20, 20).build();
|
||||
|
||||
protected GameOptionsScreenMixin(Text title) {
|
||||
super(title);
|
||||
}
|
||||
|
||||
@Inject(method = "init", at = @At("TAIL"))
|
||||
@Inject(method = "initBody", at = @At("TAIL"))
|
||||
public void midnightcontrols$addMCButton(CallbackInfo ci) {
|
||||
if (this.getClass().toString().equals(ControlsOptionsScreen.class.toString())) {
|
||||
this.midnightcontrols$setButtonPos();
|
||||
this.addSelectableChild(midnightcontrols$button);
|
||||
}
|
||||
}
|
||||
@Inject(method = "init", at = @At("TAIL"))
|
||||
public void midnightcontrols$drawMCButton(CallbackInfo ci) {
|
||||
if (this.getClass().toString().equals(ControlsOptionsScreen.class.toString())) {
|
||||
this.addDrawableChild(midnightcontrols$button);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,7 +68,7 @@ public abstract class WorldRendererMixin {
|
||||
|
||||
@Inject(
|
||||
method = "renderTargetBlockOutline",
|
||||
at = @At("TAIL")
|
||||
at = @At("HEAD")
|
||||
)
|
||||
private void onOutlineRender(Camera camera, VertexConsumerProvider.Immediate vertexConsumers, MatrixStack matrices, boolean translucent, CallbackInfo ci) {
|
||||
if (((MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && MidnightControlsConfig.touchInControllerMode) || MidnightControlsConfig.controlsMode == ControlsMode.TOUCHSCREEN)
|
||||
|
||||
@@ -0,0 +1,238 @@
|
||||
{
|
||||
"midnightcontrols.midnightconfig.title": "Configurações avançadas do MidnightControls",
|
||||
"midnightcontrols.midnightconfig.enum.VirtualMouseSkin.DEFAULT_LIGHT": "Padrão claro",
|
||||
"midnightcontrols.midnightconfig.enum.VirtualMouseSkin.DEFAULT_DARK": "Padrão escuro",
|
||||
"midnightcontrols.midnightconfig.enum.VirtualMouseSkin.SECOND_LIGHT": "Segundo claro",
|
||||
"midnightcontrols.midnightconfig.enum.VirtualMouseSkin.SECOND_DARK": "Segundo escuro",
|
||||
"midnightcontrols.midnightconfig.enum.ControllerType.DEFAULT": "Padrão",
|
||||
"midnightcontrols.midnightconfig.enum.ControllerType.DUALSHOCK": "DualShock",
|
||||
"midnightcontrols.midnightconfig.enum.ControllerType.DUALSENSE": "DualSense",
|
||||
"midnightcontrols.midnightconfig.enum.ControllerType.SWITCH": "Controle de Switch/Wii",
|
||||
"midnightcontrols.midnightconfig.enum.ControllerType.XBOX": "Controle de Xbox One/Series",
|
||||
"midnightcontrols.midnightconfig.enum.ControllerType.XBOX_360": "Controle de Xbox 360",
|
||||
"midnightcontrols.midnightconfig.enum.ControllerType.STEAM_CONTROLLER": "Controle da Steam",
|
||||
"midnightcontrols.midnightconfig.enum.ControllerType.STEAM_DECK": "Steam Deck",
|
||||
"midnightcontrols.midnightconfig.enum.ControllerType.OUYA": "Controle de OUYA",
|
||||
"midnightcontrols.midnightconfig.enum.ControllerType.NUMBERED": "Controle númerado",
|
||||
"midnightcontrols.midnightconfig.enum.ControlsMode.DEFAULT": "Teclado/Mouse",
|
||||
"midnightcontrols.midnightconfig.enum.ControlsMode.CONTROLLER": "Controle",
|
||||
"midnightcontrols.midnightconfig.enum.ControlsMode.TOUCHSCREEN": "Tela sensível ao toque (Beta)",
|
||||
"midnightcontrols.midnightconfig.enum.HudSide.LEFT": "Esquerda",
|
||||
"midnightcontrols.midnightconfig.enum.HudSide.RIGHT": "Direita",
|
||||
"midnightcontrols.midnightconfig.enum.TouchMode.CROSSHAIR": "Na mira",
|
||||
"midnightcontrols.midnightconfig.enum.TouchMode.FINGER_POS": "Posição do dedo",
|
||||
"midnightcontrols.midnightconfig.enum.CameraMode.FLAT": "Plano",
|
||||
"midnightcontrols.midnightconfig.enum.CameraMode.ADAPTIVE": "Adaptativo",
|
||||
"key.categories.midnightcontrols": "MidnightControls",
|
||||
"key.midnightcontrols.look_down": "Olhar para baixo",
|
||||
"key.midnightcontrols.look_left": "Olhar para a esquerda",
|
||||
"key.midnightcontrols.look_right": "Olhar para a direita",
|
||||
"key.midnightcontrols.look_up": "Olhar para cima",
|
||||
"key.midnightcontrols.ring": "Abrir anel de teclas não vinculadas",
|
||||
"midnightcontrols.action.attack": "Atacar",
|
||||
"midnightcontrols.action.back": "Voltar",
|
||||
"midnightcontrols.action.chat": "Abrir bate-papo",
|
||||
"midnightcontrols.action.controls_ring": "Abrir anel de teclas não vinculadas",
|
||||
"midnightcontrols.action.debug_screen": "Abrir HUD de depuração (F3)",
|
||||
"midnightcontrols.action.drop_item": "Soltar item",
|
||||
"midnightcontrols.action.drink": "Beber",
|
||||
"midnightcontrols.action.eat": "Comer",
|
||||
"midnightcontrols.action.equip": "Equipar",
|
||||
"midnightcontrols.action.exit": "Sair da tela",
|
||||
"midnightcontrols.action.forward": "Para frente",
|
||||
"midnightcontrols.action.hit": "Atacar",
|
||||
"midnightcontrols.action.hotbar_left": "Move a barra rápida para esquerda",
|
||||
"midnightcontrols.action.hotbar_right": "Move a barra rápida para direita",
|
||||
"midnightcontrols.action.inventory": "Invetário",
|
||||
"midnightcontrols.action.jump": "Pular",
|
||||
"midnightcontrols.action.left": "Esquerda",
|
||||
"midnightcontrols.action.pause_game": "Pausar",
|
||||
"midnightcontrols.action.pick_block": "Pegar bloco",
|
||||
"midnightcontrols.action.pickup": "Pegar",
|
||||
"midnightcontrols.action.pickup_all": "Pegar todos",
|
||||
"midnightcontrols.action.place": "Colocar",
|
||||
"midnightcontrols.action.player_list": "Lista de jogadores",
|
||||
"midnightcontrols.action.quick_move": "Mover rápido",
|
||||
"midnightcontrols.action.right": "Direita",
|
||||
"midnightcontrols.action.screenshot": "Tirar Screenshot",
|
||||
"midnightcontrols.action.slot_up": "Mover Slot para cima",
|
||||
"midnightcontrols.action.slot_down": "Mover Slot para baixo",
|
||||
"midnightcontrols.action.slot_left": "Mover Slot para esquerda",
|
||||
"midnightcontrols.action.slot_right": "Mover Slot para direita",
|
||||
"midnightcontrols.action.sneak": "Esgueirar",
|
||||
"midnightcontrols.action.sprint": "Correr",
|
||||
"midnightcontrols.action.swap_hands": "Trocar de mãos",
|
||||
"midnightcontrols.action.toggle_perspective": "Alternar perspectiva",
|
||||
"midnightcontrols.action.toggle_smooth_camera": "Ativar câmera cinemática",
|
||||
"midnightcontrols.action.page_back": "Página anterior",
|
||||
"midnightcontrols.action.page_next": "Próxima página",
|
||||
"midnightcontrols.action.tab_back": "Aba anterior",
|
||||
"midnightcontrols.action.tab_next": "Próxima aba",
|
||||
"midnightcontrols.action.take": "Pegar item",
|
||||
"midnightcontrols.action.take_all": "Pegar pilha",
|
||||
"midnightcontrols.action.use": "Usar",
|
||||
"midnightcontrols.action.zoom": "Zoom",
|
||||
"midnightcontrols.action.zoom_in": "Aumentar o Zoom",
|
||||
"midnightcontrols.action.zoom_out": "Diminuir o Zoom",
|
||||
"midnightcontrols.action.zoom_reset": "Resetar o Zoom",
|
||||
"midnightcontrols.action.emi_page_left": "Página anterior",
|
||||
"midnightcontrols.action.emi_page_right": "Próxima pickup",
|
||||
"midnightcontrols.category.emi": "EMI",
|
||||
"midnightcontrols.button.a": "A",
|
||||
"midnightcontrols.button.b": "B",
|
||||
"midnightcontrols.button.x": "X",
|
||||
"midnightcontrols.button.y": "Y",
|
||||
"midnightcontrols.button.left_bumper": "Botão L1",
|
||||
"midnightcontrols.button.right_bumper": "Botão R1",
|
||||
"midnightcontrols.button.back": "Voltar",
|
||||
"midnightcontrols.button.start": "Começar",
|
||||
"midnightcontrols.button.guide": "Guia",
|
||||
"midnightcontrols.button.left_thumb": "Analógico esquerdo",
|
||||
"midnightcontrols.button.right_thumb": "Analógico direito",
|
||||
"midnightcontrols.button.dpad_up": "Botão direcional para cima",
|
||||
"midnightcontrols.button.dpad_right": "Botão direcional para direita",
|
||||
"midnightcontrols.button.dpad_down": "Botão direcional para baixo",
|
||||
"midnightcontrols.button.dpad_left": "Botão direcional para esquerda",
|
||||
"midnightcontrols.button.l4": "L4",
|
||||
"midnightcontrols.button.l5": "L5",
|
||||
"midnightcontrols.button.r4": "R4",
|
||||
"midnightcontrols.button.r5": "L5",
|
||||
"midnightcontrols.axis.left_x+": "Esquerda X+",
|
||||
"midnightcontrols.axis.left_y+": "Esquerda Y+",
|
||||
"midnightcontrols.axis.right_x+": "Direita X+",
|
||||
"midnightcontrols.axis.right_y+": "Direita Y+",
|
||||
"midnightcontrols.axis.left_trigger": "Gatilho da esquerda",
|
||||
"midnightcontrols.axis.right_trigger": "Gatilho da direita",
|
||||
"midnightcontrols.axis.left_x-": "Esquerda X-",
|
||||
"midnightcontrols.axis.left_y-": "Esquerda Y-",
|
||||
"midnightcontrols.axis.right_x-": "Direita X-",
|
||||
"midnightcontrols.axis.right_y-": "Direita Y-",
|
||||
"midnightcontrols.button.unknown": "Desconhecido (%d)",
|
||||
"midnightcontrols.controller.tutorial.title": "Jogue o jogo com um controle!",
|
||||
"midnightcontrols.controller.tutorial.description": "Vá para %s -> %s -> %s",
|
||||
"midnightcontrols.controller.connected": "Controle %d conectado.",
|
||||
"midnightcontrols.controller.disconnected": "Controle %d desconectado.",
|
||||
"midnightcontrols.controller.mappings.1": "Para configurar o mapeamento do controle, por favor use %s",
|
||||
"midnightcontrols.controller.mappings.3": "e cole o mapeamento no editor de arquivos do mapeamento.",
|
||||
"midnightcontrols.controller.mappings.error": "Erro ao carregar mapeamentos.",
|
||||
"midnightcontrols.controller.mappings.error.write": "Erro ao gravar mapeamentos no arquivo.",
|
||||
"midnightcontrols.controller.mappings.updated": "Atualizando mapeamentos!",
|
||||
"midnightcontrols.controller_type.default": "Padrão",
|
||||
"midnightcontrols.controller_type.dualshock": "DualShock",
|
||||
"midnightcontrols.controller_type.dualsense": "DualSense",
|
||||
"midnightcontrols.controller_type.switch": "Controle de Switch/Wii",
|
||||
"midnightcontrols.controller_type.xbox": "Controle de Xbox One/Series",
|
||||
"midnightcontrols.controller_type.xbox_360": "Controle de Xbox 360",
|
||||
"midnightcontrols.controller_type.steam_controller": "Controle da Steam",
|
||||
"midnightcontrols.controller_type.steam_deck": "Steam Deck",
|
||||
"midnightcontrols.controller_type.ouya": "Controle de OUYA",
|
||||
"midnightcontrols.controller_type.numbered": "Controle númerado",
|
||||
"midnightcontrols.controls_mode.default": "Teclado/Mouse",
|
||||
"midnightcontrols.controls_mode.controller": "Controle",
|
||||
"midnightcontrols.controls_mode.touchscreen": "Tela sensível ao toque (Beta)",
|
||||
"midnightcontrols.hud_side.LEFT": "Esquerda",
|
||||
"midnightcontrols.hud_side.RIGHT": "Direita",
|
||||
"midnightcontrols.menu.analog_movement": "Movemento analógico",
|
||||
"midnightcontrols.menu.analog_movement.tooltip": "Quando possível, ative o movemento analógico.",
|
||||
"midnightcontrols.menu.auto_switch_mode": "Modo de troca automática",
|
||||
"midnightcontrols.menu.auto_switch_mode.tooltip": "Se o modo de controle deve ser alterado automaticamente para o controle quando um for conectado.",
|
||||
"midnightcontrols.menu.camera_mode": "Modo de câmera",
|
||||
"midnightcontrols.menu.controller": "Controle",
|
||||
"midnightcontrols.menu.controller2": "Segundo controle",
|
||||
"midnightcontrols.menu.controller2.tooltip": "Segundo controle a ser usado, o que permite (por exemplo) o suporte a Joy-Cons.",
|
||||
"midnightcontrols.menu.controller_toggle_sneak": "Alternar Esgueirar no Controle",
|
||||
"midnightcontrols.menu.controller_toggle_sprint": "Alternar Correr no Controle",
|
||||
"midnightcontrols.menu.controller_type": "Tipo de controle",
|
||||
"midnightcontrols.menu.controller_type.tooltip": "O tipo de controle que você está usando (é preciso para mostrar os botões corretos)",
|
||||
"midnightcontrols.menu.controls_mode": "Modo",
|
||||
"midnightcontrols.menu.controls_mode.tooltip": "O modo de controle.",
|
||||
"midnightcontrols.menu.copy_controller_guid": "Copiar o GUID",
|
||||
"midnightcontrols.menu.current_controller_guid": "GUID do controle atual: %s",
|
||||
"midnightcontrols.menu.double_tap_to_sprint": "Toque duplo para correr",
|
||||
"midnightcontrols.menu.double_tap_to_sprint.tooltip": "Alterna se a tecla Andar para Frente faz o jogador correr quando pressionada duas vezes rapidamente",
|
||||
"midnightcontrols.menu.fast_block_placing": "Colocação Rápida de Blocos",
|
||||
"midnightcontrols.menu.fast_block_placing.tooltip": "Enquanto voando no criativo, ativar a Colocação de Rápida de Blocos. §cEm alguns servidores isso pode ser considerado como trapaça.",
|
||||
"midnightcontrols.menu.fly_drifting": "Derrapagem ao Voar",
|
||||
"midnightcontrols.menu.fly_drifting.tooltip": "Enquanto voando, ativa a deparragem/inércia Vanilla.",
|
||||
"midnightcontrols.menu.fly_drifting_vertical": "Derrapagem vertical ao Voar",
|
||||
"midnightcontrols.menu.fly_drifting_vertical.tooltip": "Enquanto voando, ativa a deparragem/inércia vertical Vanilla.",
|
||||
"midnightcontrols.menu.hud_enable": "Ativar HUD",
|
||||
"midnightcontrols.menu.hud_enable.tooltip": "Alterna o indicador de botão do controle na tela.",
|
||||
"midnightcontrols.menu.hud_side": "Lado do HUD",
|
||||
"midnightcontrols.menu.hud_side.tooltip": "A posição do HUD.",
|
||||
"midnightcontrols.menu.invert_right_x_axis": "Inverter X Direito",
|
||||
"midnightcontrols.menu.invert_right_y_axis": "Inverter Y Direito",
|
||||
"midnightcontrols.menu.joystick_as_mouse": "Sempre usar analógico esquerdo como mouse",
|
||||
"midnightcontrols.menu.joystick_as_mouse.tooltip": "Fazer o analógico agir como um mouse em todos os menus.",
|
||||
"midnightcontrols.menu.eye_tracker_as_mouse": "Usar o rastreador ocular como um mouse",
|
||||
"midnightcontrols.menu.eye_tracker_as_mouse.tooltip": "Substituir o mouse com um dispositivo de rastreamento ocular, (por exemplo) o Tobii 5.",
|
||||
"midnightcontrols.menu.eye_tracker_deadzone": "Tamanho da zona morta do rastreador ocular",
|
||||
"midnightcontrols.menu.eye_tracker_deadzone.tooltip": "Parar o movimento da camera quando olhar perto da mira",
|
||||
"midnightcontrols.menu.keyboard_controls": "Controles do teclado...",
|
||||
"midnightcontrols.menu.left_dead_zone": "Zona morta do analógico esquerdo",
|
||||
"midnightcontrols.menu.left_dead_zone.tooltip": "A zona morta para o analógico esquerdo do controle.",
|
||||
"midnightcontrols.menu.mappings.open_input_str": "Abrir editor de arquivo de mapeamentos",
|
||||
"midnightcontrols.menu.max_left_x_value": "Valor máximo do eixo X esquerdo",
|
||||
"midnightcontrols.menu.max_left_x_value.tooltip": "Altera o valor máximo considerado pelo mod para o eixo X esquerdo. Útil se o seu eixo não usa toda a faixa e parece lento.",
|
||||
"midnightcontrols.menu.max_left_y_value": "Valor máximo do eixo Y esquerdo",
|
||||
"midnightcontrols.menu.max_left_y_value.tooltip": "Altera o valor máximo considerado pelo mod para o eixo Y esquerdo. Útil se o seu eixo não usa toda a faixa e parece lento.",
|
||||
"midnightcontrols.menu.max_right_x_value": "Valor máximo do eixo X direito",
|
||||
"midnightcontrols.menu.max_right_x_value.tooltip": "Altera o valor máximo considerado pelo mod para o eixo X direito. Útil se o seu eixo não usa toda a faixa e parece lento.",
|
||||
"midnightcontrols.menu.max_right_y_value": "Valor máximo do eixo Y direito",
|
||||
"midnightcontrols.menu.max_right_y_value.tooltip": "Altera o valor máximo considerado pelo mod para o eixo Y direito. Útil se o seu eixo não usa toda a faixa e parece lento.",
|
||||
"midnightcontrols.menu.mouse_speed": "Velocidade do mouse",
|
||||
"midnightcontrols.menu.mouse_speed.tooltip": "A velocidade do mouse emulado pelo controle",
|
||||
"midnightcontrols.menu.move_chat": "Mover a caixa do chat para o topo",
|
||||
"midnightcontrols.menu.move_chat.tooltip": "Move a caixa do chat para o topo, para uma melhor digitação em dispositivos com teclados na tela.",
|
||||
"midnightcontrols.menu.multiple_mapping_tip": "(Dica: Você também pode inserir múltiplos mapeamentos ao mesmo tempo)",
|
||||
"midnightcontrols.menu.reacharound.horizontal": "Colocação frontal de blocos",
|
||||
"midnightcontrols.menu.reacharound.horizontal.tooltip": "Ativa colocação frontal de blocos, §cEm alguns servidores isso pode ser considerado como trapaça.§r.",
|
||||
"midnightcontrols.menu.reacharound.vertical": "Alcance vertical",
|
||||
"midnightcontrols.menu.reacharound.vertical.tooltip": "Ativa alcance vertical, §c§cEm alguns servidores isso pode ser considerado como trapaça.§r.",
|
||||
"midnightcontrols.menu.reload_controller_mappings": "Recarregar o mapeamento do controle",
|
||||
"midnightcontrols.menu.reload_controller_mappings.tooltip": "Recarrega o arquivo de mapeamentos do controle.",
|
||||
"midnightcontrols.menu.right_dead_zone": "Zona morta do analógico direito",
|
||||
"midnightcontrols.menu.right_dead_zone.tooltip": "A zona morta para o analógico direito do controle..",
|
||||
"midnightcontrols.menu.rotation_speed": "Velocidade de rotação do eixo X",
|
||||
"midnightcontrols.menu.rotation_speed.tooltip": "A velocidade de rotação do eixo X da câmera no modo controle.",
|
||||
"midnightcontrols.menu.y_axis_rotation_speed": "Velocidade de rotação do eixo Y",
|
||||
"midnightcontrols.menu.y_axis_rotation_speed.tooltip": "A velocidade de rotação do eixo Y da câmera no modo controle.",
|
||||
"midnightcontrols.menu.separate_controller_profile": "Separar perfil do controle",
|
||||
"midnightcontrols.menu.separator.controller": "Controle",
|
||||
"midnightcontrols.menu.separator.general": "Geral",
|
||||
"midnightcontrols.menu.title": "MidnightControls - Configurações",
|
||||
"midnightcontrols.menu.title.controller": "Configurações do controle",
|
||||
"midnightcontrols.menu.title.controller_controls": "Mapeamento de controle",
|
||||
"midnightcontrols.menu.title.gameplay": "Configurações de jogabilidade",
|
||||
"midnightcontrols.menu.title.general": "Configurações gerais",
|
||||
"midnightcontrols.menu.title.hud": "Configurações de HUD",
|
||||
"midnightcontrols.menu.title.mappings.string": "Editor de arquivo de mapeamentos",
|
||||
"midnightcontrols.menu.title.touch": "Configurações de toque",
|
||||
"midnightcontrols.menu.title.visual": "Configurações de aparência",
|
||||
"midnightcontrols.menu.touch_break_delay": "Atrasado de destruição do toque",
|
||||
"midnightcontrols.menu.touch_speed": "Velocidade do toque",
|
||||
"midnightcontrols.menu.invert_touch": "Inverter direção do toque",
|
||||
"midnightcontrols.menu.touch_mode": "Modo de interação de toque",
|
||||
"midnightcontrols.menu.touch_transparency": "Transparência do HUD de toque",
|
||||
"midnightcontrols.menu.touch_with_controller": "Toque no modo do controle",
|
||||
"midnightcontrols.menu.unfocused_input": "Entrada desfocada",
|
||||
"midnightcontrols.menu.unfocused_input.tooltip": "Permite entrada de sinais do controle quando a janela não está em foco.",
|
||||
"midnightcontrols.menu.virtual_mouse": "Mouse virtual",
|
||||
"midnightcontrols.menu.virtual_mouse.tooltip": "Ativa o mouse virtual, que é útil durante o modo tela dividida.",
|
||||
"midnightcontrols.menu.virtual_mouse.skin": "Tema do mouse virtual",
|
||||
"midnightcontrols.menu.hide_cursor": "Desativar cursor do mouse padrão",
|
||||
"midnightcontrols.menu.hide_cursor.tooltip": "Esconde o cursor padrão do mouse, deixando apenas o mouse virtual visível.",
|
||||
"midnightcontrols.narrator.unbound": "Desmapear %s",
|
||||
"midnightcontrols.not_bound": "Não mapeado",
|
||||
"midnightcontrols.virtual_mouse.skin.default_light": "Padrão claro",
|
||||
"midnightcontrols.virtual_mouse.skin.default_dark": "Padrão escuro",
|
||||
"midnightcontrols.virtual_mouse.skin.second_light": "Segundo claro",
|
||||
"midnightcontrols.virtual_mouse.skin.second_dark": "Segundo escuro",
|
||||
"midnightcontrols.midnightconfig.category.controller": "Controle",
|
||||
"midnightcontrols.midnightconfig.category.misc": "Variados",
|
||||
"midnightcontrols.midnightconfig.category.screens": "Telas",
|
||||
"midnightcontrols.midnightconfig.category.gameplay": "Jogabilidade",
|
||||
"midnightcontrols.midnightconfig.category.touch": "Toque",
|
||||
"midnightcontrols.midnightconfig.category.visual": "Visual",
|
||||
"modmenu.descriptionTranslation.midnightcontrols": "Adiciona suporte a controles e aprimora o controle no geral.\nDerivado do LambdaControls, que infelizmente foi descontinuado."
|
||||
}
|
||||
@@ -1,9 +1,10 @@
|
||||
{
|
||||
"required": true,
|
||||
"package": "eu.midnightdust.midnightcontrols.client.mixin",
|
||||
"compatibilityLevel": "JAVA_16",
|
||||
"compatibilityLevel": "JAVA_21",
|
||||
"client": [
|
||||
"AdvancementsScreenAccessor",
|
||||
"BookEditScreenAccessor",
|
||||
"ChatScreenMixin",
|
||||
"ClickableWidgetAccessor",
|
||||
"ClientPlayerEntityMixin",
|
||||
@@ -22,6 +23,7 @@
|
||||
"RecipeBookScreenAccessor",
|
||||
"RecipeBookWidgetAccessor",
|
||||
"ScreenMixin",
|
||||
"AbstractSignEditScreenAccessor",
|
||||
"TabNavigationWidgetAccessor",
|
||||
"WorldRendererMixin"
|
||||
],
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"required": true,
|
||||
"package": "eu.midnightdust.midnightcontrols.client.compat.mixin",
|
||||
"plugin": "eu.midnightdust.midnightcontrols.client.compat.MidnightControlsMixinPlugin",
|
||||
"compatibilityLevel": "JAVA_16",
|
||||
"compatibilityLevel": "JAVA_21",
|
||||
"client": [
|
||||
"sodium.SodiumOptionsGUIAccessor"
|
||||
],
|
||||
|
||||
@@ -92,7 +92,8 @@ unifiedPublishing {
|
||||
curseforge {
|
||||
token = CURSEFORGE_TOKEN
|
||||
id = rootProject.curseforge_id
|
||||
gameVersions.addAll "Java 21", project.minecraft_version, project.supported_versions
|
||||
gameVersions.addAll "Java 21", project.minecraft_version
|
||||
if (project.supported_versions != "") gameVersions.addAll project.supported_versions
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,7 +103,8 @@ unifiedPublishing {
|
||||
token = MODRINTH_TOKEN
|
||||
id = rootProject.modrinth_id
|
||||
version = "$project.version-$project.name"
|
||||
gameVersions.addAll project.minecraft_version, project.supported_versions
|
||||
gameVersions.addAll project.minecraft_version
|
||||
if (project.supported_versions != "") gameVersions.addAll project.supported_versions
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package eu.midnightdust.midnightcontrols.fabric;
|
||||
import eu.midnightdust.midnightcontrols.MidnightControlsConstants;
|
||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||
import eu.midnightdust.midnightcontrols.fabric.event.MouseClickListener;
|
||||
import eu.midnightdust.midnightcontrols.packet.ControlsModePayload;
|
||||
import eu.midnightdust.midnightcontrols.packet.FeaturePayload;
|
||||
import eu.midnightdust.midnightcontrols.packet.HelloPayload;
|
||||
@@ -11,11 +12,12 @@ import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
|
||||
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
|
||||
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
|
||||
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
|
||||
import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
|
||||
import net.fabricmc.fabric.api.client.screen.v1.ScreenMouseEvents;
|
||||
import net.fabricmc.fabric.api.resource.ResourceManagerHelper;
|
||||
import net.fabricmc.fabric.api.resource.ResourcePackActivationType;
|
||||
import net.fabricmc.loader.api.FabricLoader;
|
||||
import net.fabricmc.loader.api.ModContainer;
|
||||
import org.thinkingstudio.obsidianui.fabric.event.OpenScreenCallback;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
@@ -51,6 +53,9 @@ public class MidnightControlsClientFabric implements ClientModInitializer {
|
||||
ClientPlayConnectionEvents.DISCONNECT.register((handler, client) -> MidnightControlsClient.onLeave());
|
||||
|
||||
ClientTickEvents.START_CLIENT_TICK.register(MidnightControlsClient::onTick);
|
||||
ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> {
|
||||
ScreenMouseEvents.allowMouseClick(screen).register(new MouseClickListener(screen));
|
||||
});
|
||||
|
||||
FabricLoader.getInstance().getModContainer(MidnightControlsConstants.NAMESPACE).ifPresent(modContainer -> {
|
||||
ResourceManagerHelper.registerBuiltinResourcePack(id("bedrock"), modContainer, ResourcePackActivationType.NORMAL);
|
||||
|
||||
@@ -0,0 +1,218 @@
|
||||
package eu.midnightdust.midnightcontrols.fabric.event;
|
||||
import eu.midnightdust.midnightcontrols.client.gui.VirtualKeyboardScreen;
|
||||
import eu.midnightdust.midnightcontrols.client.mixin.AbstractSignEditScreenAccessor;
|
||||
import eu.midnightdust.midnightcontrols.client.mixin.BookEditScreenAccessor;
|
||||
import eu.midnightdust.midnightcontrols.client.mixin.CreativeInventoryScreenAccessor;
|
||||
import net.fabricmc.fabric.api.client.screen.v1.ScreenMouseEvents;
|
||||
import net.minecraft.block.entity.SignText;
|
||||
import net.minecraft.client.gui.Element;
|
||||
import net.minecraft.client.gui.ParentElement;
|
||||
import net.minecraft.client.gui.screen.ChatScreen;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
import net.minecraft.client.gui.screen.ingame.BookEditScreen;
|
||||
import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
|
||||
import net.minecraft.client.gui.screen.ingame.SignEditScreen;
|
||||
import net.minecraft.client.gui.widget.TextFieldWidget;
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static eu.midnightdust.midnightcontrols.MidnightControls.logger;
|
||||
import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.client;
|
||||
|
||||
record ScreenLink(Screen screen, List<Integer> elementPath) {}
|
||||
|
||||
public class MouseClickListener implements ScreenMouseEvents.AllowMouseClick {
|
||||
private final Screen screen;
|
||||
|
||||
private ScreenLink link;
|
||||
|
||||
public MouseClickListener(Screen screen) {
|
||||
this.screen = screen;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean allowMouseClick(Screen screen, double mouseX, double mouseY, int button) {
|
||||
interceptMouseClick(screen, mouseX, mouseY);
|
||||
return true;
|
||||
}
|
||||
|
||||
private void interceptMouseClick(Screen screen, double mouseX, double mouseY) {
|
||||
logger.info("In scr: {}", screen.getClass());
|
||||
switch(screen) {
|
||||
case BookEditScreen bookEditScreen -> {
|
||||
if(screen.hoveredElement(mouseX, mouseY).isPresent()) {
|
||||
return;
|
||||
}
|
||||
handleBookEditScreenClick(bookEditScreen);
|
||||
}
|
||||
case SignEditScreen signEditScreen -> {
|
||||
if(screen.hoveredElement(mouseX, mouseY).isPresent()) {
|
||||
return;
|
||||
}
|
||||
handleSignEditScreenClick(signEditScreen);
|
||||
}
|
||||
default -> {
|
||||
var textField = findClickedTextField(screen, mouseX, mouseY);
|
||||
if (textField == null) {
|
||||
return;
|
||||
}
|
||||
handleTextFieldClick(textField);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Add equals and hashCode to prevent duplicate registrations
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (obj instanceof MouseClickListener) {
|
||||
return ((MouseClickListener) obj).screen == this.screen;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return screen.hashCode();
|
||||
}
|
||||
|
||||
// handlers
|
||||
|
||||
private void handleBookEditScreenClick(BookEditScreen bookEditScreen) {
|
||||
var accessor = (BookEditScreenAccessor) screen;
|
||||
|
||||
VirtualKeyboardScreen virtualKeyboardScreen;
|
||||
if(accessor.midnightcontrols$isSigning()) {
|
||||
virtualKeyboardScreen = new VirtualKeyboardScreen(accessor.midnightcontrols$getTitle(), (text) -> {
|
||||
client.setScreen(bookEditScreen);
|
||||
accessor.midnightcontrols$setTitle(text);
|
||||
});
|
||||
}
|
||||
else {
|
||||
virtualKeyboardScreen = new VirtualKeyboardScreen(accessor.midnightcontrols$getCurrentPageContent(), (text) -> {
|
||||
client.setScreen(bookEditScreen);
|
||||
accessor.midnightcontrols$setPageContent(text);
|
||||
accessor.midnightcontrols$getCurrentPageSelectionManager().putCursorAtEnd();
|
||||
});
|
||||
}
|
||||
|
||||
client.setScreen(virtualKeyboardScreen);
|
||||
}
|
||||
|
||||
private void handleSignEditScreenClick(SignEditScreen signEditScreen) {
|
||||
var accessor = (AbstractSignEditScreenAccessor) signEditScreen;
|
||||
// TODO
|
||||
}
|
||||
|
||||
private void handleTextFieldClick(TextFieldWidget textField) {
|
||||
this.link = new ScreenLink(screen, calculatePathToElement(screen, textField));
|
||||
var virtualKeyboardScreen = new VirtualKeyboardScreen(textField.getText(), this::handleKeyboardClose);
|
||||
client.setScreen(virtualKeyboardScreen);
|
||||
}
|
||||
|
||||
private void handleKeyboardClose(String newText) {
|
||||
if(this.link == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
client.setScreen(this.link.screen());
|
||||
var txtField = findTextFieldByPath(screen, this.link.elementPath());
|
||||
if (txtField == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
txtField.setText(newText);
|
||||
|
||||
|
||||
switch (this.link.screen()) {
|
||||
case CreativeInventoryScreen creativeInventoryScreen -> {
|
||||
var accessor = (CreativeInventoryScreenAccessor) creativeInventoryScreen;
|
||||
accessor.midnightcontrols$search();
|
||||
}
|
||||
case ChatScreen chatScreen -> {
|
||||
// send the chat message
|
||||
chatScreen.keyPressed(GLFW.GLFW_KEY_ENTER, 0, 0);
|
||||
}
|
||||
default -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// utility
|
||||
|
||||
private TextFieldWidget findClickedTextField(Screen screen, double mouseX, double mouseY) {
|
||||
for (Element element : screen.children()) {
|
||||
if (element instanceof TextFieldWidget textField) {
|
||||
if (textField.isMouseOver(mouseX, mouseY) && textField.isFocused()) {
|
||||
return textField;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// not hovering over a text field
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the path between a parent and a target in the UI hierarchy
|
||||
*/
|
||||
private List<Integer> calculatePathToElement(Element parent, Element target) {
|
||||
if (parent instanceof ParentElement parentElement) {
|
||||
List<? extends Element> children = parentElement.children();
|
||||
|
||||
// check direct children first
|
||||
for (int i = 0; i < children.size(); i++) {
|
||||
if (children.get(i) == target) {
|
||||
// found it, return the path to this element
|
||||
return Collections.singletonList(i);
|
||||
}
|
||||
}
|
||||
|
||||
// check each child's children
|
||||
for (int i = 0; i < children.size(); i++) {
|
||||
if (children.get(i) instanceof ParentElement childParent) {
|
||||
List<Integer> subPath = calculatePathToElement(childParent, target);
|
||||
if (subPath != null) {
|
||||
// found in this subtree, prepend current index
|
||||
List<Integer> fullPath = new ArrayList<>();
|
||||
fullPath.add(i);
|
||||
fullPath.addAll(subPath);
|
||||
return fullPath;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Not found
|
||||
return null;
|
||||
}
|
||||
|
||||
private TextFieldWidget findTextFieldByPath(Element parent, List<Integer> path) {
|
||||
if (path == null || path.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (parent instanceof ParentElement parentElement) {
|
||||
List<? extends Element> children = parentElement.children();
|
||||
int index = path.getFirst();
|
||||
|
||||
if (index >= 0 && index < children.size()) {
|
||||
Element child = children.get(index);
|
||||
|
||||
if (path.size() == 1) {
|
||||
// This should be our target
|
||||
return (child instanceof TextFieldWidget) ? (TextFieldWidget) child : null;
|
||||
} else {
|
||||
// Continue traversing
|
||||
if (child instanceof ParentElement) {
|
||||
return findTextFieldByPath(child, path.subList(1, path.size()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -54,7 +54,7 @@
|
||||
"fabric": ">=0.71.0",
|
||||
"minecraft": ">=1.20.5",
|
||||
"obsidianui": ">=0.2.5",
|
||||
"java": ">=17"
|
||||
"java": ">=21"
|
||||
},
|
||||
"suggests": {
|
||||
"kontrolo": "*"
|
||||
|
||||
@@ -2,34 +2,34 @@
|
||||
org.gradle.parallel=true
|
||||
org.gradle.jvmargs=-Xmx2048M
|
||||
|
||||
minecraft_version=1.21.3
|
||||
supported_versions=1.21.2
|
||||
yarn_mappings=1.21.3+build.2
|
||||
minecraft_version=1.21.4
|
||||
supported_versions=
|
||||
yarn_mappings=1.21.4+build.1
|
||||
enabled_platforms=fabric,neoforge
|
||||
|
||||
archives_base_name=midnightcontrols
|
||||
mod_version=1.10.0
|
||||
mod_version=1.10.5
|
||||
maven_group=eu.midnightdust
|
||||
release_type=beta
|
||||
release_type=release
|
||||
modrinth_id = bXX9h73M
|
||||
curseforge_id = 621768
|
||||
# Configure the IDs here after creating the projects on the websites
|
||||
|
||||
midnightlib_version=1.6.4
|
||||
midnightlib_version=1.6.8+1.21.4
|
||||
|
||||
fabric_loader_version=0.16.9
|
||||
fabric_api_version=0.107.3+1.21.3
|
||||
fabric_api_version=0.110.5+1.21.4
|
||||
|
||||
neoforge_version=21.3.28-beta
|
||||
neoforge_version=21.4.9-beta
|
||||
yarn_mappings_patch_neoforge_version = 1.21+build.4
|
||||
|
||||
quilt_loader_version=0.19.0-beta.18
|
||||
quilt_fabric_api_version=7.0.1+0.83.0-1.20
|
||||
|
||||
sodium_version=mc1.21-0.6.0-beta.1
|
||||
obsidianui_version=0.2.7+mc1.21
|
||||
obsidianui_version=0.2.10+mc1.21.3
|
||||
modmenu_version=10.0.0-beta.1
|
||||
emotecraft_version=2.1.3-SNAPSHOT-build.29-MC1.19-fabric
|
||||
emotecraft_version=2.5.5+1.21.4-fabric
|
||||
bendylib_version=2.0.+
|
||||
emi_version=1.1.10+1.21+fabric
|
||||
libgui_version=6.0.0+1.19
|
||||
|
||||
@@ -104,7 +104,8 @@ unifiedPublishing {
|
||||
curseforge {
|
||||
token = CURSEFORGE_TOKEN
|
||||
id = rootProject.curseforge_id
|
||||
gameVersions.addAll "Java 21", project.minecraft_version, project.supported_versions
|
||||
gameVersions.addAll "Java 21", project.minecraft_version
|
||||
if (project.supported_versions != "") gameVersions.addAll project.supported_versions
|
||||
}
|
||||
}
|
||||
|
||||
@@ -114,7 +115,8 @@ unifiedPublishing {
|
||||
token = MODRINTH_TOKEN
|
||||
id = rootProject.modrinth_id
|
||||
version = "$project.version-$project.name"
|
||||
gameVersions.addAll project.minecraft_version, project.supported_versions
|
||||
gameVersions.addAll project.minecraft_version
|
||||
if (project.supported_versions != "") gameVersions.addAll project.supported_versions
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,12 @@ public class NetworkUtilImpl {
|
||||
handler.send(packet);
|
||||
}
|
||||
public static void sendPayloadC2S(CustomPayload payload) {
|
||||
if (handler != null && client.world != null)
|
||||
handler.send(new CustomPayloadC2SPacket(payload));
|
||||
if (handler != null && client.world != null) {
|
||||
try {
|
||||
handler.send(new CustomPayloadC2SPacket(payload));
|
||||
} catch (Exception e) {
|
||||
e.fillInStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user