Compare commits

..

2 Commits
1.2.0 ... 1.3.0

Author SHA1 Message Date
LambdAurora
4669e446dc 🔖 LambdaControls v1.3.0: Update to Minecraft 1.16.1. 2020-06-27 19:05:20 +02:00
LambdAurora
e676a37c7f Update to 1.16. 2020-06-27 16:08:10 +02:00
34 changed files with 392 additions and 346 deletions

View File

@@ -47,8 +47,8 @@ dependencies {
include "com.github.lambdaurora:spruceui:${project.spruceui_version}" include "com.github.lambdaurora:spruceui:${project.spruceui_version}"
// Compatibility mods // Compatibility mods
modCompile "io.github.joaoh1:okzoomer:2.1.0-beta.2" modCompile "io.github.joaoh1:okzoomer:4.0.0-alpha.3.1.16.pre5"
modCompile "me.shedaniel:RoughlyEnoughItems:3.4.5" modCompile "me.shedaniel:RoughlyEnoughItems:4.5.5"
api project(":core") api project(":core")
shadow project(":core") shadow project(":core")

View File

@@ -15,8 +15,9 @@ import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.network.ServerSidePacketRegistry; import net.fabricmc.fabric.api.network.ServerSidePacketRegistry;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.ModContainer;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.PacketByteBuf;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -28,7 +29,7 @@ import java.util.Optional;
* Represents the LambdaControls mod. * Represents the LambdaControls mod.
* *
* @author LambdAurora * @author LambdAurora
* @version 1.1.0 * @version 1.3.0
* @since 1.0.0 * @since 1.0.0
*/ */
public class LambdaControls implements ModInitializer public class LambdaControls implements ModInitializer
@@ -38,6 +39,8 @@ public class LambdaControls implements ModInitializer
public static final Identifier FEATURE_CHANNEL = new Identifier(LambdaControlsConstants.FEATURE_CHANNEL.toString()); public static final Identifier FEATURE_CHANNEL = new Identifier(LambdaControlsConstants.FEATURE_CHANNEL.toString());
public static final Identifier HELLO_CHANNEL = new Identifier(LambdaControlsConstants.HELLO_CHANNEL.toString()); public static final Identifier HELLO_CHANNEL = new Identifier(LambdaControlsConstants.HELLO_CHANNEL.toString());
public static final TranslatableText NOT_BOUND_TEXT = new TranslatableText("lambdacontrols.not_bound");
public final Logger logger = LogManager.getLogger("LambdaControls"); public final Logger logger = LogManager.getLogger("LambdaControls");
@Override @Override

View File

@@ -16,16 +16,18 @@ import me.lambdaurora.lambdacontrols.LambdaControlsFeature;
import me.lambdaurora.lambdacontrols.client.compat.LambdaControlsCompat; import me.lambdaurora.lambdacontrols.client.compat.LambdaControlsCompat;
import me.lambdaurora.lambdacontrols.client.controller.ButtonBinding; import me.lambdaurora.lambdacontrols.client.controller.ButtonBinding;
import me.lambdaurora.lambdacontrols.client.controller.Controller; import me.lambdaurora.lambdacontrols.client.controller.Controller;
import me.lambdaurora.lambdacontrols.client.controller.InputManager;
import me.lambdaurora.lambdacontrols.client.gui.LambdaControlsHud; import me.lambdaurora.lambdacontrols.client.gui.LambdaControlsHud;
import me.lambdaurora.lambdacontrols.client.gui.TouchscreenOverlay; import me.lambdaurora.lambdacontrols.client.gui.TouchscreenOverlay;
import me.lambdaurora.spruceui.event.OpenScreenCallback; import me.lambdaurora.spruceui.event.OpenScreenCallback;
import me.lambdaurora.spruceui.hud.HudManager; import me.lambdaurora.spruceui.hud.HudManager;
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.keybinding.KeyBindingRegistry; import net.fabricmc.fabric.api.client.keybinding.KeyBindingRegistry;
import net.fabricmc.fabric.api.event.client.ClientTickCallback; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; import net.fabricmc.fabric.api.network.ClientSidePacketRegistry;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.options.KeyBinding;
import net.minecraft.client.toast.SystemToast; import net.minecraft.client.toast.SystemToast;
import net.minecraft.client.util.InputUtil; import net.minecraft.client.util.InputUtil;
import net.minecraft.text.LiteralText; import net.minecraft.text.LiteralText;
@@ -38,20 +40,20 @@ import org.lwjgl.glfw.GLFW;
* Represents the LambdaControls client mod. * Represents the LambdaControls client mod.
* *
* @author LambdAurora * @author LambdAurora
* @version 1.2.0 * @version 1.3.0
* @since 1.1.0 * @since 1.1.0
*/ */
public class LambdaControlsClient extends LambdaControls implements ClientModInitializer public class LambdaControlsClient extends LambdaControls implements ClientModInitializer
{ {
private static LambdaControlsClient INSTANCE; private static LambdaControlsClient INSTANCE;
public static final FabricKeyBinding BINDING_LOOK_UP = FabricKeyBinding.Builder.create(new Identifier(LambdaControlsConstants.NAMESPACE, "look_up"), public static final KeyBinding BINDING_LOOK_UP = InputManager.makeKeyBinding(new Identifier(LambdaControlsConstants.NAMESPACE, "look_up"),
InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_8, "key.categories.movement").build(); InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_8, "key.categories.movement");
public static final FabricKeyBinding BINDING_LOOK_RIGHT = FabricKeyBinding.Builder.create(new Identifier(LambdaControlsConstants.NAMESPACE, "look_right"), public static final KeyBinding BINDING_LOOK_RIGHT = InputManager.makeKeyBinding(new Identifier(LambdaControlsConstants.NAMESPACE, "look_right"),
InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_6, "key.categories.movement").build(); InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_6, "key.categories.movement");
public static final FabricKeyBinding BINDING_LOOK_DOWN = FabricKeyBinding.Builder.create(new Identifier(LambdaControlsConstants.NAMESPACE, "look_down"), public static final KeyBinding BINDING_LOOK_DOWN = InputManager.makeKeyBinding(new Identifier(LambdaControlsConstants.NAMESPACE, "look_down"),
InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_2, "key.categories.movement").build(); InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_2, "key.categories.movement");
public static final FabricKeyBinding BINDING_LOOK_LEFT = FabricKeyBinding.Builder.create(new Identifier(LambdaControlsConstants.NAMESPACE, "look_left"), public static final KeyBinding BINDING_LOOK_LEFT = InputManager.makeKeyBinding(new Identifier(LambdaControlsConstants.NAMESPACE, "look_left"),
InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_4, "key.categories.movement").build(); InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_4, "key.categories.movement");
public static final Identifier CONTROLLER_BUTTONS = new Identifier(LambdaControlsConstants.NAMESPACE, "textures/gui/controller_buttons.png"); public static final Identifier CONTROLLER_BUTTONS = new Identifier(LambdaControlsConstants.NAMESPACE, "textures/gui/controller_buttons.png");
public static final Identifier CONTROLLER_AXIS = new Identifier(LambdaControlsConstants.NAMESPACE, "textures/gui/controller_axis.png"); public static final Identifier CONTROLLER_AXIS = new Identifier(LambdaControlsConstants.NAMESPACE, "textures/gui/controller_axis.png");
public static final Identifier CURSOR_TEXTURE = new Identifier(LambdaControlsConstants.NAMESPACE, "textures/gui/cursor.png"); public static final Identifier CURSOR_TEXTURE = new Identifier(LambdaControlsConstants.NAMESPACE, "textures/gui/cursor.png");
@@ -64,10 +66,10 @@ public class LambdaControlsClient extends LambdaControls implements ClientModIni
public void onInitializeClient() public void onInitializeClient()
{ {
INSTANCE = this; INSTANCE = this;
KeyBindingRegistry.INSTANCE.register(BINDING_LOOK_UP); KeyBindingHelper.registerKeyBinding(BINDING_LOOK_UP);
KeyBindingRegistry.INSTANCE.register(BINDING_LOOK_RIGHT); KeyBindingHelper.registerKeyBinding(BINDING_LOOK_RIGHT);
KeyBindingRegistry.INSTANCE.register(BINDING_LOOK_DOWN); KeyBindingHelper.registerKeyBinding(BINDING_LOOK_DOWN);
KeyBindingRegistry.INSTANCE.register(BINDING_LOOK_LEFT); KeyBindingHelper.registerKeyBinding(BINDING_LOOK_LEFT);
ClientSidePacketRegistry.INSTANCE.register(CONTROLS_MODE_CHANNEL, (context, attachedData) -> context.getTaskQueue() ClientSidePacketRegistry.INSTANCE.register(CONTROLS_MODE_CHANNEL, (context, attachedData) -> context.getTaskQueue()
.execute(() -> ClientSidePacketRegistry.INSTANCE.sendToServer(CONTROLS_MODE_CHANNEL, this.makeControlsModeBuffer(this.config.getControlsMode())))); .execute(() -> ClientSidePacketRegistry.INSTANCE.sendToServer(CONTROLS_MODE_CHANNEL, this.makeControlsModeBuffer(this.config.getControlsMode()))));
@@ -77,7 +79,7 @@ public class LambdaControlsClient extends LambdaControls implements ClientModIni
LambdaControlsFeature.fromName(name).ifPresent(feature -> context.getTaskQueue().execute(() -> feature.setAllowed(allowed))); LambdaControlsFeature.fromName(name).ifPresent(feature -> context.getTaskQueue().execute(() -> feature.setAllowed(allowed)));
}); });
ClientTickCallback.EVENT.register(this::onTick); ClientTickEvents.END_CLIENT_TICK.register(this::onTick);
OpenScreenCallback.EVENT.register((client, screen) -> { OpenScreenCallback.EVENT.register((client, screen) -> {
if (screen == null && this.config.getControlsMode() == ControlsMode.TOUCHSCREEN) { if (screen == null && this.config.getControlsMode() == ControlsMode.TOUCHSCREEN) {

View File

@@ -18,17 +18,11 @@ import me.lambdaurora.lambdacontrols.client.gui.LambdaControlsSettingsScreen;
* Represents the API implementation of ModMenu for LambdaControls. * Represents the API implementation of ModMenu for LambdaControls.
* *
* @author LambdAurora * @author LambdAurora
* @version 1.2.0 * @version 1.3.0
* @since 1.1.0 * @since 1.1.0
*/ */
public class LambdaControlsModMenu implements ModMenuApi public class LambdaControlsModMenu implements ModMenuApi
{ {
@Override
public String getModId()
{
return LambdaControlsConstants.NAMESPACE;
}
@Override @Override
public ConfigScreenFactory<?> getModConfigScreenFactory() public ConfigScreenFactory<?> getModConfigScreenFactory()
{ {

View File

@@ -19,7 +19,7 @@ import me.lambdaurora.lambdacontrols.client.gui.TouchscreenOverlay;
import me.lambdaurora.lambdacontrols.client.mixin.AdvancementsScreenAccessor; import me.lambdaurora.lambdacontrols.client.mixin.AdvancementsScreenAccessor;
import me.lambdaurora.lambdacontrols.client.mixin.CreativeInventoryScreenAccessor; import me.lambdaurora.lambdacontrols.client.mixin.CreativeInventoryScreenAccessor;
import me.lambdaurora.lambdacontrols.client.mixin.EntryListWidgetAccessor; import me.lambdaurora.lambdacontrols.client.mixin.EntryListWidgetAccessor;
import me.lambdaurora.lambdacontrols.client.util.ContainerScreenAccessor; import me.lambdaurora.lambdacontrols.client.util.HandledScreenAccessor;
import me.lambdaurora.lambdacontrols.client.util.MouseAccessor; import me.lambdaurora.lambdacontrols.client.util.MouseAccessor;
import me.lambdaurora.spruceui.SpruceLabelWidget; import me.lambdaurora.spruceui.SpruceLabelWidget;
import net.minecraft.block.Block; import net.minecraft.block.Block;
@@ -32,19 +32,20 @@ import net.minecraft.client.gui.ParentElement;
import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.advancement.AdvancementTab; import net.minecraft.client.gui.screen.advancement.AdvancementTab;
import net.minecraft.client.gui.screen.advancement.AdvancementsScreen; import net.minecraft.client.gui.screen.advancement.AdvancementsScreen;
import net.minecraft.client.gui.screen.ingame.ContainerScreen;
import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen; import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
import net.minecraft.client.gui.screen.ingame.HandledScreen;
import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen; import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen;
import net.minecraft.client.gui.screen.multiplayer.MultiplayerServerListWidget; import net.minecraft.client.gui.screen.multiplayer.MultiplayerServerListWidget;
import net.minecraft.client.gui.screen.world.WorldListWidget; import net.minecraft.client.gui.screen.world.WorldListWidget;
import net.minecraft.client.gui.widget.AbstractPressableButtonWidget; import net.minecraft.client.gui.widget.AbstractPressableButtonWidget;
import net.minecraft.client.gui.widget.AlwaysSelectedEntryListWidget; import net.minecraft.client.gui.widget.AlwaysSelectedEntryListWidget;
import net.minecraft.client.gui.widget.EntryListWidget;
import net.minecraft.client.gui.widget.SliderWidget; import net.minecraft.client.gui.widget.SliderWidget;
import net.minecraft.container.Slot;
import net.minecraft.container.SlotActionType;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.screen.slot.Slot;
import net.minecraft.screen.slot.SlotActionType;
import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.hit.HitResult; import net.minecraft.util.hit.HitResult;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
@@ -71,7 +72,7 @@ import static org.lwjgl.glfw.GLFW.*;
* Represents the LambdaControls' input handler. * Represents the LambdaControls' input handler.
* *
* @author LambdAurora * @author LambdAurora
* @version 1.2.0 * @version 1.3.0
* @since 1.0.0 * @since 1.0.0
*/ */
public class LambdaInput public class LambdaInput
@@ -320,28 +321,28 @@ public class LambdaInput
} }
} }
if (client.currentScreen instanceof ContainerScreen && client.interactionManager != null && client.player != null) { if (client.currentScreen instanceof HandledScreen && client.interactionManager != null && client.player != null) {
double x = client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth(); double x = client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth();
double y = client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight(); double y = client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight();
Slot slot = ((ContainerScreenAccessor) client.currentScreen).lambdacontrols_getSlotAt(x, y); Slot slot = ((HandledScreenAccessor) client.currentScreen).lambdacontrols_getSlotAt(x, y);
SlotActionType slotAction = SlotActionType.PICKUP; SlotActionType slotAction = SlotActionType.PICKUP;
if (button == GLFW.GLFW_GAMEPAD_BUTTON_A && slot != null) { if (button == GLFW.GLFW_GAMEPAD_BUTTON_A && slot != null) {
if (client.currentScreen instanceof CreativeInventoryScreen) { if (client.currentScreen instanceof CreativeInventoryScreen) {
if (((CreativeInventoryScreenAccessor) client.currentScreen).lambdacontrols_isCreativeInventorySlot(slot)) if (((CreativeInventoryScreenAccessor) client.currentScreen).lambdacontrols_isCreativeInventorySlot(slot))
slotAction = SlotActionType.CLONE; slotAction = SlotActionType.CLONE;
} }
client.interactionManager.clickSlot(((ContainerScreen) client.currentScreen).getContainer().syncId, slot.id, GLFW.GLFW_MOUSE_BUTTON_1, slotAction, client.player); client.interactionManager.clickSlot(((HandledScreen) client.currentScreen).getScreenHandler().syncId, slot.id, GLFW.GLFW_MOUSE_BUTTON_1, slotAction, client.player);
client.player.playerContainer.sendContentUpdates(); client.player.playerScreenHandler.sendContentUpdates();
this.actionGuiCooldown = 5; this.actionGuiCooldown = 5;
return; return;
} else if (button == GLFW.GLFW_GAMEPAD_BUTTON_B) { } else if (button == GLFW.GLFW_GAMEPAD_BUTTON_B) {
client.player.closeContainer(); client.player.closeHandledScreen();
return; return;
} else if (button == GLFW.GLFW_GAMEPAD_BUTTON_X && slot != null) { } else if (button == GLFW.GLFW_GAMEPAD_BUTTON_X && slot != null) {
client.interactionManager.clickSlot(((ContainerScreen) client.currentScreen).getContainer().syncId, slot.id, GLFW.GLFW_MOUSE_BUTTON_2, SlotActionType.PICKUP, client.player); client.interactionManager.clickSlot(((HandledScreen) client.currentScreen).getScreenHandler().syncId, slot.id, GLFW.GLFW_MOUSE_BUTTON_2, SlotActionType.PICKUP, client.player);
return; return;
} else if (button == GLFW.GLFW_GAMEPAD_BUTTON_Y && slot != null) { } else if (button == GLFW.GLFW_GAMEPAD_BUTTON_Y && slot != null) {
client.interactionManager.clickSlot(((ContainerScreen) client.currentScreen).getContainer().syncId, slot.id, GLFW.GLFW_MOUSE_BUTTON_1, SlotActionType.QUICK_MOVE, client.player); client.interactionManager.clickSlot(((HandledScreen) client.currentScreen).getScreenHandler().syncId, slot.id, GLFW.GLFW_MOUSE_BUTTON_1, SlotActionType.QUICK_MOVE, client.player);
return; return;
} }
} else if (button == GLFW.GLFW_GAMEPAD_BUTTON_B) { } else if (button == GLFW.GLFW_GAMEPAD_BUTTON_B) {
@@ -562,7 +563,7 @@ public class LambdaInput
this.actionGuiCooldown = 2; // Prevent to press too quickly the focused element, so we have to skip 5 ticks. this.actionGuiCooldown = 2; // Prevent to press too quickly the focused element, so we have to skip 5 ticks.
return false; return false;
} else if (element instanceof AlwaysSelectedEntryListWidget) { } else if (element instanceof AlwaysSelectedEntryListWidget) {
((EntryListWidgetAccessor) element).lambdacontrols_moveSelection(right ? 1 : -1); ((EntryListWidgetAccessor) element).lambdacontrols_moveSelection(right ? EntryListWidget.class_5403.field_25661 : EntryListWidget.class_5403.field_25662);
return false; return false;
} else if (element instanceof ParentElement) { } else if (element instanceof ParentElement) {
ParentElement entryList = (ParentElement) element; ParentElement entryList = (ParentElement) element;
@@ -620,26 +621,26 @@ public class LambdaInput
public static boolean isScreenInteractive(@NotNull Screen screen) public static boolean isScreenInteractive(@NotNull Screen screen)
{ {
return !(screen instanceof AdvancementsScreen || screen instanceof ContainerScreen || LambdaControlsCompat.requireMouseOnScreen(screen)); return !(screen instanceof AdvancementsScreen || screen instanceof HandledScreen || LambdaControlsCompat.requireMouseOnScreen(screen));
} }
// Inspired from https://github.com/MrCrayfish/Controllable/blob/1.14.X/src/main/java/com/mrcrayfish/controllable/client/ControllerInput.java#L686. // Inspired from https://github.com/MrCrayfish/Controllable/blob/1.14.X/src/main/java/com/mrcrayfish/controllable/client/ControllerInput.java#L686.
private void moveMouseToClosestSlot(@NotNull MinecraftClient client, @Nullable Screen screen) private void moveMouseToClosestSlot(@NotNull MinecraftClient client, @Nullable Screen screen)
{ {
// Makes the mouse attracted to slots. This helps with selecting items when using a controller. // Makes the mouse attracted to slots. This helps with selecting items when using a controller.
if (screen instanceof ContainerScreen) { if (screen instanceof HandledScreen) {
ContainerScreen inventoryScreen = (ContainerScreen) screen; HandledScreen inventoryScreen = (HandledScreen) screen;
ContainerScreenAccessor accessor = (ContainerScreenAccessor) inventoryScreen; HandledScreenAccessor accessor = (HandledScreenAccessor) inventoryScreen;
int guiLeft = accessor.getX(); int guiLeft = accessor.getX();
int guiTop = accessor.getY(); int guiTop = accessor.getY();
int mouseX = (int) (targetMouseX * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth()); int mouseX = (int) (targetMouseX * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth());
int mouseY = (int) (targetMouseY * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight()); int mouseY = (int) (targetMouseY * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight());
// Finds the closest slot in the GUI within 14 pixels. // Finds the closest slot in the GUI within 14 pixels.
Optional<Pair<Slot, Double>> closestSlot = inventoryScreen.getContainer().slots.parallelStream() Optional<Pair<Slot, Double>> closestSlot = inventoryScreen.getScreenHandler().slots.parallelStream()
.map(slot -> { .map(slot -> {
int x = guiLeft + slot.xPosition + 8; int x = guiLeft + slot.x + 8;
int y = guiTop + slot.yPosition + 8; int y = guiTop + slot.y + 8;
// Distance between the slot and the cursor. // Distance between the slot and the cursor.
double distance = Math.sqrt(Math.pow(x - mouseX, 2) + Math.pow(y - mouseY, 2)); double distance = Math.sqrt(Math.pow(x - mouseX, 2) + Math.pow(y - mouseY, 2));
@@ -650,8 +651,8 @@ public class LambdaInput
if (closestSlot.isPresent()) { if (closestSlot.isPresent()) {
Slot slot = closestSlot.get().key; Slot slot = closestSlot.get().key;
if (slot.hasStack() || !client.player.inventory.getMainHandStack().isEmpty()) { if (slot.hasStack() || !client.player.inventory.getMainHandStack().isEmpty()) {
int slotCenterXScaled = guiLeft + slot.xPosition + 8; int slotCenterXScaled = guiLeft + slot.x + 8;
int slotCenterYScaled = guiTop + slot.yPosition + 8; int slotCenterYScaled = guiTop + slot.y + 8;
int slotCenterX = (int) (slotCenterXScaled / ((double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth())); int slotCenterX = (int) (slotCenterXScaled / ((double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth()));
int slotCenterY = (int) (slotCenterYScaled / ((double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight())); int slotCenterY = (int) (slotCenterYScaled / ((double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight()));
double deltaX = slotCenterX - targetMouseX; double deltaX = slotCenterX - targetMouseX;
@@ -710,7 +711,7 @@ public class LambdaInput
{ {
if (!LambdaControlsFeature.FRONT_BLOCK_PLACING.isAvailable()) if (!LambdaControlsFeature.FRONT_BLOCK_PLACING.isAvailable())
return null; return null;
if (client.player != null && client.crosshairTarget != null && client.crosshairTarget.getType() == HitResult.Type.MISS && client.player.onGround && client.player.pitch > 35.0F) { if (client.player != null && client.crosshairTarget != null && client.crosshairTarget.getType() == HitResult.Type.MISS && client.player.isOnGround() && client.player.pitch > 35.0F) {
if (client.player.isRiding()) if (client.player.isRiding())
return null; return null;
BlockPos playerPos = client.player.getBlockPos().down(); BlockPos playerPos = client.player.getBlockPos().down();

View File

@@ -9,7 +9,7 @@
package me.lambdaurora.lambdacontrols.client.compat; package me.lambdaurora.lambdacontrols.client.compat;
import io.github.joaoh1.okzoomer.OkZoomer; import io.github.joaoh1.okzoomer.client.OkZoomerClientMod;
import me.lambdaurora.lambdacontrols.client.LambdaControlsClient; import me.lambdaurora.lambdacontrols.client.LambdaControlsClient;
import me.lambdaurora.lambdacontrols.client.controller.ButtonBinding; import me.lambdaurora.lambdacontrols.client.controller.ButtonBinding;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -19,12 +19,12 @@ import org.lwjgl.glfw.GLFW;
* Represents a compatibility handler for OkZoomer. * Represents a compatibility handler for OkZoomer.
* *
* @author LambdAurora * @author LambdAurora
* @version 1.1.0 * @version 1.3.0
* @since 1.1.0 * @since 1.1.0
*/ */
public class OkZoomerCompat implements CompatHandler public class OkZoomerCompat implements CompatHandler
{ {
public static final String OKZOOMER_CLASS_PATH = "io.github.joaoh1.okzoomer.OkZoomer"; public static final String OKZOOMER_CLASS_PATH = "io.github.joaoh1.okzoomer.client.OkZoomerClientMod";
@Override @Override
public void handle(@NotNull LambdaControlsClient mod) public void handle(@NotNull LambdaControlsClient mod)
@@ -34,7 +34,7 @@ public class OkZoomerCompat implements CompatHandler
.onlyInGame() .onlyInGame()
.cooldown(true) .cooldown(true)
.category(ButtonBinding.MISC_CATEGORY) .category(ButtonBinding.MISC_CATEGORY)
.linkKeybind(OkZoomer.zoomKeyBinding) .linkKeybind(OkZoomerClientMod.zoomKeyBinding)
.register(); .register();
} }
} }

View File

@@ -37,7 +37,7 @@ import static org.lwjgl.glfw.GLFW.*;
* Represents a compatibility handler for REI. * Represents a compatibility handler for REI.
* *
* @author LambdAurora * @author LambdAurora
* @version 1.2.0 * @version 1.3.0
* @since 1.2.0 * @since 1.2.0
*/ */
public class ReiCompat implements CompatHandler public class ReiCompat implements CompatHandler
@@ -155,9 +155,9 @@ public class ReiCompat implements CompatHandler
if (client.currentScreen instanceof RecipeViewingScreen) { if (client.currentScreen instanceof RecipeViewingScreen) {
RecipeViewingScreenAccessor screen = (RecipeViewingScreenAccessor) client.currentScreen; RecipeViewingScreenAccessor screen = (RecipeViewingScreenAccessor) client.currentScreen;
if (next) if (next)
screen.getCategoryNext().onPressed(); screen.getCategoryNext().onClick();
else else
screen.getCategoryBack().onPressed(); screen.getCategoryBack().onClick();
return true; return true;
} else if (client.currentScreen instanceof VillagerRecipeViewingScreen) { } else if (client.currentScreen instanceof VillagerRecipeViewingScreen) {
VillagerRecipeViewingScreenAccessor screen = (VillagerRecipeViewingScreenAccessor) client.currentScreen; VillagerRecipeViewingScreenAccessor screen = (VillagerRecipeViewingScreenAccessor) client.currentScreen;

View File

@@ -9,8 +9,8 @@
package me.lambdaurora.lambdacontrols.client.compat.mixin; package me.lambdaurora.lambdacontrols.client.compat.mixin;
import me.shedaniel.rei.api.widgets.Button;
import me.shedaniel.rei.gui.RecipeViewingScreen; import me.shedaniel.rei.gui.RecipeViewingScreen;
import me.shedaniel.rei.gui.widget.ButtonWidget;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;
@@ -18,15 +18,15 @@ import org.spongepowered.asm.mixin.gen.Accessor;
* Represents an accessor to REI's RecipeViewingScreen. * Represents an accessor to REI's RecipeViewingScreen.
* *
* @author LambdAurora * @author LambdAurora
* @version 1.2.0 * @version 1.3.0
* @since 1.2.0 * @since 1.2.0
*/ */
@Mixin(RecipeViewingScreen.class) @Mixin(RecipeViewingScreen.class)
public interface RecipeViewingScreenAccessor public interface RecipeViewingScreenAccessor
{ {
@Accessor("categoryBack") @Accessor("categoryBack")
ButtonWidget getCategoryBack(); Button getCategoryBack();
@Accessor("categoryNext") @Accessor("categoryNext")
ButtonWidget getCategoryNext(); Button getCategoryNext();
} }

View File

@@ -14,6 +14,8 @@ import net.minecraft.client.MinecraftClient;
import net.minecraft.client.options.GameOptions; import net.minecraft.client.options.GameOptions;
import net.minecraft.client.options.KeyBinding; import net.minecraft.client.options.KeyBinding;
import net.minecraft.client.resource.language.I18n; import net.minecraft.client.resource.language.I18n;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import org.aperlambda.lambdacommon.Identifier; import org.aperlambda.lambdacommon.Identifier;
import org.aperlambda.lambdacommon.utils.Nameable; import org.aperlambda.lambdacommon.utils.Nameable;
import org.aperlambda.lambdacommon.utils.function.PairPredicate; import org.aperlambda.lambdacommon.utils.function.PairPredicate;
@@ -31,7 +33,7 @@ import static org.lwjgl.glfw.GLFW.*;
* Represents a button binding. * Represents a button binding.
* *
* @author LambdAurora * @author LambdAurora
* @version 1.1.0 * @version 1.3.0
* @since 1.0.0 * @since 1.0.0
*/ */
public class ButtonBinding implements Nameable public class ButtonBinding implements Nameable
@@ -320,64 +322,63 @@ public class ButtonBinding implements Nameable
* @param button The button. * @param button The button.
* @return The localized name of the button. * @return The localized name of the button.
*/ */
public static @NotNull public static @NotNull Text getLocalizedButtonName(int button)
String getLocalizedButtonName(int button)
{ {
switch (button % 500) { switch (button % 500) {
case -1: case -1:
return I18n.translate("key.keyboard.unknown"); return new TranslatableText("key.keyboard.unknown");
case GLFW_GAMEPAD_BUTTON_A: case GLFW_GAMEPAD_BUTTON_A:
return I18n.translate("lambdacontrols.button.a"); return new TranslatableText("lambdacontrols.button.a");
case GLFW_GAMEPAD_BUTTON_B: case GLFW_GAMEPAD_BUTTON_B:
return I18n.translate("lambdacontrols.button.b"); return new TranslatableText("lambdacontrols.button.b");
case GLFW_GAMEPAD_BUTTON_X: case GLFW_GAMEPAD_BUTTON_X:
return I18n.translate("lambdacontrols.button.x"); return new TranslatableText("lambdacontrols.button.x");
case GLFW_GAMEPAD_BUTTON_Y: case GLFW_GAMEPAD_BUTTON_Y:
return I18n.translate("lambdacontrols.button.y"); return new TranslatableText("lambdacontrols.button.y");
case GLFW_GAMEPAD_BUTTON_LEFT_BUMPER: case GLFW_GAMEPAD_BUTTON_LEFT_BUMPER:
return I18n.translate("lambdacontrols.button.left_bumper"); return new TranslatableText("lambdacontrols.button.left_bumper");
case GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER: case GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER:
return I18n.translate("lambdacontrols.button.right_bumper"); return new TranslatableText("lambdacontrols.button.right_bumper");
case GLFW_GAMEPAD_BUTTON_BACK: case GLFW_GAMEPAD_BUTTON_BACK:
return I18n.translate("lambdacontrols.button.back"); return new TranslatableText("lambdacontrols.button.back");
case GLFW_GAMEPAD_BUTTON_START: case GLFW_GAMEPAD_BUTTON_START:
return I18n.translate("lambdacontrols.button.start"); return new TranslatableText("lambdacontrols.button.start");
case GLFW_GAMEPAD_BUTTON_GUIDE: case GLFW_GAMEPAD_BUTTON_GUIDE:
return I18n.translate("lambdacontrols.button.guide"); return new TranslatableText("lambdacontrols.button.guide");
case GLFW_GAMEPAD_BUTTON_LEFT_THUMB: case GLFW_GAMEPAD_BUTTON_LEFT_THUMB:
return I18n.translate("lambdacontrols.button.left_thumb"); return new TranslatableText("lambdacontrols.button.left_thumb");
case GLFW_GAMEPAD_BUTTON_RIGHT_THUMB: case GLFW_GAMEPAD_BUTTON_RIGHT_THUMB:
return I18n.translate("lambdacontrols.button.right_thumb"); return new TranslatableText("lambdacontrols.button.right_thumb");
case GLFW_GAMEPAD_BUTTON_DPAD_UP: case GLFW_GAMEPAD_BUTTON_DPAD_UP:
return I18n.translate("lambdacontrols.button.dpad_up"); return new TranslatableText("lambdacontrols.button.dpad_up");
case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT: case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT:
return I18n.translate("lambdacontrols.button.dpad_right"); return new TranslatableText("lambdacontrols.button.dpad_right");
case GLFW_GAMEPAD_BUTTON_DPAD_DOWN: case GLFW_GAMEPAD_BUTTON_DPAD_DOWN:
return I18n.translate("lambdacontrols.button.dpad_down"); return new TranslatableText("lambdacontrols.button.dpad_down");
case GLFW_GAMEPAD_BUTTON_DPAD_LEFT: case GLFW_GAMEPAD_BUTTON_DPAD_LEFT:
return I18n.translate("lambdacontrols.button.dpad_left"); return new TranslatableText("lambdacontrols.button.dpad_left");
case 100: case 100:
return I18n.translate("lambdacontrols.axis.left_x+"); return new TranslatableText("lambdacontrols.axis.left_x+");
case 101: case 101:
return I18n.translate("lambdacontrols.axis.left_y+"); return new TranslatableText("lambdacontrols.axis.left_y+");
case 102: case 102:
return I18n.translate("lambdacontrols.axis.right_x+"); return new TranslatableText("lambdacontrols.axis.right_x+");
case 103: case 103:
return I18n.translate("lambdacontrols.axis.right_y+"); return new TranslatableText("lambdacontrols.axis.right_y+");
case 104: case 104:
return I18n.translate("lambdacontrols.axis.left_trigger"); return new TranslatableText("lambdacontrols.axis.left_trigger");
case 105: case 105:
return I18n.translate("lambdacontrols.axis.right_trigger"); return new TranslatableText("lambdacontrols.axis.right_trigger");
case 200: case 200:
return I18n.translate("lambdacontrols.axis.left_x-"); return new TranslatableText("lambdacontrols.axis.left_x-");
case 201: case 201:
return I18n.translate("lambdacontrols.axis.left_y-"); return new TranslatableText("lambdacontrols.axis.left_y-");
case 202: case 202:
return I18n.translate("lambdacontrols.axis.right_x-"); return new TranslatableText("lambdacontrols.axis.right_x-");
case 203: case 203:
return I18n.translate("lambdacontrols.axis.right_y-"); return new TranslatableText("lambdacontrols.axis.right_y-");
default: default:
return I18n.translate("lambdacontrols.button.unknown", button); return new TranslatableText("lambdacontrols.button.unknown", button);
} }
} }

View File

@@ -13,18 +13,18 @@ import me.lambdaurora.lambdacontrols.client.ButtonState;
import me.lambdaurora.lambdacontrols.client.mixin.AdvancementsScreenAccessor; import me.lambdaurora.lambdacontrols.client.mixin.AdvancementsScreenAccessor;
import me.lambdaurora.lambdacontrols.client.mixin.CreativeInventoryScreenAccessor; import me.lambdaurora.lambdacontrols.client.mixin.CreativeInventoryScreenAccessor;
import me.lambdaurora.lambdacontrols.client.mixin.RecipeBookWidgetAccessor; import me.lambdaurora.lambdacontrols.client.mixin.RecipeBookWidgetAccessor;
import me.lambdaurora.lambdacontrols.client.util.ContainerScreenAccessor; import me.lambdaurora.lambdacontrols.client.util.HandledScreenAccessor;
import me.lambdaurora.lambdacontrols.client.util.KeyBindingAccessor; import me.lambdaurora.lambdacontrols.client.util.KeyBindingAccessor;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.advancement.AdvancementTab; import net.minecraft.client.gui.screen.advancement.AdvancementTab;
import net.minecraft.client.gui.screen.advancement.AdvancementsScreen; import net.minecraft.client.gui.screen.advancement.AdvancementsScreen;
import net.minecraft.client.gui.screen.ingame.ContainerScreen;
import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen; import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
import net.minecraft.client.gui.screen.ingame.HandledScreen;
import net.minecraft.client.gui.screen.ingame.InventoryScreen; import net.minecraft.client.gui.screen.ingame.InventoryScreen;
import net.minecraft.client.gui.screen.recipebook.RecipeGroupButtonWidget; import net.minecraft.client.gui.screen.recipebook.RecipeGroupButtonWidget;
import net.minecraft.client.util.ScreenshotUtils; import net.minecraft.client.util.ScreenshotUtils;
import net.minecraft.container.Slot;
import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemGroup;
import net.minecraft.screen.slot.Slot;
import org.aperlambda.lambdacommon.utils.Pair; import org.aperlambda.lambdacommon.utils.Pair;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -38,7 +38,7 @@ import java.util.stream.Collectors;
* Represents some input handlers. * Represents some input handlers.
* *
* @author LambdAurora * @author LambdAurora
* @version 1.2.0 * @version 1.3.0
* @since 1.1.0 * @since 1.1.0
*/ */
public class InputHandlers public class InputHandlers
@@ -109,8 +109,8 @@ public class InputHandlers
// If in game, then pause the game. // If in game, then pause the game.
if (client.currentScreen == null) if (client.currentScreen == null)
client.openPauseMenu(false); client.openPauseMenu(false);
else if (client.currentScreen instanceof ContainerScreen && client.player != null) // If the current screen is a container then close it. else if (client.currentScreen instanceof HandledScreen && client.player != null) // If the current screen is a container then close it.
client.player.closeContainer(); client.player.closeHandledScreen();
else // Else just close the current screen. else // Else just close the current screen.
client.currentScreen.onClose(); client.currentScreen.onClose();
} }
@@ -145,11 +145,11 @@ public class InputHandlers
public static PressAction handleInventorySlotPad(int direction) public static PressAction handleInventorySlotPad(int direction)
{ {
return (client, binding, action) -> { return (client, binding, action) -> {
if (!(client.currentScreen instanceof ContainerScreen && action != ButtonState.RELEASE)) if (!(client.currentScreen instanceof HandledScreen && action != ButtonState.RELEASE))
return false; return false;
ContainerScreen inventory = (ContainerScreen) client.currentScreen; HandledScreen inventory = (HandledScreen) client.currentScreen;
ContainerScreenAccessor accessor = (ContainerScreenAccessor) inventory; HandledScreenAccessor accessor = (HandledScreenAccessor) inventory;
int guiLeft = accessor.getX(); int guiLeft = accessor.getX();
int guiTop = accessor.getY(); int guiTop = accessor.getY();
double mouseX = client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth(); double mouseX = client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth();
@@ -159,17 +159,17 @@ public class InputHandlers
Slot mouseSlot = accessor.lambdacontrols_getSlotAt(mouseX, mouseY); Slot mouseSlot = accessor.lambdacontrols_getSlotAt(mouseX, mouseY);
// Finds the closest slot in the GUI within 14 pixels. // Finds the closest slot in the GUI within 14 pixels.
Optional<Slot> closestSlot = inventory.getContainer().slots.parallelStream() Optional<Slot> closestSlot = inventory.getScreenHandler().slots.parallelStream()
.filter(Predicate.isEqual(mouseSlot).negate()) .filter(Predicate.isEqual(mouseSlot).negate())
.map(slot -> { .map(slot -> {
int posX = guiLeft + slot.xPosition + 8; int posX = guiLeft + slot.x + 8;
int posY = guiTop + slot.yPosition + 8; int posY = guiTop + slot.y + 8;
int otherPosX = (int) mouseX; int otherPosX = (int) mouseX;
int otherPosY = (int) mouseY; int otherPosY = (int) mouseY;
if (mouseSlot != null) { if (mouseSlot != null) {
otherPosX = guiLeft + mouseSlot.xPosition + 8; otherPosX = guiLeft + mouseSlot.x + 8;
otherPosY = guiTop + mouseSlot.yPosition + 8; otherPosY = guiTop + mouseSlot.y + 8;
} }
// Distance between the slot and the cursor. // Distance between the slot and the cursor.
@@ -177,13 +177,13 @@ public class InputHandlers
return Pair.of(slot, distance); return Pair.of(slot, distance);
}).filter(entry -> { }).filter(entry -> {
Slot slot = entry.key; Slot slot = entry.key;
int posX = guiLeft + slot.xPosition + 8; int posX = guiLeft + slot.x + 8;
int posY = guiTop + slot.yPosition + 8; int posY = guiTop + slot.y + 8;
int otherPosX = (int) mouseX; int otherPosX = (int) mouseX;
int otherPosY = (int) mouseY; int otherPosY = (int) mouseY;
if (mouseSlot != null) { if (mouseSlot != null) {
otherPosX = guiLeft + mouseSlot.xPosition + 8; otherPosX = guiLeft + mouseSlot.x + 8;
otherPosY = guiTop + mouseSlot.yPosition + 8; otherPosY = guiTop + mouseSlot.y + 8;
} }
if (direction == 0) if (direction == 0)
return posY < otherPosY; return posY < otherPosY;
@@ -201,8 +201,8 @@ public class InputHandlers
if (closestSlot.isPresent()) { if (closestSlot.isPresent()) {
Slot slot = closestSlot.get(); Slot slot = closestSlot.get();
int x = guiLeft + slot.xPosition + 8; int x = guiLeft + slot.x + 8;
int y = guiTop + slot.yPosition + 8; int y = guiTop + slot.y + 8;
InputManager.queueMousePosition(x * (double) client.getWindow().getWidth() / (double) client.getWindow().getScaledWidth(), InputManager.queueMousePosition(x * (double) client.getWindow().getWidth() / (double) client.getWindow().getScaledWidth(),
y * (double) client.getWindow().getHeight() / (double) client.getWindow().getScaledHeight()); y * (double) client.getWindow().getHeight() / (double) client.getWindow().getScaledHeight());
return true; return true;
@@ -244,7 +244,7 @@ public class InputHandlers
*/ */
public static boolean inInventory(@NotNull MinecraftClient client, @NotNull ButtonBinding binding) public static boolean inInventory(@NotNull MinecraftClient client, @NotNull ButtonBinding binding)
{ {
return client.currentScreen instanceof ContainerScreen; return client.currentScreen instanceof HandledScreen;
} }
/** /**

View File

@@ -15,6 +15,8 @@ import me.lambdaurora.lambdacontrols.client.LambdaControlsClient;
import me.lambdaurora.lambdacontrols.client.LambdaControlsConfig; import me.lambdaurora.lambdacontrols.client.LambdaControlsConfig;
import me.lambdaurora.lambdacontrols.client.util.MouseAccessor; import me.lambdaurora.lambdacontrols.client.util.MouseAccessor;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.options.KeyBinding;
import net.minecraft.client.util.InputUtil;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import org.aperlambda.lambdacommon.Identifier; import org.aperlambda.lambdacommon.Identifier;
import org.aperlambda.lambdacommon.utils.function.PairPredicate; import org.aperlambda.lambdacommon.utils.function.PairPredicate;
@@ -30,7 +32,7 @@ import java.util.stream.Stream;
* Represents an input manager for controllers. * Represents an input manager for controllers.
* *
* @author LambdAurora * @author LambdAurora
* @version 1.2.0 * @version 1.3.0
* @since 1.1.0 * @since 1.1.0
*/ */
public class InputManager public class InputManager
@@ -358,4 +360,34 @@ public class InputManager
{ {
return CATEGORIES.stream(); return CATEGORIES.stream();
} }
/**
* Returns a new key binding instance.
* @param id The identifier of the key binding.
* @param type The type.
* @param code The code.
* @param category The category of the key binding.
* @return The key binding.
*
* @see #makeKeyBinding(Identifier, InputUtil.Type, int, String)
*/
public static @NotNull KeyBinding makeKeyBinding(@NotNull net.minecraft.util.Identifier id, InputUtil.Type type, int code, @NotNull String category)
{
return makeKeyBinding(new Identifier(id.getNamespace(), id.getPath()), type, code, category);
}
/**
* Returns a new key binding instance.
* @param id The identifier of the key binding.
* @param type The type.
* @param code The code.
* @param category The category of the key binding.
* @return The key binding.
*
* @see #makeKeyBinding(net.minecraft.util.Identifier, InputUtil.Type, int, String)
*/
public static @NotNull KeyBinding makeKeyBinding(@NotNull Identifier id, InputUtil.Type type, int code, @NotNull String category)
{
return new KeyBinding(String.format("key.%s.%s", id.getNamespace(), id.getName()), type, code, category);
}
} }

View File

@@ -9,10 +9,13 @@
package me.lambdaurora.lambdacontrols.client.gui; package me.lambdaurora.lambdacontrols.client.gui;
import me.lambdaurora.lambdacontrols.LambdaControls;
import me.lambdaurora.lambdacontrols.client.controller.ButtonBinding; import me.lambdaurora.lambdacontrols.client.controller.ButtonBinding;
import me.lambdaurora.spruceui.AbstractIconButtonWidget; import me.lambdaurora.spruceui.AbstractIconButtonWidget;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.resource.language.I18n; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.LiteralText;
import net.minecraft.text.Text;
import org.aperlambda.lambdacommon.utils.Pair; import org.aperlambda.lambdacommon.utils.Pair;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -33,25 +36,25 @@ public class ControllerButtonWidget extends AbstractIconButtonWidget
public void update() public void update()
{ {
int length = binding.getButton().length; int length = binding.getButton().length;
this.setMessage(this.binding.isNotBound() ? I18n.translate("lambdacontrols.not_bound") : this.setMessage(this.binding.isNotBound() ? LambdaControls.NOT_BOUND_TEXT :
(length > 0 ? ButtonBinding.getLocalizedButtonName(binding.getButton()[0]) : "<>")); (length > 0 ? ButtonBinding.getLocalizedButtonName(binding.getButton()[0]) : new LiteralText("<>")));
} }
@Override @Override
public String getMessage() public Text getMessage()
{ {
if (this.binding.getButton().length > 1) if (this.binding.getButton().length > 1)
return ""; return LiteralText.EMPTY;
return super.getMessage(); return super.getMessage();
} }
@Override @Override
protected int renderIcon(int mouseX, int mouseY, float delta, int x, int y) protected int renderIcon(MatrixStack matrices, int mouseX, int mouseY, float delta, int x, int y)
{ {
if (this.binding.getButton().length > 1) { if (this.binding.getButton().length > 1) {
x += (this.width / 2 - this.iconWidth / 2) - 4; x += (this.width / 2 - this.iconWidth / 2) - 4;
} }
Pair<Integer, Integer> size = LambdaControlsRenderer.drawButton(x, y, this.binding, MinecraftClient.getInstance()); Pair<Integer, Integer> size = LambdaControlsRenderer.drawButton(matrices, x, y, this.binding, MinecraftClient.getInstance());
this.iconWidth = size.key; this.iconWidth = size.key;
return size.value; return size.value;
} }

View File

@@ -16,7 +16,7 @@ import me.lambdaurora.spruceui.SpruceButtonWidget;
import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.options.ControlsOptionsScreen; import net.minecraft.client.gui.screen.options.ControlsOptionsScreen;
import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.resource.language.I18n; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.TranslatableText; import net.minecraft.text.TranslatableText;
import org.aperlambda.lambdacommon.utils.function.Predicates; import org.aperlambda.lambdacommon.utils.function.Predicates;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -56,26 +56,30 @@ public class ControllerControlsScreen extends Screen
@Override @Override
protected void init() protected void init()
{ {
this.addButton(new SpruceButtonWidget(this.width / 2 - 155, 18, this.hideSettings ? 310 : 150, 20, I18n.translate("lambdacontrols.menu.keyboard_controls"), this.addButton(new SpruceButtonWidget(this.width / 2 - 155, 18, this.hideSettings ? 310 : 150, 20,
btn -> this.minecraft.openScreen(new ControlsOptionsScreen(this, this.minecraft.options)))); new TranslatableText("lambdacontrols.menu.keyboard_controls"),
btn -> this.client.openScreen(new ControlsOptionsScreen(this, this.client.options))));
if (!this.hideSettings) if (!this.hideSettings)
this.addButton(new SpruceButtonWidget(this.width / 2 - 155 + 160, 18, 150, 20, I18n.translate("menu.options"), this.addButton(new SpruceButtonWidget(this.width / 2 - 155 + 160, 18, 150, 20,
btn -> this.minecraft.openScreen(new LambdaControlsSettingsScreen(this, true)))); new TranslatableText("menu.options"),
this.bindingsListWidget = new ControlsListWidget(this, this.minecraft); btn -> this.client.openScreen(new LambdaControlsSettingsScreen(this, true))));
this.bindingsListWidget = new ControlsListWidget(this, this.client);
this.children.add(this.bindingsListWidget); this.children.add(this.bindingsListWidget);
this.resetButton = this.addButton(new ButtonWidget(this.width / 2 - 155, this.height - 29, 150, 20, I18n.translate("controls.resetAll"), this.resetButton = this.addButton(new ButtonWidget(this.width / 2 - 155, this.height - 29, 150, 20,
new TranslatableText("controls.resetAll"),
btn -> InputManager.streamBindings().forEach(binding -> this.mod.config.setButtonBinding(binding, binding.getDefaultButton())))); btn -> InputManager.streamBindings().forEach(binding -> this.mod.config.setButtonBinding(binding, binding.getDefaultButton()))));
this.addButton(new ButtonWidget(this.width / 2 - 155 + 160, this.height - 29, 150, 20, I18n.translate("gui.done"), this.addButton(new ButtonWidget(this.width / 2 - 155 + 160, this.height - 29, 150, 20,
btn -> this.minecraft.openScreen(this.parent))); new TranslatableText("gui.done"),
btn -> this.client.openScreen(this.parent)));
} }
@Override @Override
public void render(int mouseX, int mouseY, float delta) public void render(MatrixStack matrices, int mouseX, int mouseY, float delta)
{ {
this.renderBackground(); this.renderBackground(matrices);
this.bindingsListWidget.render(mouseX, mouseY, delta); this.bindingsListWidget.render(matrices, mouseX, mouseY, delta);
this.drawCenteredString(this.font, this.title.asFormattedString(), this.width / 2, 8, 16777215); this.drawCenteredText(matrices, this.textRenderer, this.title, this.width / 2, 8, 16777215);
this.resetButton.active = InputManager.streamBindings().anyMatch(Predicates.not(ButtonBinding::isDefault)); this.resetButton.active = InputManager.streamBindings().anyMatch(Predicates.not(ButtonBinding::isDefault));
super.render(mouseX, mouseY, delta); super.render(matrices, mouseX, mouseY, delta);
} }
} }

View File

@@ -20,6 +20,10 @@ import net.minecraft.client.gui.Element;
import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.ElementListWidget; import net.minecraft.client.gui.widget.ElementListWidget;
import net.minecraft.client.resource.language.I18n; import net.minecraft.client.resource.language.I18n;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.LiteralText;
import net.minecraft.text.MutableText;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Formatting; import net.minecraft.util.Formatting;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -48,7 +52,7 @@ public class ControlsListWidget extends ElementListWidget<ControlsListWidget.Ent
this.addEntry(new CategoryEntry(category)); this.addEntry(new CategoryEntry(category));
category.getBindings().forEach(binding -> { category.getBindings().forEach(binding -> {
int i = client.textRenderer.getStringWidth(I18n.translate(binding.getTranslationKey())); int i = client.textRenderer.getWidth(I18n.translate(binding.getTranslationKey()));
if (i > this.field_2733) { if (i > this.field_2733) {
this.field_2733 = i; this.field_2733 = i;
} }
@@ -59,9 +63,9 @@ public class ControlsListWidget extends ElementListWidget<ControlsListWidget.Ent
} }
@Override @Override
protected int getScrollbarPosition() protected int getScrollbarPositionX()
{ {
return super.getScrollbarPosition() + 15; return super.getScrollbarPositionX() + 15;
} }
@Override @Override
@@ -88,28 +92,28 @@ public class ControlsListWidget extends ElementListWidget<ControlsListWidget.Ent
gui.waiting = true; gui.waiting = true;
}) })
{ {
protected String getNarrationMessage() protected MutableText getNarrationMessage()
{ {
return binding.isNotBound() ? I18n.translate("narrator.controls.unbound", bindingName) : I18n.translate("narrator.controls.bound", bindingName, super.getNarrationMessage()); return binding.isNotBound() ? new TranslatableText("narrator.controls.unbound", bindingName) : new TranslatableText("narrator.controls.bound", bindingName, super.getNarrationMessage());
} }
}; };
this.resetButton = new ButtonWidget(0, 0, 50, 20, I18n.translate("controls.reset"), this.resetButton = new ButtonWidget(0, 0, 50, 20, new TranslatableText("controls.reset"),
btn -> gui.mod.config.setButtonBinding(binding, binding.getDefaultButton())) btn -> gui.mod.config.setButtonBinding(binding, binding.getDefaultButton()))
{ {
protected String getNarrationMessage() protected MutableText getNarrationMessage()
{ {
return I18n.translate("narrator.controls.reset", bindingName); return new TranslatableText("narrator.controls.reset", bindingName);
} }
}; };
this.unboundButton = new ButtonWidget(0, 0, 50, 20, I18n.translate("lambdacontrols.menu.unbound"), this.unboundButton = new ButtonWidget(0, 0, 50, 20, new TranslatableText("lambdacontrols.menu.unbound"),
btn -> { btn -> {
gui.mod.config.setButtonBinding(binding, UNBOUND); gui.mod.config.setButtonBinding(binding, UNBOUND);
gui.focusedBinding = null; gui.focusedBinding = null;
}) })
{ {
protected String getNarrationMessage() protected MutableText getNarrationMessage()
{ {
return I18n.translate("lambdacontrols.narrator.unbound", bindingName); return new TranslatableText("lambdacontrols.narrator.unbound", bindingName);
} }
}; };
} }
@@ -121,34 +125,38 @@ public class ControlsListWidget extends ElementListWidget<ControlsListWidget.Ent
} }
@Override @Override
public void render(int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean hovering, float delta) public void render(MatrixStack matrices, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean hovering, float delta)
{ {
boolean focused = gui.focusedBinding == this.binding; boolean focused = gui.focusedBinding == this.binding;
TextRenderer textRenderer = ControlsListWidget.this.minecraft.textRenderer; TextRenderer textRenderer = ControlsListWidget.this.client.textRenderer;
String bindingName = this.bindingName; String bindingName = this.bindingName;
float var10002 = (float) (x + 70 - ControlsListWidget.this.field_2733); float var10002 = (float) (x + 70 - ControlsListWidget.this.field_2733);
int var10003 = y + height / 2; int var10003 = y + height / 2;
textRenderer.draw(bindingName, var10002, (float) (var10003 - 9 / 2), 16777215); textRenderer.draw(matrices, bindingName, var10002, (float) (var10003 - 9 / 2), 16777215);
this.resetButton.x = this.unboundButton.x = x + 190; this.resetButton.x = this.unboundButton.x = x + 190;
this.resetButton.y = this.unboundButton.y = y; this.resetButton.y = this.unboundButton.y = y;
this.resetButton.active = !this.binding.isDefault(); this.resetButton.active = !this.binding.isDefault();
if (focused) if (focused)
this.unboundButton.render(mouseX, mouseY, delta); this.unboundButton.render(matrices, mouseX, mouseY, delta);
else else
this.resetButton.render(mouseX, mouseY, delta); this.resetButton.render(matrices, mouseX, mouseY, delta);
this.editButton.x = x + 75; this.editButton.x = x + 75;
this.editButton.y = y; this.editButton.y = y;
this.editButton.update(); this.editButton.update();
if (focused) { if (focused) {
this.editButton.setMessage(Formatting.WHITE + "> " + Formatting.YELLOW + this.editButton.getMessage() + Formatting.WHITE + " <"); MutableText text = new LiteralText("> ").formatted(Formatting.WHITE);
text.append(this.editButton.getMessage().copy().formatted(Formatting.YELLOW));
this.editButton.setMessage(text.append(new LiteralText(" <").formatted(Formatting.WHITE)));
} else if (!this.binding.isNotBound() && InputManager.hasDuplicatedBindings(this.binding)) { } else if (!this.binding.isNotBound() && InputManager.hasDuplicatedBindings(this.binding)) {
this.editButton.setMessage(Formatting.RED + this.editButton.getMessage()); MutableText text = this.editButton.getMessage().copy();
this.editButton.setMessage(text.formatted(Formatting.RED));
} else if (this.binding.isNotBound()) { } else if (this.binding.isNotBound()) {
this.editButton.setMessage(Formatting.GOLD + this.editButton.getMessage()); MutableText text = this.editButton.getMessage().copy();
this.editButton.setMessage(text.formatted(Formatting.GOLD));
} }
this.editButton.render(mouseX, mouseY, delta); this.editButton.render(matrices, mouseX, mouseY, delta);
} }
public boolean mouseClicked(double mouseX, double mouseY, int button) public boolean mouseClicked(double mouseX, double mouseY, int button)
@@ -175,13 +183,13 @@ public class ControlsListWidget extends ElementListWidget<ControlsListWidget.Ent
public CategoryEntry(@NotNull ButtonCategory category) public CategoryEntry(@NotNull ButtonCategory category)
{ {
this.name = category.getTranslatedName(); this.name = category.getTranslatedName();
this.nameWidth = ControlsListWidget.this.minecraft.textRenderer.getStringWidth(this.name); this.nameWidth = ControlsListWidget.this.client.textRenderer.getWidth(this.name);
} }
@Override @Override
public void render(int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean hovering, float delta) public void render(MatrixStack matrices, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean hovering, float delta)
{ {
ControlsListWidget.this.minecraft.textRenderer.draw(this.name, (float) (ControlsListWidget.this.minecraft.currentScreen.width / 2 - this.nameWidth / 2), ControlsListWidget.this.client.textRenderer.draw(matrices, this.name, (float) (ControlsListWidget.this.client.currentScreen.width / 2 - this.nameWidth / 2),
(float) ((y + height) - 9 - 1), 16777215); (float) ((y + height) - 9 - 1), 16777215);
} }

View File

@@ -17,11 +17,8 @@ import me.lambdaurora.lambdacontrols.client.LambdaInput;
import me.lambdaurora.lambdacontrols.client.controller.ButtonBinding; import me.lambdaurora.lambdacontrols.client.controller.ButtonBinding;
import me.lambdaurora.spruceui.hud.Hud; import me.lambdaurora.spruceui.hud.Hud;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.Tessellator;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.resource.language.I18n; import net.minecraft.client.resource.language.I18n;
import net.minecraft.client.util.math.Matrix4f; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.client.util.math.Rotation3;
import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
@@ -34,7 +31,7 @@ import org.jetbrains.annotations.Nullable;
* Represents the LambdaControls HUD. * Represents the LambdaControls HUD.
* *
* @author LambdAurora * @author LambdAurora
* @version 1.2.0 * @version 1.3.0
* @since 1.0.0 * @since 1.0.0
*/ */
public class LambdaControlsHud extends Hud public class LambdaControlsHud extends Hud
@@ -79,26 +76,24 @@ public class LambdaControlsHud extends Hud
/** /**
* Renders the LambdaControls' HUD. * Renders the LambdaControls' HUD.
*/ */
public void render(float tickDelta) @Override
public void render(MatrixStack matrices, float tickDelta)
{ {
if (this.mod.config.getControlsMode() == ControlsMode.CONTROLLER && this.client.currentScreen == null) { if (this.mod.config.getControlsMode() == ControlsMode.CONTROLLER && this.client.currentScreen == null) {
int y = bottom(2); int y = bottom(2);
this.renderFirstIcons(this.mod.config.getHudSide() == HudSide.LEFT ? 2 : client.getWindow().getScaledWidth() - 2, y); this.renderFirstIcons(matrices, this.mod.config.getHudSide() == HudSide.LEFT ? 2 : client.getWindow().getScaledWidth() - 2, y);
this.renderSecondIcons(this.mod.config.getHudSide() == HudSide.RIGHT ? 2 : client.getWindow().getScaledWidth() - 2, y); this.renderSecondIcons(matrices, this.mod.config.getHudSide() == HudSide.RIGHT ? 2 : client.getWindow().getScaledWidth() - 2, y);
VertexConsumerProvider.Immediate immediate = VertexConsumerProvider.immediate(Tessellator.getInstance().getBuffer()); this.renderFirstSection(matrices, this.mod.config.getHudSide() == HudSide.LEFT ? 2 : client.getWindow().getScaledWidth() - 2, y);
Matrix4f matrix4f = Rotation3.identity().getMatrix(); this.renderSecondSection(matrices, this.mod.config.getHudSide() == HudSide.RIGHT ? 2 : client.getWindow().getScaledWidth() - 2, y);
this.renderFirstSection(this.mod.config.getHudSide() == HudSide.LEFT ? 2 : client.getWindow().getScaledWidth() - 2, y, immediate, matrix4f);
this.renderSecondSection(this.mod.config.getHudSide() == HudSide.RIGHT ? 2 : client.getWindow().getScaledWidth() - 2, y, immediate, matrix4f);
immediate.draw();
} }
} }
public void renderFirstIcons(int x, int y) public void renderFirstIcons(MatrixStack matrices, int x, int y)
{ {
int offset = 2 + this.inventoryWidth + this.inventoryButtonWidth + 4; int offset = 2 + this.inventoryWidth + this.inventoryButtonWidth + 4;
int currentX = this.mod.config.getHudSide() == HudSide.LEFT ? x : x - this.inventoryButtonWidth; int currentX = this.mod.config.getHudSide() == HudSide.LEFT ? x : x - this.inventoryButtonWidth;
this.drawButton(currentX, y, ButtonBinding.INVENTORY, true); this.drawButton(matrices, currentX, y, ButtonBinding.INVENTORY, true);
this.drawButton(currentX += (this.mod.config.getHudSide() == HudSide.LEFT ? offset : -offset), y, ButtonBinding.SWAP_HANDS, true); this.drawButton(matrices, currentX += (this.mod.config.getHudSide() == HudSide.LEFT ? offset : -offset), y, ButtonBinding.SWAP_HANDS, true);
offset = 2 + this.swapHandsWidth + this.dropItemButtonWidth + 4; offset = 2 + this.swapHandsWidth + this.dropItemButtonWidth + 4;
if (this.client.options.showSubtitles && this.mod.config.getHudSide() == HudSide.RIGHT) { if (this.client.options.showSubtitles && this.mod.config.getHudSide() == HudSide.RIGHT) {
currentX += -offset; currentX += -offset;
@@ -106,17 +101,17 @@ public class LambdaControlsHud extends Hud
currentX = this.mod.config.getHudSide() == HudSide.LEFT ? x : x - this.dropItemButtonWidth; currentX = this.mod.config.getHudSide() == HudSide.LEFT ? x : x - this.dropItemButtonWidth;
y -= 24; y -= 24;
} }
this.drawButton(currentX, y, ButtonBinding.DROP_ITEM, !this.client.player.getMainHandStack().isEmpty()); this.drawButton(matrices, currentX, y, ButtonBinding.DROP_ITEM, !this.client.player.getMainHandStack().isEmpty());
} }
public void renderSecondIcons(int x, int y) public void renderSecondIcons(MatrixStack matrices, int x, int y)
{ {
int offset; int offset;
int currentX = x; int currentX = x;
if (!this.placeAction.isEmpty()) { if (!this.placeAction.isEmpty()) {
if (this.mod.config.getHudSide() == HudSide.LEFT) if (this.mod.config.getHudSide() == HudSide.LEFT)
currentX -= this.useButtonWidth; currentX -= this.useButtonWidth;
this.drawButton(currentX, y, ButtonBinding.USE, true); this.drawButton(matrices, currentX, y, ButtonBinding.USE, true);
offset = 2 + this.useWidth + 4; offset = 2 + this.useWidth + 4;
if (this.client.options.showSubtitles && this.mod.config.getHudSide() == HudSide.LEFT) { if (this.client.options.showSubtitles && this.mod.config.getHudSide() == HudSide.LEFT) {
currentX -= offset; currentX -= offset;
@@ -129,33 +124,33 @@ public class LambdaControlsHud extends Hud
if (this.mod.config.getHudSide() == HudSide.LEFT) if (this.mod.config.getHudSide() == HudSide.LEFT)
currentX -= this.attackButtonWidth; currentX -= this.attackButtonWidth;
this.drawButton(currentX, y, ButtonBinding.ATTACK, this.attackWidth != 0); this.drawButton(matrices, currentX, y, ButtonBinding.ATTACK, this.attackWidth != 0);
} }
public void renderFirstSection(int x, int y, @NotNull VertexConsumerProvider.Immediate immediate, @NotNull Matrix4f matrix4f) public void renderFirstSection(MatrixStack matrices, int x, int y)
{ {
int currentX = this.mod.config.getHudSide() == HudSide.LEFT ? x + this.inventoryButtonWidth + 2 : x - this.inventoryButtonWidth - 2 - this.inventoryWidth; int currentX = this.mod.config.getHudSide() == HudSide.LEFT ? x + this.inventoryButtonWidth + 2 : x - this.inventoryButtonWidth - 2 - this.inventoryWidth;
this.drawTip(currentX, y, ButtonBinding.INVENTORY, true, immediate, matrix4f); this.drawTip(matrices, currentX, y, ButtonBinding.INVENTORY, true);
currentX += this.mod.config.getHudSide() == HudSide.LEFT ? this.inventoryWidth + 4 + this.swapHandsButtonWidth + 2 currentX += this.mod.config.getHudSide() == HudSide.LEFT ? this.inventoryWidth + 4 + this.swapHandsButtonWidth + 2
: -this.swapHandsWidth - 2 - this.swapHandsButtonWidth - 4; : -this.swapHandsWidth - 2 - this.swapHandsButtonWidth - 4;
this.drawTip(currentX, y, ButtonBinding.SWAP_HANDS, true, immediate, matrix4f); this.drawTip(matrices, currentX, y, ButtonBinding.SWAP_HANDS, true);
if (this.client.options.showSubtitles && this.mod.config.getHudSide() == HudSide.RIGHT) { if (this.client.options.showSubtitles && this.mod.config.getHudSide() == HudSide.RIGHT) {
currentX += -this.dropItemWidth - 2 - this.dropItemButtonWidth - 4; currentX += -this.dropItemWidth - 2 - this.dropItemButtonWidth - 4;
} else { } else {
y -= 24; y -= 24;
currentX = this.mod.config.getHudSide() == HudSide.LEFT ? x + this.dropItemButtonWidth + 2 : x - this.dropItemButtonWidth - 2 - this.dropItemWidth; currentX = this.mod.config.getHudSide() == HudSide.LEFT ? x + this.dropItemButtonWidth + 2 : x - this.dropItemButtonWidth - 2 - this.dropItemWidth;
} }
this.drawTip(currentX, y, ButtonBinding.DROP_ITEM, !this.client.player.getMainHandStack().isEmpty(), immediate, matrix4f); this.drawTip(matrices, currentX, y, ButtonBinding.DROP_ITEM, !this.client.player.getMainHandStack().isEmpty());
} }
public void renderSecondSection(int x, int y, @NotNull VertexConsumerProvider.Immediate immediate, @NotNull Matrix4f matrix4f) public void renderSecondSection(MatrixStack matrices, int x, int y)
{ {
int currentX = x; int currentX = x;
if (!this.placeAction.isEmpty()) { if (!this.placeAction.isEmpty()) {
currentX += this.mod.config.getHudSide() == HudSide.RIGHT ? this.useButtonWidth + 2 : -this.useButtonWidth - 2 - this.useWidth; currentX += this.mod.config.getHudSide() == HudSide.RIGHT ? this.useButtonWidth + 2 : -this.useButtonWidth - 2 - this.useWidth;
this.drawTip(currentX, y, this.placeAction, true, immediate, matrix4f); this.drawTip(matrices, currentX, y, this.placeAction, true);
if (this.client.options.showSubtitles && this.mod.config.getHudSide() == HudSide.LEFT) { if (this.client.options.showSubtitles && this.mod.config.getHudSide() == HudSide.LEFT) {
currentX -= 4; currentX -= 4;
@@ -167,7 +162,7 @@ public class LambdaControlsHud extends Hud
currentX += this.mod.config.getHudSide() == HudSide.RIGHT ? this.attackButtonWidth + 2 : -this.attackButtonWidth - 2 - this.attackWidth; currentX += this.mod.config.getHudSide() == HudSide.RIGHT ? this.attackButtonWidth + 2 : -this.attackButtonWidth - 2 - this.attackWidth;
this.drawTip(currentX, y, this.attackAction, this.attackWidth != 0, immediate, matrix4f); this.drawTip(matrices, currentX, y, this.attackAction, this.attackWidth != 0);
} }
@Override @Override
@@ -236,27 +231,26 @@ public class LambdaControlsHud extends Hud
{ {
if (text == null || text.isEmpty()) if (text == null || text.isEmpty())
return 0; return 0;
return this.client.textRenderer.getStringWidth(I18n.translate(text)); return this.client.textRenderer.getWidth(I18n.translate(text));
} }
private void drawButton(int x, int y, @NotNull ButtonBinding button, boolean display) private void drawButton(MatrixStack matrices, int x, int y, @NotNull ButtonBinding button, boolean display)
{ {
if (display) if (display)
LambdaControlsRenderer.drawButton(x, y, button, this.client); LambdaControlsRenderer.drawButton(matrices, x, y, button, this.client);
} }
private void drawTip(int x, int y, @NotNull ButtonBinding button, boolean display, @NotNull VertexConsumerProvider.Immediate immediate, @NotNull Matrix4f matrix4f) private void drawTip(MatrixStack matrices, int x, int y, @NotNull ButtonBinding button, boolean display)
{ {
this.drawTip(x, y, button.getTranslationKey(), display, immediate, matrix4f); this.drawTip(matrices, x, y, button.getTranslationKey(), display);
} }
private void drawTip(int x, int y, @NotNull String action, boolean display, @NotNull VertexConsumerProvider.Immediate immediate, @NotNull Matrix4f matrix4f) private void drawTip(MatrixStack matrices, int x, int y, @NotNull String action, boolean display)
{ {
if (!display) if (!display)
return; return;
String translatedAction = I18n.translate(action); String translatedAction = I18n.translate(action);
int textY = (LambdaControlsRenderer.ICON_SIZE / 2 - this.client.textRenderer.fontHeight / 2) + 1; int textY = (LambdaControlsRenderer.ICON_SIZE / 2 - this.client.textRenderer.fontHeight / 2) + 1;
client.textRenderer.draw(translatedAction, (float) x, (float) (y + textY), 14737632, true, matrix4f, immediate, this.client.textRenderer.draw(matrices, translatedAction, (float) x, (float) (y + textY), 14737632);
false, 0, 15728880);
} }
} }

View File

@@ -12,14 +12,14 @@ package me.lambdaurora.lambdacontrols.client.gui;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import me.lambdaurora.lambdacontrols.client.LambdaControlsClient; import me.lambdaurora.lambdacontrols.client.LambdaControlsClient;
import me.lambdaurora.lambdacontrols.client.controller.ButtonBinding; import me.lambdaurora.lambdacontrols.client.controller.ButtonBinding;
import me.lambdaurora.lambdacontrols.client.util.ContainerScreenAccessor; import me.lambdaurora.lambdacontrols.client.util.HandledScreenAccessor;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer; import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.gui.DrawableHelper;
import net.minecraft.client.gui.screen.ingame.ContainerScreen; import net.minecraft.client.gui.screen.ingame.HandledScreen;
import net.minecraft.client.resource.language.I18n; import net.minecraft.client.resource.language.I18n;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.container.Slot; import net.minecraft.screen.slot.Slot;
import org.aperlambda.lambdacommon.utils.Pair; import org.aperlambda.lambdacommon.utils.Pair;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
@@ -31,7 +31,7 @@ import java.util.Optional;
* Represents the LambdaControls renderer. * Represents the LambdaControls renderer.
* *
* @author LambdAurora * @author LambdAurora
* @version 1.2.0 * @version 1.3.0
* @since 1.2.0 * @since 1.2.0
*/ */
public class LambdaControlsRenderer public class LambdaControlsRenderer
@@ -88,19 +88,19 @@ public class LambdaControlsRenderer
return width; return width;
} }
public static Pair<Integer, Integer> drawButton(int x, int y, @NotNull ButtonBinding button, @NotNull MinecraftClient client) public static Pair<Integer, Integer> drawButton(MatrixStack matrices, int x, int y, @NotNull ButtonBinding button, @NotNull MinecraftClient client)
{ {
return drawButton(x, y, button.getButton(), client); return drawButton(matrices, x, y, button.getButton(), client);
} }
public static Pair<Integer, Integer> drawButton(int x, int y, int[] buttons, @NotNull MinecraftClient client) public static Pair<Integer, Integer> drawButton(MatrixStack matrices, int x, int y, int[] buttons, @NotNull MinecraftClient client)
{ {
int height = 0; int height = 0;
int length = 0; int length = 0;
int currentX = x; int currentX = x;
for (int i = 0; i < buttons.length; i++) { for (int i = 0; i < buttons.length; i++) {
int btn = buttons[i]; int btn = buttons[i];
int size = drawButton(currentX, y, btn, client); int size = drawButton(matrices, currentX, y, btn, client);
if (size > height) if (size > height)
height = size; height = size;
length += size; length += size;
@@ -113,7 +113,7 @@ public class LambdaControlsRenderer
} }
@SuppressWarnings("deprecated") @SuppressWarnings("deprecated")
public static int drawButton(int x, int y, int button, @NotNull MinecraftClient client) public static int drawButton(MatrixStack matrices, int x, int y, int button, @NotNull MinecraftClient client)
{ {
boolean second = false; boolean second = false;
if (button == -1) if (button == -1)
@@ -196,7 +196,7 @@ public class LambdaControlsRenderer
int assetSize = axis ? AXIS_SIZE : BUTTON_SIZE; int assetSize = axis ? AXIS_SIZE : BUTTON_SIZE;
RenderSystem.color4f(1.0F, second ? 0.0F : 1.0F, 1.0F, 1.0F); RenderSystem.color4f(1.0F, second ? 0.0F : 1.0F, 1.0F, 1.0F);
DrawableHelper.blit(x + (ICON_SIZE / 2 - assetSize / 2), y + (ICON_SIZE / 2 - assetSize / 2), DrawableHelper.drawTexture(matrices, x + (ICON_SIZE / 2 - assetSize / 2), y + (ICON_SIZE / 2 - assetSize / 2),
(float) buttonOffset, (float) (controllerType * (axis ? AXIS_SIZE : BUTTON_SIZE)), (float) buttonOffset, (float) (controllerType * (axis ? AXIS_SIZE : BUTTON_SIZE)),
assetSize, assetSize, assetSize, assetSize,
256, 256); 256, 256);
@@ -205,20 +205,20 @@ public class LambdaControlsRenderer
return ICON_SIZE; return ICON_SIZE;
} }
public static int drawButtonTip(int x, int y, @NotNull ButtonBinding button, boolean display, @NotNull MinecraftClient client) public static int drawButtonTip(MatrixStack matrices, int x, int y, @NotNull ButtonBinding button, boolean display, @NotNull MinecraftClient client)
{ {
return drawButtonTip(x, y, button.getButton(), button.getTranslationKey(), display, client); return drawButtonTip(matrices, x, y, button.getButton(), button.getTranslationKey(), display, client);
} }
public static int drawButtonTip(int x, int y, int[] button, @NotNull String action, boolean display, @NotNull MinecraftClient client) public static int drawButtonTip(MatrixStack matrices, int x, int y, int[] button, @NotNull String action, boolean display, @NotNull MinecraftClient client)
{ {
if (display) { if (display) {
int buttonWidth = drawButton(x, y, button, client).key; int buttonWidth = drawButton(matrices, x, y, button, client).key;
String translatedAction = I18n.translate(action); String translatedAction = I18n.translate(action);
int textY = (LambdaControlsRenderer.ICON_SIZE / 2 - client.textRenderer.fontHeight / 2) + 1; int textY = (LambdaControlsRenderer.ICON_SIZE / 2 - client.textRenderer.fontHeight / 2) + 1;
return client.textRenderer.drawWithShadow(translatedAction, (float) (x + buttonWidth + 2), (float) (y + textY), 14737632); return client.textRenderer.drawWithShadow(matrices, translatedAction, (float) (x + buttonWidth + 2), (float) (y + textY), 14737632);
} }
return -10; return -10;
@@ -226,7 +226,7 @@ public class LambdaControlsRenderer
private static int getButtonTipWidth(@NotNull String action, @NotNull TextRenderer textRenderer) private static int getButtonTipWidth(@NotNull String action, @NotNull TextRenderer textRenderer)
{ {
return 15 + 5 + textRenderer.getStringWidth(action); return 15 + 5 + textRenderer.getWidth(action);
} }
public static void renderVirtualCursor(@NotNull MatrixStack matrices, @NotNull MinecraftClient client) public static void renderVirtualCursor(@NotNull MatrixStack matrices, @NotNull MinecraftClient client)
@@ -239,19 +239,19 @@ public class LambdaControlsRenderer
boolean hoverSlot = false; boolean hoverSlot = false;
if (client.currentScreen instanceof ContainerScreen) { if (client.currentScreen instanceof HandledScreen) {
ContainerScreen inventoryScreen = (ContainerScreen) client.currentScreen; HandledScreen inventoryScreen = (HandledScreen) client.currentScreen;
ContainerScreenAccessor accessor = (ContainerScreenAccessor) inventoryScreen; HandledScreenAccessor accessor = (HandledScreenAccessor) inventoryScreen;
int guiLeft = accessor.getX(); int guiLeft = accessor.getX();
int guiTop = accessor.getY(); int guiTop = accessor.getY();
// Finds the closest slot in the GUI within 14 pixels. // Finds the closest slot in the GUI within 14 pixels.
int finalMouseX = mouseX; int finalMouseX = mouseX;
int finalMouseY = mouseY; int finalMouseY = mouseY;
Optional<Pair<Slot, Double>> closestSlot = inventoryScreen.getContainer().slots.parallelStream() Optional<Pair<Slot, Double>> closestSlot = inventoryScreen.getScreenHandler().slots.parallelStream()
.map(slot -> { .map(slot -> {
int x = guiLeft + slot.xPosition + 8; int x = guiLeft + slot.x + 8;
int y = guiTop + slot.yPosition + 8; int y = guiTop + slot.y + 8;
// Distance between the slot and the cursor. // Distance between the slot and the cursor.
double distance = Math.sqrt(Math.pow(x - finalMouseX, 2) + Math.pow(y - finalMouseY, 2)); double distance = Math.sqrt(Math.pow(x - finalMouseX, 2) + Math.pow(y - finalMouseY, 2));
@@ -261,8 +261,8 @@ public class LambdaControlsRenderer
if (closestSlot.isPresent()) { if (closestSlot.isPresent()) {
Slot slot = closestSlot.get().key; Slot slot = closestSlot.get().key;
mouseX = guiLeft + slot.xPosition; mouseX = guiLeft + slot.x;
mouseY = guiTop + slot.yPosition; mouseY = guiTop + slot.y;
hoverSlot = true; hoverSlot = true;
} }
} }
@@ -291,7 +291,7 @@ public class LambdaControlsRenderer
RenderSystem.disableDepthTest(); RenderSystem.disableDepthTest();
RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
DrawableHelper.blit(x, y, hoverSlot ? 16.F : 0.F, LambdaControlsClient.get().config.getVirtualMouseSkin().ordinal() * 16.F, 16, 16, 32, 64); DrawableHelper.drawTexture(matrices, x, y, hoverSlot ? 16.F : 0.F, LambdaControlsClient.get().config.getVirtualMouseSkin().ordinal() * 16.F, 16, 16, 32, 64);
RenderSystem.enableDepthTest(); RenderSystem.enableDepthTest();
} }
} }

View File

@@ -25,6 +25,9 @@ import net.minecraft.client.gui.widget.ButtonListWidget;
import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.options.Option; import net.minecraft.client.options.Option;
import net.minecraft.client.resource.language.I18n; import net.minecraft.client.resource.language.I18n;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.LiteralText;
import net.minecraft.text.MutableText;
import net.minecraft.text.TranslatableText; import net.minecraft.text.TranslatableText;
import net.minecraft.util.Formatting; import net.minecraft.util.Formatting;
import net.minecraft.util.Util; import net.minecraft.util.Util;
@@ -35,7 +38,7 @@ import org.lwjgl.glfw.GLFW;
*/ */
public class LambdaControlsSettingsScreen extends Screen public class LambdaControlsSettingsScreen extends Screen
{ {
public static final String GAMEPAD_TOOL_URL = "http://generalarcade.com/gamepadtool/"; public static final String GAMEPAD_TOOL_URL = "https://generalarcade.com/gamepadtool/";
final LambdaControlsClient mod; final LambdaControlsClient mod;
private final Screen parent; private final Screen parent;
private final boolean hideControls; private final boolean hideControls;
@@ -63,7 +66,9 @@ public class LambdaControlsSettingsScreen extends Screen
// Hud options // Hud options
private final Option hudEnableOption; private final Option hudEnableOption;
private final Option hudSideOption; private final Option hudSideOption;
private final String controllerMappingsUrlText = I18n.translate("lambdacontrols.controller.mappings.2", Formatting.GOLD.toString(), GAMEPAD_TOOL_URL, Formatting.RESET.toString()); private final MutableText controllerMappingsUrlText = new LiteralText("(")
.append(new LiteralText(GAMEPAD_TOOL_URL).formatted(Formatting.GOLD))
.append("),");
private ButtonListWidget list; private ButtonListWidget list;
private SpruceLabelWidget gamepadToolUrlLabel; private SpruceLabelWidget gamepadToolUrlLabel;
@@ -76,19 +81,19 @@ public class LambdaControlsSettingsScreen extends Screen
// General options // General options
this.autoSwitchModeOption = new SpruceBooleanOption("lambdacontrols.menu.auto_switch_mode", this.mod.config::hasAutoSwitchMode, this.autoSwitchModeOption = new SpruceBooleanOption("lambdacontrols.menu.auto_switch_mode", this.mod.config::hasAutoSwitchMode,
this.mod.config::setAutoSwitchMode, new TranslatableText("lambdacontrols.tooltip.auto_switch_mode"), true); this.mod.config::setAutoSwitchMode, new TranslatableText("lambdacontrols.tooltip.auto_switch_mode"), true);
this.rotationSpeedOption = new SpruceDoubleOption("lambdacontrols.menu.rotation_speed", 0.0, 150.0, 0.5F, this.mod.config::getRotationSpeed, this.rotationSpeedOption = new SpruceDoubleOption("lambdacontrols.menu.rotation_speed", 0.0, 100.0, 0.5F, this.mod.config::getRotationSpeed,
newValue -> { newValue -> {
synchronized (this.mod.config) { synchronized (this.mod.config) {
this.mod.config.setRotationSpeed(newValue); this.mod.config.setRotationSpeed(newValue);
} }
}, option -> option.getDisplayPrefix() + option.get(), }, option -> option.getDisplayPrefix().append(String.valueOf(option.get())),
new TranslatableText("lambdacontrols.tooltip.rotation_speed")); new TranslatableText("lambdacontrols.tooltip.rotation_speed"));
this.mouseSpeedOption = new SpruceDoubleOption("lambdacontrols.menu.mouse_speed", 0.0, 150.0, 0.5F, this.mod.config::getMouseSpeed, this.mouseSpeedOption = new SpruceDoubleOption("lambdacontrols.menu.mouse_speed", 0.0, 150.0, 0.5F, this.mod.config::getMouseSpeed,
newValue -> { newValue -> {
synchronized (this.mod.config) { synchronized (this.mod.config) {
this.mod.config.setMouseSpeed(newValue); this.mod.config.setMouseSpeed(newValue);
} }
}, option -> option.getDisplayPrefix() + option.get(), }, option -> option.getDisplayPrefix().append(String.valueOf(option.get())),
new TranslatableText("lambdacontrols.tooltip.mouse_speed")); new TranslatableText("lambdacontrols.tooltip.mouse_speed"));
this.resetOption = new SpruceResetOption(btn -> { this.resetOption = new SpruceResetOption(btn -> {
this.mod.config.reset(); this.mod.config.reset();
@@ -115,11 +120,11 @@ public class LambdaControlsSettingsScreen extends Screen
}, option -> { }, option -> {
String controllerName = this.mod.config.getController().getName(); String controllerName = this.mod.config.getController().getName();
if (!this.mod.config.getController().isConnected()) if (!this.mod.config.getController().isConnected())
return option.getDisplayPrefix() + Formatting.RED + controllerName; return option.getDisplayPrefix().append(new LiteralText(controllerName).formatted(Formatting.RED));
else if (!this.mod.config.getController().isGamepad()) else if (!this.mod.config.getController().isGamepad())
return option.getDisplayPrefix() + Formatting.GOLD + controllerName; return option.getDisplayPrefix().append(new LiteralText(controllerName).formatted(Formatting.GOLD));
else else
return option.getDisplayPrefix() + controllerName; return option.getDisplayPrefix().append(controllerName);
}, null); }, null);
this.secondControllerOption = new SpruceCyclingOption("lambdacontrols.menu.controller2", this.secondControllerOption = new SpruceCyclingOption("lambdacontrols.menu.controller2",
amount -> { amount -> {
@@ -131,16 +136,16 @@ public class LambdaControlsSettingsScreen extends Screen
}, option -> this.mod.config.getSecondController().map(controller -> { }, option -> this.mod.config.getSecondController().map(controller -> {
String controllerName = controller.getName(); String controllerName = controller.getName();
if (!controller.isConnected()) if (!controller.isConnected())
return option.getDisplayPrefix() + Formatting.RED + controllerName; return option.getDisplayPrefix().append(new LiteralText(controllerName).formatted(Formatting.RED));
else if (!controller.isGamepad()) else if (!controller.isGamepad())
return option.getDisplayPrefix() + Formatting.GOLD + controllerName; return option.getDisplayPrefix().append(new LiteralText(controllerName).formatted(Formatting.GOLD));
else else
return option.getDisplayPrefix() + controllerName; return option.getDisplayPrefix().append(controllerName);
}).orElse(option.getDisplayPrefix() + Formatting.RED + I18n.translate("options.off")), }).orElse(option.getDisplayPrefix().append(new TranslatableText("options.off").formatted(Formatting.RED))),
new TranslatableText("lambdacontrols.tooltip.controller2")); new TranslatableText("lambdacontrols.tooltip.controller2"));
this.controllerTypeOption = new SpruceCyclingOption("lambdacontrols.menu.controller_type", this.controllerTypeOption = new SpruceCyclingOption("lambdacontrols.menu.controller_type",
amount -> this.mod.config.setControllerType(this.mod.config.getControllerType().next()), amount -> this.mod.config.setControllerType(this.mod.config.getControllerType().next()),
option -> option.getDisplayPrefix() + this.mod.config.getControllerType().getTranslatedName(), option -> option.getDisplayPrefix().append(this.mod.config.getControllerType().getTranslatedName()),
new TranslatableText("lambdacontrols.tooltip.controller_type")); new TranslatableText("lambdacontrols.tooltip.controller_type"));
this.deadZoneOption = new SpruceDoubleOption("lambdacontrols.menu.dead_zone", 0.05, 1.0, 0.05F, this.mod.config::getDeadZone, this.deadZoneOption = new SpruceDoubleOption("lambdacontrols.menu.dead_zone", 0.05, 1.0, 0.05F, this.mod.config::getDeadZone,
newValue -> { newValue -> {
@@ -149,7 +154,7 @@ public class LambdaControlsSettingsScreen extends Screen
} }
}, option -> { }, option -> {
String value = String.valueOf(option.get()); String value = String.valueOf(option.get());
return option.getDisplayPrefix() + value.substring(0, Math.min(value.length(), 5)); return option.getDisplayPrefix().append(value.substring(0, Math.min(value.length(), 5)));
}, new TranslatableText("lambdacontrols.tooltip.dead_zone")); }, new TranslatableText("lambdacontrols.tooltip.dead_zone"));
this.invertsRightXAxis = new SpruceBooleanOption("lambdacontrols.menu.invert_right_x_axis", this.mod.config::doesInvertRightXAxis, this.invertsRightXAxis = new SpruceBooleanOption("lambdacontrols.menu.invert_right_x_axis", this.mod.config::doesInvertRightXAxis,
newValue -> { newValue -> {
@@ -169,14 +174,14 @@ public class LambdaControlsSettingsScreen extends Screen
this.mod.config::setVirtualMouse, new TranslatableText("lambdacontrols.tooltip.virtual_mouse"), true); this.mod.config::setVirtualMouse, new TranslatableText("lambdacontrols.tooltip.virtual_mouse"), true);
this.virtualMouseSkinOption = new SpruceCyclingOption("lambdacontrols.menu.virtual_mouse.skin", this.virtualMouseSkinOption = new SpruceCyclingOption("lambdacontrols.menu.virtual_mouse.skin",
amount -> this.mod.config.setVirtualMouseSkin(this.mod.config.getVirtualMouseSkin().next()), amount -> this.mod.config.setVirtualMouseSkin(this.mod.config.getVirtualMouseSkin().next()),
option -> option.getDisplayPrefix() + this.mod.config.getVirtualMouseSkin().getTranslatedName(), option -> option.getDisplayPrefix().append(this.mod.config.getVirtualMouseSkin().getTranslatedName()),
null); null);
// HUD options // HUD options
this.hudEnableOption = new SpruceBooleanOption("lambdacontrols.menu.hud_enable", this.mod.config::isHudEnabled, this.hudEnableOption = new SpruceBooleanOption("lambdacontrols.menu.hud_enable", this.mod.config::isHudEnabled,
this.mod::setHudEnabled, new TranslatableText("lambdacontrols.tooltip.hud_enable"), true); this.mod::setHudEnabled, new TranslatableText("lambdacontrols.tooltip.hud_enable"), true);
this.hudSideOption = new SpruceCyclingOption("lambdacontrols.menu.hud_side", this.hudSideOption = new SpruceCyclingOption("lambdacontrols.menu.hud_side",
amount -> this.mod.config.setHudSide(this.mod.config.getHudSide().next()), amount -> this.mod.config.setHudSide(this.mod.config.getHudSide().next()),
option -> option.getDisplayPrefix() + this.mod.config.getHudSide().getTranslatedName(), option -> option.getDisplayPrefix().append(this.mod.config.getHudSide().getTranslatedName()),
new TranslatableText("lambdacontrols.tooltip.hud_side")); new TranslatableText("lambdacontrols.tooltip.hud_side"));
} }
@@ -196,7 +201,7 @@ public class LambdaControlsSettingsScreen extends Screen
private int getTextHeight() private int getTextHeight()
{ {
return (5 + this.font.fontHeight) * 3 + 5; return (5 + this.textRenderer.fontHeight) * 3 + 5;
} }
@Override @Override
@@ -205,29 +210,29 @@ public class LambdaControlsSettingsScreen extends Screen
super.init(); super.init();
int buttonHeight = 20; int buttonHeight = 20;
SpruceButtonWidget controlsModeBtn = new SpruceButtonWidget(this.width / 2 - 155, 18, this.hideControls ? 310 : 150, buttonHeight, SpruceButtonWidget controlsModeBtn = new SpruceButtonWidget(this.width / 2 - 155, 18, this.hideControls ? 310 : 150, buttonHeight,
I18n.translate("lambdacontrols.menu.controls_mode") + ": " + I18n.translate(this.mod.config.getControlsMode().getTranslationKey()), new TranslatableText("lambdacontrols.menu.controls_mode").append(": ").append(new TranslatableText(this.mod.config.getControlsMode().getTranslationKey())),
btn -> { btn -> {
ControlsMode next = this.mod.config.getControlsMode().next(); ControlsMode next = this.mod.config.getControlsMode().next();
btn.setMessage(I18n.translate("lambdacontrols.menu.controls_mode") + ": " + I18n.translate(next.getTranslationKey())); btn.setMessage(new TranslatableText("lambdacontrols.menu.controls_mode").append(": ").append(new TranslatableText(next.getTranslationKey())));
this.mod.config.setControlsMode(next); this.mod.config.setControlsMode(next);
this.mod.config.save(); this.mod.config.save();
if (this.minecraft.player != null) { if (this.client.player != null) {
ClientSidePacketRegistry.INSTANCE.sendToServer(LambdaControls.CONTROLS_MODE_CHANNEL, this.mod.makeControlsModeBuffer(next)); ClientSidePacketRegistry.INSTANCE.sendToServer(LambdaControls.CONTROLS_MODE_CHANNEL, this.mod.makeControlsModeBuffer(next));
} }
}); });
controlsModeBtn.setTooltip(new TranslatableText("lambdacontrols.tooltip.controls_mode")); controlsModeBtn.setTooltip(new TranslatableText("lambdacontrols.tooltip.controls_mode"));
this.addButton(controlsModeBtn); this.addButton(controlsModeBtn);
if (!this.hideControls) if (!this.hideControls)
this.addButton(new ButtonWidget(this.width / 2 - 155 + 160, 18, 150, buttonHeight, I18n.translate("options.controls"), this.addButton(new ButtonWidget(this.width / 2 - 155 + 160, 18, 150, buttonHeight, new TranslatableText("options.controls"),
btn -> { btn -> {
if (this.mod.config.getControlsMode() == ControlsMode.CONTROLLER) if (this.mod.config.getControlsMode() == ControlsMode.CONTROLLER)
this.minecraft.openScreen(new ControllerControlsScreen(this, true)); this.client.openScreen(new ControllerControlsScreen(this, true));
else else
this.minecraft.openScreen(new ControlsOptionsScreen(this, this.minecraft.options)); this.client.openScreen(new ControlsOptionsScreen(this, this.client.options));
})); }));
this.list = new ButtonListWidget(this.minecraft, this.width, this.height, 43, this.height - 29 - this.getTextHeight(), 25); this.list = new ButtonListWidget(this.client, this.width, this.height, 43, this.height - 29 - this.getTextHeight(), 25);
// General options // General options
this.list.addSingleOptionEntry(new SpruceSeparatorOption("lambdacontrols.menu.title.general", true, null)); this.list.addSingleOptionEntry(new SpruceSeparatorOption("lambdacontrols.menu.title.general", true, null));
this.list.addOptionEntry(this.rotationSpeedOption, this.mouseSpeedOption); this.list.addOptionEntry(this.rotationSpeedOption, this.mouseSpeedOption);
@@ -252,27 +257,27 @@ public class LambdaControlsSettingsScreen extends Screen
this.list.addOptionEntry(this.hudEnableOption, this.hudSideOption); this.list.addOptionEntry(this.hudEnableOption, this.hudSideOption);
this.children.add(this.list); this.children.add(this.list);
this.gamepadToolUrlLabel = new SpruceLabelWidget(this.width / 2, this.height - 29 - (5 + this.font.fontHeight) * 2, this.controllerMappingsUrlText, this.width, this.gamepadToolUrlLabel = new SpruceLabelWidget(this.width / 2, this.height - 29 - (5 + this.textRenderer.fontHeight) * 2, this.controllerMappingsUrlText, this.width,
label -> Util.getOperatingSystem().open(GAMEPAD_TOOL_URL), true); label -> Util.getOperatingSystem().open(GAMEPAD_TOOL_URL), true);
this.gamepadToolUrlLabel.setTooltip(new TranslatableText("chat.link.open")); this.gamepadToolUrlLabel.setTooltip(new TranslatableText("chat.link.open"));
this.children.add(this.gamepadToolUrlLabel); this.children.add(this.gamepadToolUrlLabel);
this.addButton(this.resetOption.createButton(this.minecraft.options, this.width / 2 - 155, this.height - 29, 150)); this.addButton(this.resetOption.createButton(this.client.options, this.width / 2 - 155, this.height - 29, 150));
this.addButton(new ButtonWidget(this.width / 2 - 155 + 160, this.height - 29, 150, buttonHeight, I18n.translate("gui.done"), this.addButton(new ButtonWidget(this.width / 2 - 155 + 160, this.height - 29, 150, buttonHeight, new TranslatableText("gui.done"),
(buttonWidget) -> this.minecraft.openScreen(this.parent))); (buttonWidget) -> this.client.openScreen(this.parent)));
} }
@Override @Override
public void render(int mouseX, int mouseY, float delta) public void render(MatrixStack matrices, int mouseX, int mouseY, float delta)
{ {
this.renderBackground(); this.renderBackground(matrices);
this.list.render(mouseX, mouseY, delta); this.list.render(matrices, mouseX, mouseY, delta);
super.render(mouseX, mouseY, delta); super.render(matrices, mouseX, mouseY, delta);
this.drawCenteredString(this.font, I18n.translate("lambdacontrols.menu.title"), this.width / 2, 8, 16777215); this.drawCenteredString(matrices, this.textRenderer, I18n.translate("lambdacontrols.menu.title"), this.width / 2, 8, 16777215);
this.drawCenteredString(this.font, I18n.translate("lambdacontrols.controller.mappings.1", Formatting.GREEN.toString(), Formatting.RESET.toString()), this.width / 2, this.height - 29 - (5 + this.font.fontHeight) * 3, 10526880); this.drawCenteredString(matrices, this.textRenderer, I18n.translate("lambdacontrols.controller.mappings.1", Formatting.GREEN.toString(), Formatting.RESET.toString()), this.width / 2, this.height - 29 - (5 + this.textRenderer.fontHeight) * 3, 10526880);
this.gamepadToolUrlLabel.render(mouseX, mouseY, delta); this.gamepadToolUrlLabel.render(matrices, mouseX, mouseY, delta);
this.drawCenteredString(this.font, I18n.translate("lambdacontrols.controller.mappings.3", Formatting.GREEN.toString(), Formatting.RESET.toString()), this.width / 2, this.height - 29 - (5 + this.font.fontHeight), 10526880); this.drawCenteredString(matrices, this.textRenderer, I18n.translate("lambdacontrols.controller.mappings.3", Formatting.GREEN.toString(), Formatting.RESET.toString()), this.width / 2, this.height - 29 - (5 + this.textRenderer.fontHeight), 10526880);
Tooltip.renderAll(); Tooltip.renderAll(matrices);
} }
} }

View File

@@ -36,7 +36,7 @@ public class ReloadControllerMappingsOption extends Option implements Nameable
@Override @Override
public AbstractButtonWidget createButton(GameOptions options, int x, int y, int width) public AbstractButtonWidget createButton(GameOptions options, int x, int y, int width)
{ {
SpruceButtonWidget button = new SpruceButtonWidget(x, y, width, 20, this.getName(), btn -> { SpruceButtonWidget button = new SpruceButtonWidget(x, y, width, 20, new TranslatableText(KEY), btn -> {
MinecraftClient client = MinecraftClient.getInstance(); MinecraftClient client = MinecraftClient.getInstance();
Controller.updateMappings(); Controller.updateMappings();
if (client.currentScreen != null) if (client.currentScreen != null)

View File

@@ -70,14 +70,14 @@ public class TouchscreenOverlay extends Screen
private void pauseGame(boolean bl) private void pauseGame(boolean bl)
{ {
if (this.minecraft == null) if (this.client == null)
return; return;
boolean bl2 = this.minecraft.isIntegratedServerRunning() && !this.minecraft.getServer().isRemote(); boolean bl2 = this.client.isIntegratedServerRunning() && !this.client.getServer().isRemote();
if (bl2) { if (bl2) {
this.minecraft.openScreen(new GameMenuScreen(!bl)); this.client.openScreen(new GameMenuScreen(!bl));
this.minecraft.getSoundManager().pauseAll(); this.client.getSoundManager().pauseAll();
} else { } else {
this.minecraft.openScreen(new GameMenuScreen(true)); this.client.openScreen(new GameMenuScreen(true));
} }
} }
@@ -99,9 +99,9 @@ public class TouchscreenOverlay extends Screen
*/ */
private void updateJumpButtons() private void updateJumpButtons()
{ {
if (this.minecraft == null) if (this.client == null)
return; return;
if (this.minecraft.player.abilities.allowFlying && this.minecraft.player.abilities.flying) { if (this.client.player.abilities.allowFlying && this.client.player.abilities.flying) {
boolean oldStateFly = this.flyButton.visible; boolean oldStateFly = this.flyButton.visible;
this.jumpButton.visible = false; this.jumpButton.visible = false;
this.flyButton.visible = true; this.flyButton.visible = true;
@@ -128,7 +128,7 @@ public class TouchscreenOverlay extends Screen
*/ */
private void handleJump(ButtonWidget btn, boolean state) private void handleJump(ButtonWidget btn, boolean state)
{ {
((KeyBindingAccessor) this.minecraft.options.keyJump).lambdacontrols_handlePressState(state); ((KeyBindingAccessor) this.client.options.keyJump).lambdacontrols_handlePressState(state);
} }
@Override @Override
@@ -149,27 +149,27 @@ public class TouchscreenOverlay extends Screen
protected void init() protected void init()
{ {
super.init(); super.init();
int scaledWidth = this.minecraft.getWindow().getScaledWidth(); int scaledWidth = this.client.getWindow().getScaledWidth();
int scaledHeight = this.minecraft.getWindow().getScaledHeight(); int scaledHeight = this.client.getWindow().getScaledHeight();
this.addButton(new TexturedButtonWidget(scaledWidth / 2 - 20, 0, 20, 20, 0, 106, 20, ButtonWidget.WIDGETS_LOCATION, 256, 256, this.addButton(new TexturedButtonWidget(scaledWidth / 2 - 20, 0, 20, 20, 0, 106, 20, ButtonWidget.WIDGETS_LOCATION, 256, 256,
btn -> this.minecraft.openScreen(new ChatScreen("")), "")); btn -> this.client.openScreen(new ChatScreen("")), LiteralText.EMPTY));
this.addButton(new TexturedButtonWidget(scaledWidth / 2, 0, 20, 20, 0, 0, 20, WIDGETS_LOCATION, 256, 256, this.addButton(new TexturedButtonWidget(scaledWidth / 2, 0, 20, 20, 0, 0, 20, WIDGETS_LOCATION, 256, 256,
btn -> this.pauseGame(false))); btn -> this.pauseGame(false)));
// Inventory buttons. // Inventory buttons.
int inventoryButtonX = scaledWidth / 2; int inventoryButtonX = scaledWidth / 2;
int inventoryButtonY = scaledHeight - 16 - 5; int inventoryButtonY = scaledHeight - 16 - 5;
if (this.minecraft.options.mainArm == Arm.LEFT) { if (this.client.options.mainArm == Arm.LEFT) {
inventoryButtonX = inventoryButtonX - 91 - 24; inventoryButtonX = inventoryButtonX - 91 - 24;
} else { } else {
inventoryButtonX = inventoryButtonX + 91 + 4; inventoryButtonX = inventoryButtonX + 91 + 4;
} }
this.addButton(new TexturedButtonWidget(inventoryButtonX, inventoryButtonY, 20, 20, 20, 0, 20, WIDGETS_LOCATION, 256, 256, this.addButton(new TexturedButtonWidget(inventoryButtonX, inventoryButtonY, 20, 20, 20, 0, 20, WIDGETS_LOCATION, 256, 256,
btn -> { btn -> {
if (this.minecraft.interactionManager.hasRidingInventory()) { if (this.client.interactionManager.hasRidingInventory()) {
this.minecraft.player.openRidingInventory(); this.client.player.openRidingInventory();
} else { } else {
this.minecraft.getTutorialManager().onInventoryOpened(); this.client.getTutorialManager().onInventoryOpened();
this.minecraft.openScreen(new InventoryScreen(this.minecraft.player)); this.client.openScreen(new InventoryScreen(this.client.player));
} }
})); }));
int jumpButtonX, swapHandsX, sneakButtonX; int jumpButtonX, swapHandsX, sneakButtonX;
@@ -187,31 +187,31 @@ public class TouchscreenOverlay extends Screen
this.addButton(new SpruceTexturedButtonWidget(swapHandsX, sneakButtonY, 20, 20, 0, 160, 20, WIDGETS_LOCATION, this.addButton(new SpruceTexturedButtonWidget(swapHandsX, sneakButtonY, 20, 20, 0, 160, 20, WIDGETS_LOCATION,
(btn, state) -> { (btn, state) -> {
if (state) { if (state) {
if (!this.minecraft.player.isSpectator()) { if (!this.client.player.isSpectator()) {
this.minecraft.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.SWAP_HELD_ITEMS, BlockPos.ORIGIN, Direction.DOWN)); this.client.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.SWAP_ITEM_WITH_OFFHAND, BlockPos.ORIGIN, Direction.DOWN));
} }
} }
})); }));
// Drop // Drop
this.addButton(new SpruceTexturedButtonWidget(swapHandsX, sneakButtonY + 5 + 20, 20, 20, 20, 160, 20, WIDGETS_LOCATION, this.addButton(new SpruceTexturedButtonWidget(swapHandsX, sneakButtonY + 5 + 20, 20, 20, 20, 160, 20, WIDGETS_LOCATION,
(btn, state) -> ((KeyBindingAccessor) this.minecraft.options.keyDrop).lambdacontrols_handlePressState(state))); (btn, state) -> ((KeyBindingAccessor) this.client.options.keyDrop).lambdacontrols_handlePressState(state)));
// Jump keys // Jump keys
this.addButton(this.jumpButton = new SpruceTexturedButtonWidget(jumpButtonX, sneakButtonY, 20, 20, 0, 40, 20, WIDGETS_LOCATION, this.addButton(this.jumpButton = new SpruceTexturedButtonWidget(jumpButtonX, sneakButtonY, 20, 20, 0, 40, 20, WIDGETS_LOCATION,
this::handleJump)); this::handleJump));
this.addButton(this.flyButton = new SpruceTexturedButtonWidget(jumpButtonX, sneakButtonY, 20, 20, 20, 40, 20, WIDGETS_LOCATION, this.addButton(this.flyButton = new SpruceTexturedButtonWidget(jumpButtonX, sneakButtonY, 20, 20, 20, 40, 20, WIDGETS_LOCATION,
(btn, state) -> { (btn, state) -> {
if (this.flyButtonEnableTicks == 0) this.minecraft.player.abilities.flying = false; if (this.flyButtonEnableTicks == 0) this.client.player.abilities.flying = false;
})); }));
this.addButton(this.flyUpButton = new SpruceTexturedButtonWidget(jumpButtonX, sneakButtonY - 5 - 20, 20, 20, 40, 40, 20, WIDGETS_LOCATION, this.addButton(this.flyUpButton = new SpruceTexturedButtonWidget(jumpButtonX, sneakButtonY - 5 - 20, 20, 20, 40, 40, 20, WIDGETS_LOCATION,
this::handleJump)); this::handleJump));
this.addButton(this.flyDownButton = new SpruceTexturedButtonWidget(jumpButtonX, sneakButtonY + 20 + 5, 20, 20, 60, 40, 20, WIDGETS_LOCATION, this.addButton(this.flyDownButton = new SpruceTexturedButtonWidget(jumpButtonX, sneakButtonY + 20 + 5, 20, 20, 60, 40, 20, WIDGETS_LOCATION,
(btn, state) -> ((KeyBindingAccessor) this.minecraft.options.keySneak).lambdacontrols_handlePressState(state))); (btn, state) -> ((KeyBindingAccessor) this.client.options.keySneak).lambdacontrols_handlePressState(state)));
this.updateJumpButtons(); this.updateJumpButtons();
// Movements keys // Movements keys
this.addButton((this.startSneakButton = new SpruceTexturedButtonWidget(sneakButtonX, sneakButtonY, 20, 20, 0, 120, 20, WIDGETS_LOCATION, this.addButton((this.startSneakButton = new SpruceTexturedButtonWidget(sneakButtonX, sneakButtonY, 20, 20, 0, 120, 20, WIDGETS_LOCATION,
(btn, state) -> { (btn, state) -> {
if (state) { if (state) {
((KeyBindingAccessor) this.minecraft.options.keySneak).lambdacontrols_handlePressState(true); ((KeyBindingAccessor) this.client.options.keySneak).lambdacontrols_handlePressState(true);
this.startSneakButton.visible = false; this.startSneakButton.visible = false;
this.endSneakButton.visible = true; this.endSneakButton.visible = true;
} }
@@ -219,7 +219,7 @@ public class TouchscreenOverlay extends Screen
this.addButton((this.endSneakButton = new SpruceTexturedButtonWidget(sneakButtonX, sneakButtonY, 20, 20, 20, 120, 20, WIDGETS_LOCATION, this.addButton((this.endSneakButton = new SpruceTexturedButtonWidget(sneakButtonX, sneakButtonY, 20, 20, 20, 120, 20, WIDGETS_LOCATION,
(btn, state) -> { (btn, state) -> {
if (state) { if (state) {
((KeyBindingAccessor) this.minecraft.options.keySneak).lambdacontrols_handlePressState(false); ((KeyBindingAccessor) this.client.options.keySneak).lambdacontrols_handlePressState(false);
this.endSneakButton.visible = false; this.endSneakButton.visible = false;
this.startSneakButton.visible = true; this.startSneakButton.visible = true;
} }
@@ -227,49 +227,49 @@ public class TouchscreenOverlay extends Screen
this.endSneakButton.visible = false; this.endSneakButton.visible = false;
this.addButton(this.forwardLeftButton = new SpruceTexturedButtonWidget(sneakButtonX - 20 - 5, sneakButtonY - 5 - 20, 20, 20, 80, 80, 20, WIDGETS_LOCATION, this.addButton(this.forwardLeftButton = new SpruceTexturedButtonWidget(sneakButtonX - 20 - 5, sneakButtonY - 5 - 20, 20, 20, 80, 80, 20, WIDGETS_LOCATION,
(btn, state) -> { (btn, state) -> {
((KeyBindingAccessor) this.minecraft.options.keyForward).lambdacontrols_handlePressState(state); ((KeyBindingAccessor) this.client.options.keyForward).lambdacontrols_handlePressState(state);
((KeyBindingAccessor) this.minecraft.options.keyLeft).lambdacontrols_handlePressState(state); ((KeyBindingAccessor) this.client.options.keyLeft).lambdacontrols_handlePressState(state);
this.updateForwardButtonsState(state); this.updateForwardButtonsState(state);
})); }));
this.forwardLeftButton.visible = false; this.forwardLeftButton.visible = false;
this.addButton(new SpruceTexturedButtonWidget(sneakButtonX, sneakButtonY - 5 - 20, 20, 20, 0, 80, 20, WIDGETS_LOCATION, this.addButton(new SpruceTexturedButtonWidget(sneakButtonX, sneakButtonY - 5 - 20, 20, 20, 0, 80, 20, WIDGETS_LOCATION,
(btn, state) -> { (btn, state) -> {
((KeyBindingAccessor) this.minecraft.options.keyForward).lambdacontrols_handlePressState(state); ((KeyBindingAccessor) this.client.options.keyForward).lambdacontrols_handlePressState(state);
this.updateForwardButtonsState(state); this.updateForwardButtonsState(state);
this.forwardLeftButton.visible = true; this.forwardLeftButton.visible = true;
this.forwardRightButton.visible = true; this.forwardRightButton.visible = true;
})); }));
this.addButton(this.forwardRightButton = new SpruceTexturedButtonWidget(sneakButtonX + 20 + 5, sneakButtonY - 5 - 20, 20, 20, 100, 80, 20, WIDGETS_LOCATION, this.addButton(this.forwardRightButton = new SpruceTexturedButtonWidget(sneakButtonX + 20 + 5, sneakButtonY - 5 - 20, 20, 20, 100, 80, 20, WIDGETS_LOCATION,
(btn, state) -> { (btn, state) -> {
((KeyBindingAccessor) this.minecraft.options.keyForward).lambdacontrols_handlePressState(state); ((KeyBindingAccessor) this.client.options.keyForward).lambdacontrols_handlePressState(state);
((KeyBindingAccessor) this.minecraft.options.keyRight).lambdacontrols_handlePressState(state); ((KeyBindingAccessor) this.client.options.keyRight).lambdacontrols_handlePressState(state);
this.updateForwardButtonsState(state); this.updateForwardButtonsState(state);
})); }));
this.forwardRightButton.visible = true; this.forwardRightButton.visible = true;
this.addButton(new SpruceTexturedButtonWidget(sneakButtonX + 20 + 5, sneakButtonY, 20, 20, 20, 80, 20, WIDGETS_LOCATION, this.addButton(new SpruceTexturedButtonWidget(sneakButtonX + 20 + 5, sneakButtonY, 20, 20, 20, 80, 20, WIDGETS_LOCATION,
(btn, state) -> ((KeyBindingAccessor) this.minecraft.options.keyRight).lambdacontrols_handlePressState(state))); (btn, state) -> ((KeyBindingAccessor) this.client.options.keyRight).lambdacontrols_handlePressState(state)));
this.addButton(new SpruceTexturedButtonWidget(sneakButtonX, sneakButtonY + 20 + 5, 20, 20, 40, 80, 20, WIDGETS_LOCATION, this.addButton(new SpruceTexturedButtonWidget(sneakButtonX, sneakButtonY + 20 + 5, 20, 20, 40, 80, 20, WIDGETS_LOCATION,
(btn, state) -> ((KeyBindingAccessor) this.minecraft.options.keyBack).lambdacontrols_handlePressState(state))); (btn, state) -> ((KeyBindingAccessor) this.client.options.keyBack).lambdacontrols_handlePressState(state)));
this.addButton(new SpruceTexturedButtonWidget(sneakButtonX - 20 - 5, sneakButtonY, 20, 20, 60, 80, 20, WIDGETS_LOCATION, this.addButton(new SpruceTexturedButtonWidget(sneakButtonX - 20 - 5, sneakButtonY, 20, 20, 60, 80, 20, WIDGETS_LOCATION,
(btn, state) -> ((KeyBindingAccessor) this.minecraft.options.keyLeft).lambdacontrols_handlePressState(state))); (btn, state) -> ((KeyBindingAccessor) this.client.options.keyLeft).lambdacontrols_handlePressState(state)));
}
@Override this.buttons.forEach(button -> {
public void render(int mouseX, int mouseY, float delta) if (button instanceof SpruceTexturedButtonWidget) {
{ ((SpruceTexturedButtonWidget) button).setSilent(true);
super.render(mouseX, mouseY, delta); }
});
} }
@Override @Override
public boolean mouseClicked(double mouseX, double mouseY, int button) public boolean mouseClicked(double mouseX, double mouseY, int button)
{ {
if (mouseY >= (double) (this.height - 22) && this.minecraft != null && this.minecraft.player != null) { if (mouseY >= (double) (this.height - 22) && this.client != null && this.client.player != null) {
int centerX = this.width / 2; int centerX = this.width / 2;
if (mouseX >= (double) (centerX - 90) && mouseX <= (double) (centerX + 90)) { if (mouseX >= (double) (centerX - 90) && mouseX <= (double) (centerX + 90)) {
for (int slot = 0; slot < 9; ++slot) { for (int slot = 0; slot < 9; ++slot) {
int slotX = centerX - 90 + slot * 20 + 2; int slotX = centerX - 90 + slot * 20 + 2;
if (mouseX >= (double) slotX && mouseX <= (double) (slotX + 20)) { if (mouseX >= (double) slotX && mouseX <= (double) (slotX + 20)) {
this.minecraft.player.inventory.selectedSlot = slot; this.client.player.inventory.selectedSlot = slot;
return true; return true;
} }
} }
@@ -281,16 +281,16 @@ public class TouchscreenOverlay extends Screen
@Override @Override
public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY)
{ {
if (button == GLFW.GLFW_MOUSE_BUTTON_1 && this.minecraft != null) { if (button == GLFW.GLFW_MOUSE_BUTTON_1 && this.client != null) {
if (deltaY > 0.01) if (deltaY > 0.01)
this.mod.input.handleLook(this.minecraft, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs(deltaY / 5.0), 2); this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs(deltaY / 5.0), 2);
else if (deltaY < 0.01) else if (deltaY < 0.01)
this.mod.input.handleLook(this.minecraft, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs(deltaY / 5.0), 1); this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs(deltaY / 5.0), 1);
if (deltaX > 0.01) if (deltaX > 0.01)
this.mod.input.handleLook(this.minecraft, GLFW_GAMEPAD_AXIS_RIGHT_X, (float) Math.abs(deltaX / 5.0), 2); this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_X, (float) Math.abs(deltaX / 5.0), 2);
else if (deltaX < 0.01) else if (deltaX < 0.01)
this.mod.input.handleLook(this.minecraft, GLFW_GAMEPAD_AXIS_RIGHT_X, (float) Math.abs(deltaX / 5.0), 1); this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_X, (float) Math.abs(deltaX / 5.0), 1);
} }
return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY);
} }

View File

@@ -19,6 +19,7 @@ import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.options.GameOptions; import net.minecraft.client.options.GameOptions;
import net.minecraft.client.resource.language.I18n; import net.minecraft.client.resource.language.I18n;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.Redirect;
@@ -40,7 +41,7 @@ public class ControlsOptionsScreenMixin extends GameOptionsScreen
if (this.parent instanceof ControllerControlsScreen) if (this.parent instanceof ControllerControlsScreen)
return this.addButton(btn); return this.addButton(btn);
else else
return this.addButton(new ButtonWidget(btn.x, btn.y, btn.getWidth(), ((AbstractButtonWidgetAccessor) btn).getHeight(), I18n.translate("menu.options"), return this.addButton(new ButtonWidget(btn.x, btn.y, btn.getWidth(), ((AbstractButtonWidgetAccessor) btn).getHeight(), new TranslatableText("menu.options"),
b -> this.minecraft.openScreen(new LambdaControlsSettingsScreen(this, true)))); b -> this.client.openScreen(new LambdaControlsSettingsScreen(this, true))));
} }
} }

View File

@@ -10,8 +10,8 @@
package me.lambdaurora.lambdacontrols.client.mixin; package me.lambdaurora.lambdacontrols.client.mixin;
import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen; import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
import net.minecraft.container.Slot;
import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemGroup;
import net.minecraft.screen.slot.Slot;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;

View File

@@ -17,5 +17,5 @@ import org.spongepowered.asm.mixin.gen.Invoker;
public interface EntryListWidgetAccessor public interface EntryListWidgetAccessor
{ {
@Invoker("moveSelection") @Invoker("moveSelection")
void lambdacontrols_moveSelection(int amount); void lambdacontrols_moveSelection(EntryListWidget.class_5403 direction);
} }

View File

@@ -13,11 +13,11 @@ import me.lambdaurora.lambdacontrols.ControlsMode;
import me.lambdaurora.lambdacontrols.client.LambdaControlsClient; import me.lambdaurora.lambdacontrols.client.LambdaControlsClient;
import me.lambdaurora.lambdacontrols.client.compat.LambdaControlsCompat; import me.lambdaurora.lambdacontrols.client.compat.LambdaControlsCompat;
import me.lambdaurora.lambdacontrols.client.gui.LambdaControlsRenderer; import me.lambdaurora.lambdacontrols.client.gui.LambdaControlsRenderer;
import me.lambdaurora.lambdacontrols.client.util.ContainerScreenAccessor; import me.lambdaurora.lambdacontrols.client.util.HandledScreenAccessor;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.ingame.ContainerScreen; import net.minecraft.client.gui.screen.ingame.HandledScreen;
import net.minecraft.container.Slot; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.screen.slot.Slot;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;
@@ -29,8 +29,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
/** /**
* Represents the mixin for the class ContainerScreen. * Represents the mixin for the class ContainerScreen.
*/ */
@Mixin(ContainerScreen.class) @Mixin(HandledScreen.class)
public abstract class ContainerScreenMixin implements ContainerScreenAccessor public abstract class HandledScreenMixin implements HandledScreenAccessor
{ {
@Accessor("x") @Accessor("x")
public abstract int getX(); public abstract int getX();
@@ -42,20 +42,20 @@ public abstract class ContainerScreenMixin implements ContainerScreenAccessor
public abstract Slot lambdacontrols_getSlotAt(double posX, double posY); public abstract Slot lambdacontrols_getSlotAt(double posX, double posY);
@Inject(method = "render", at = @At("RETURN")) @Inject(method = "render", at = @At("RETURN"))
public void onRender(int mouseX, int mouseY, float delta, CallbackInfo ci) public void onRender(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci)
{ {
if (LambdaControlsClient.get().config.getControlsMode() == ControlsMode.CONTROLLER) { if (LambdaControlsClient.get().config.getControlsMode() == ControlsMode.CONTROLLER) {
MinecraftClient client = MinecraftClient.getInstance(); MinecraftClient client = MinecraftClient.getInstance();
int x = 2, y = client.getWindow().getScaledHeight() - 2 - LambdaControlsRenderer.ICON_SIZE; int x = 2, y = client.getWindow().getScaledHeight() - 2 - LambdaControlsRenderer.ICON_SIZE;
x = LambdaControlsRenderer.drawButtonTip(x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_A}, "lambdacontrols.action.pickup_all", true, client) + 2; x = LambdaControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_A}, "lambdacontrols.action.pickup_all", true, client) + 2;
x = LambdaControlsRenderer.drawButtonTip(x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_B}, "lambdacontrols.action.exit", true, client) + 2; x = LambdaControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_B}, "lambdacontrols.action.exit", true, client) + 2;
if (LambdaControlsCompat.isReiPresent()) { if (LambdaControlsCompat.isReiPresent()) {
x = 2; x = 2;
y -= 24; y -= 24;
} }
x = LambdaControlsRenderer.drawButtonTip(x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_X}, "lambdacontrols.action.pickup", true, client) + 2; x = LambdaControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_X}, "lambdacontrols.action.pickup", true, client) + 2;
LambdaControlsRenderer.drawButtonTip(x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_Y}, "lambdacontrols.action.quick_move", true, client); LambdaControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_Y}, "lambdacontrols.action.quick_move", true, client);
} }
} }
} }

View File

@@ -145,7 +145,7 @@ public abstract class MinecraftClientMixin implements FrontBlockPlaceResultAcces
private void onItemUse(CallbackInfo ci, Hand[] hands, int handCount, int handIndex, Hand hand, ItemStack stackInHand) private void onItemUse(CallbackInfo ci, Hand[] hands, int handCount, int handIndex, Hand hand, ItemStack stackInHand)
{ {
if (!stackInHand.isEmpty() && this.player.pitch > 35.0F && LambdaControlsFeature.FRONT_BLOCK_PLACING.isAvailable()) { if (!stackInHand.isEmpty() && this.player.pitch > 35.0F && LambdaControlsFeature.FRONT_BLOCK_PLACING.isAvailable()) {
if (this.crosshairTarget != null && this.crosshairTarget.getType() == HitResult.Type.MISS && this.player.onGround) { if (this.crosshairTarget != null && this.crosshairTarget.getType() == HitResult.Type.MISS && this.player.isOnGround()) {
if (!stackInHand.isEmpty() && stackInHand.getItem() instanceof BlockItem) { if (!stackInHand.isEmpty() && stackInHand.getItem() instanceof BlockItem) {
BlockHitResult hitResult = LambdaInput.tryFrontPlace(((MinecraftClient) (Object) this)); BlockHitResult hitResult = LambdaInput.tryFrontPlace(((MinecraftClient) (Object) this));

View File

@@ -13,7 +13,7 @@ import me.lambdaurora.lambdacontrols.ControlsMode;
import me.lambdaurora.lambdacontrols.client.LambdaControlsClient; import me.lambdaurora.lambdacontrols.client.LambdaControlsClient;
import me.lambdaurora.lambdacontrols.client.gui.ControllerControlsScreen; import me.lambdaurora.lambdacontrols.client.gui.ControllerControlsScreen;
import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.SettingsScreen; import net.minecraft.client.gui.screen.options.OptionsScreen;
import net.minecraft.client.gui.widget.AbstractButtonWidget; import net.minecraft.client.gui.widget.AbstractButtonWidget;
import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.text.Text; import net.minecraft.text.Text;
@@ -24,20 +24,20 @@ import org.spongepowered.asm.mixin.injection.Redirect;
/** /**
* Injects the new controls settings button. * Injects the new controls settings button.
*/ */
@Mixin(SettingsScreen.class) @Mixin(OptionsScreen.class)
public class SettingsScreenMixin extends Screen public class OptionsScreenMixin extends Screen
{ {
protected SettingsScreenMixin(Text title) protected OptionsScreenMixin(Text title)
{ {
super(title); super(title);
} }
@Redirect(method = "init", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/SettingsScreen;addButton(Lnet/minecraft/client/gui/widget/AbstractButtonWidget;)Lnet/minecraft/client/gui/widget/AbstractButtonWidget;", ordinal = 7)) @Redirect(method = "init", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/options/OptionsScreen;addButton(Lnet/minecraft/client/gui/widget/AbstractButtonWidget;)Lnet/minecraft/client/gui/widget/AbstractButtonWidget;", ordinal = 7))
private AbstractButtonWidget lambdacontrols_onInit(SettingsScreen screen, AbstractButtonWidget btn) private AbstractButtonWidget lambdacontrols_onInit(OptionsScreen screen, AbstractButtonWidget btn)
{ {
if (LambdaControlsClient.get().config.getControlsMode() == ControlsMode.CONTROLLER) { if (LambdaControlsClient.get().config.getControlsMode() == ControlsMode.CONTROLLER) {
return this.addButton(new ButtonWidget(btn.x, btn.y, btn.getWidth(), ((AbstractButtonWidgetAccessor) btn).getHeight(), btn.getMessage(), return this.addButton(new ButtonWidget(btn.x, btn.y, btn.getWidth(), ((AbstractButtonWidgetAccessor) btn).getHeight(), btn.getMessage(),
b -> this.minecraft.openScreen(new ControllerControlsScreen(this, false)))); b -> this.client.openScreen(new ControllerControlsScreen(this, false))));
} else { } else {
return this.addButton(btn); return this.addButton(btn);
} }

View File

@@ -14,12 +14,11 @@ import me.lambdaurora.lambdacontrols.client.LambdaInput;
import me.lambdaurora.lambdacontrols.client.util.FrontBlockPlaceResultAccessor; import me.lambdaurora.lambdacontrols.client.util.FrontBlockPlaceResultAccessor;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.ShapeContext;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.*; import net.minecraft.client.render.*;
import net.minecraft.client.util.math.Matrix4f;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.client.world.ClientWorld; import net.minecraft.client.world.ClientWorld;
import net.minecraft.entity.EntityContext;
import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemPlacementContext;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@@ -28,6 +27,7 @@ import net.minecraft.util.Hand;
import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.hit.HitResult; import net.minecraft.util.hit.HitResult;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Matrix4f;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.util.profiler.Profiler; import net.minecraft.util.profiler.Profiler;
import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShape;
@@ -91,7 +91,7 @@ public abstract class WorldRendererMixin
BlockState placementState = block.getPlacementState(context); BlockState placementState = block.getPlacementState(context);
if (placementState == null) if (placementState == null)
return; return;
VoxelShape outlineShape = placementState.getOutlineShape(this.client.world, blockPos, EntityContext.of(camera.getFocusedEntity())); VoxelShape outlineShape = placementState.getOutlineShape(this.client.world, blockPos, ShapeContext.of(camera.getFocusedEntity()));
int[] color = LambdaControlsClient.get().config.getFrontBlockOutlineColor(); int[] color = LambdaControlsClient.get().config.getFrontBlockOutlineColor();
drawShapeOutline(matrices, vertexConsumer, outlineShape, (double) blockPos.getX() - x, (double) blockPos.getY() - y, (double) blockPos.getZ() - z, color[0] / 255.f, color[1] / 255.f, color[2] / 255.f, color[3] / 255.f); drawShapeOutline(matrices, vertexConsumer, outlineShape, (double) blockPos.getX() - x, (double) blockPos.getY() - y, (double) blockPos.getZ() - z, color[0] / 255.f, color[1] / 255.f, color[2] / 255.f, color[3] / 255.f);
} }

View File

@@ -9,12 +9,12 @@
package me.lambdaurora.lambdacontrols.client.util; package me.lambdaurora.lambdacontrols.client.util;
import net.minecraft.container.Slot; import net.minecraft.screen.slot.Slot;
/** /**
* Represents an accessor to AbstractContainerScreen. * Represents an accessor to AbstractContainerScreen.
*/ */
public interface ContainerScreenAccessor public interface HandledScreenAccessor
{ {
/** /**
* Gets the left coordinate of the GUI. * Gets the left coordinate of the GUI.

View File

@@ -60,7 +60,6 @@
"lambdacontrols.controller.connected": "Controller %d connected.", "lambdacontrols.controller.connected": "Controller %d connected.",
"lambdacontrols.controller.disconnected": "Controller %d disconnected.", "lambdacontrols.controller.disconnected": "Controller %d disconnected.",
"lambdacontrols.controller.mappings.1": "To configure the controller mappings, please use %sSDL2 Gamepad Tool%s", "lambdacontrols.controller.mappings.1": "To configure the controller mappings, please use %sSDL2 Gamepad Tool%s",
"lambdacontrols.controller.mappings.2": "(%s%s%s),",
"lambdacontrols.controller.mappings.3": "and put the mapping in `%s.minecraft/config/gamecontrollerdb.txt%s`.", "lambdacontrols.controller.mappings.3": "and put the mapping in `%s.minecraft/config/gamecontrollerdb.txt%s`.",
"lambdacontrols.controller.mappings.updated": "Updated mappings!", "lambdacontrols.controller.mappings.updated": "Updated mappings!",
"lambdacontrols.controller_type.default": "default", "lambdacontrols.controller_type.default": "default",

View File

@@ -60,7 +60,6 @@
"lambdacontrols.controller.connected": "Manette %d connecté.", "lambdacontrols.controller.connected": "Manette %d connecté.",
"lambdacontrols.controller.disconnected": "Manette %d déconnecté.", "lambdacontrols.controller.disconnected": "Manette %d déconnecté.",
"lambdacontrols.controller.mappings.1": "Pour configurer les correspondances de la manette, veuillez utiliser %sSDL2 Gamepad Tool%s", "lambdacontrols.controller.mappings.1": "Pour configurer les correspondances de la manette, veuillez utiliser %sSDL2 Gamepad Tool%s",
"lambdacontrols.controller.mappings.2": "(%s%s%s),",
"lambdacontrols.controller.mappings.3": "et mettez les correspondances dans le fichier `%s.minecraft/config/gamecontrollerdb.txt%s`.", "lambdacontrols.controller.mappings.3": "et mettez les correspondances dans le fichier `%s.minecraft/config/gamecontrollerdb.txt%s`.",
"lambdacontrols.controller.mappings.updated": "Configuration des manettes mise à jour!", "lambdacontrols.controller.mappings.updated": "Configuration des manettes mise à jour!",
"lambdacontrols.controller_type.default": "default", "lambdacontrols.controller_type.default": "default",

View File

@@ -60,7 +60,6 @@
"lambdacontrols.controller.connected": "Manette %d connecté.", "lambdacontrols.controller.connected": "Manette %d connecté.",
"lambdacontrols.controller.disconnected": "Manette %d déconnecté.", "lambdacontrols.controller.disconnected": "Manette %d déconnecté.",
"lambdacontrols.controller.mappings.1": "Pour configurer les correspondances de la manette, veuillez utiliser %sSDL2 Gamepad Tool%s", "lambdacontrols.controller.mappings.1": "Pour configurer les correspondances de la manette, veuillez utiliser %sSDL2 Gamepad Tool%s",
"lambdacontrols.controller.mappings.2": "(%s%s%s),",
"lambdacontrols.controller.mappings.3": "et mettez les correspondances dans le fichier `%s.minecraft/config/gamecontrollerdb.txt%s`.", "lambdacontrols.controller.mappings.3": "et mettez les correspondances dans le fichier `%s.minecraft/config/gamecontrollerdb.txt%s`.",
"lambdacontrols.controller.mappings.updated": "Configuration des manettes mise à jour!", "lambdacontrols.controller.mappings.updated": "Configuration des manettes mise à jour!",
"lambdacontrols.controller_type.default": "default", "lambdacontrols.controller_type.default": "default",

View File

@@ -40,7 +40,7 @@ auto_switch_mode = false
# Controller's dead zone. # Controller's dead zone.
dead_zone = 0.20 dead_zone = 0.20
# Rotation speed for look directions. # Rotation speed for look directions.
rotation_speed = 40.0 rotation_speed = 10.0
# Mouse speed in GUI. # Mouse speed in GUI.
mouse_speed = 30.0 mouse_speed = 30.0
# Inverts the right X axis. # Inverts the right X axis.

View File

@@ -31,21 +31,22 @@
"lambdacontrols_compat.mixins.json" "lambdacontrols_compat.mixins.json"
], ],
"depends": { "depends": {
"fabricloader": ">=0.4.0", "fabricloader": ">=0.8.0",
"fabric": "*", "fabric": "*",
"minecraft": ">=1.15", "minecraft": ">=1.16",
"spruceui": ">=1.3.5" "spruceui": ">=1.5.1"
}, },
"recommends": { "recommends": {
"modmenu": ">=1.9.0", "modmenu": ">=1.12.2",
"okzoomer": ">=1.0.4" "okzoomer": ">=4.0.0"
}, },
"suggests": { "suggests": {
"flamingo": "*", "flamingo": "*",
"roughlyenoughitems": ">=3.4.5" "roughlyenoughitems": ">=4.5.5"
}, },
"breaks": { "breaks": {
"modmenu": "<1.9.0" "modmenu": "<1.12.2",
"optifabric": "*"
}, },
"custom": { "custom": {
"modmenu:clientsideOnly": true "modmenu:clientsideOnly": true

View File

@@ -5,7 +5,6 @@
"client": [ "client": [
"AbstractButtonWidgetAccessor", "AbstractButtonWidgetAccessor",
"AdvancementsScreenAccessor", "AdvancementsScreenAccessor",
"ContainerScreenMixin",
"ClientPlayerEntityMixin", "ClientPlayerEntityMixin",
"ClientPlayNetworkHandlerMixin", "ClientPlayNetworkHandlerMixin",
"ControlsOptionsScreenMixin", "ControlsOptionsScreenMixin",
@@ -13,11 +12,12 @@
"EntryListWidgetAccessor", "EntryListWidgetAccessor",
"GameOptionsMixin", "GameOptionsMixin",
"GameRendererMixin", "GameRendererMixin",
"HandledScreenMixin",
"KeyBindingMixin", "KeyBindingMixin",
"MinecraftClientMixin", "MinecraftClientMixin",
"MouseMixin", "MouseMixin",
"OptionsScreenMixin",
"RecipeBookWidgetAccessor", "RecipeBookWidgetAccessor",
"SettingsScreenMixin",
"WorldRendererMixin" "WorldRendererMixin"
], ],
"injectors": { "injectors": {

View File

@@ -3,17 +3,17 @@ org.gradle.jvmargs=-Xmx1G
# Fabric Properties # Fabric Properties
# check these on https://fabricmc.net/use # check these on https://fabricmc.net/use
minecraft_version=1.15.2 minecraft_version=1.16.1
yarn_mappings=1.15.2+build.14:v2 yarn_mappings=1.16.1+build.9:v2
loader_version=0.7.6+build.180 loader_version=0.8.8+build.202
# Mod Properties # Mod Properties
mod_version = 1.2.0 mod_version = 1.3.0
maven_group = me.lambdaurora maven_group = me.lambdaurora
archives_base_name = lambdacontrols archives_base_name = lambdacontrols
# Dependencies # Dependencies
# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api
fabric_version=0.4.29+build.290-1.15 fabric_version=0.14.0+build.371-1.16
spruceui_version=1.3.5 spruceui_version=1.5.1
modmenu_version=1.10.1+build.30 modmenu_version=1.12.2+build.17