Reformat code and update networking.

This commit is contained in:
LambdAurora
2021-03-17 00:51:34 +01:00
parent f89eebf0e7
commit 400b625716
60 changed files with 504 additions and 837 deletions

View File

@@ -8,7 +8,7 @@ yarn_mappings=1.16.5+build.5
loader_version=0.11.3
# Mod Properties
mod_version = 1.6.0
mod_version = 1.6.0-dev1
maven_group = dev.lambdaurora.lambdacontrols
archives_base_name = lambdacontrols

View File

@@ -22,8 +22,7 @@ import java.util.Optional;
* @version 1.1.0
* @since 1.0.0
*/
public enum ControlsMode implements Nameable
{
public enum ControlsMode implements Nameable {
DEFAULT,
CONTROLLER,
TOUCHSCREEN;
@@ -33,8 +32,7 @@ public enum ControlsMode implements Nameable
*
* @return The next available controls mode.
*/
public ControlsMode next()
{
public ControlsMode next() {
ControlsMode[] v = values();
if (v.length == this.ordinal() + 1)
return v[0];
@@ -47,14 +45,12 @@ public enum ControlsMode implements Nameable
* @return The translated key of this controls mode.
* @since 1.1.0
*/
public String getTranslationKey()
{
public String getTranslationKey() {
return "lambdacontrols.controls_mode." + this.getName();
}
@Override
public @NotNull String getName()
{
public @NotNull String getName() {
return this.name().toLowerCase();
}
@@ -64,8 +60,7 @@ public enum ControlsMode implements Nameable
* @param id The identifier of the controls mode.
* @return The controls mode if found, else empty.
*/
public static Optional<ControlsMode> byId(@NotNull String id)
{
public static Optional<ControlsMode> byId(@NotNull String id) {
return Arrays.stream(values()).filter(mode -> mode.getName().equalsIgnoreCase(id)).findFirst();
}
}

View File

@@ -32,20 +32,18 @@ import java.util.Optional;
* @version 1.6.0
* @since 1.0.0
*/
public class LambdaControls implements ModInitializer
{
private static LambdaControls INSTANCE;
public static final Identifier CONTROLS_MODE_CHANNEL = new Identifier(LambdaControlsConstants.CONTROLS_MODE_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 class LambdaControls implements ModInitializer {
private static LambdaControls INSTANCE;
public static final Identifier CONTROLS_MODE_CHANNEL = new Identifier(LambdaControlsConstants.CONTROLS_MODE_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 TranslatableText NOT_BOUND_TEXT = new TranslatableText("lambdacontrols.not_bound");
public final Logger logger = LogManager.getLogger("LambdaControls");
@Override
public void onInitialize()
{
public void onInitialize() {
INSTANCE = this;
this.log("Initializing LambdaControls...");
@@ -69,8 +67,7 @@ public class LambdaControls implements ModInitializer
*
* @param info The message to print.
*/
public void log(String info)
{
public void log(String info) {
this.logger.info("[LambdaControls] " + info);
}
@@ -79,8 +76,7 @@ public class LambdaControls implements ModInitializer
*
* @param warning The warning to print.
*/
public void warn(String warning)
{
public void warn(String warning) {
this.logger.info("[LambdaControls] " + warning);
}
@@ -90,8 +86,7 @@ public class LambdaControls implements ModInitializer
* @param controlsMode The controls mode to send.
* @return The packet byte buffer.
*/
public PacketByteBuf makeControlsModeBuffer(@NotNull ControlsMode controlsMode)
{
public PacketByteBuf makeControlsModeBuffer(@NotNull ControlsMode controlsMode) {
Objects.requireNonNull(controlsMode, "Controls mode cannot be null.");
return new PacketByteBuf(Unpooled.buffer()).writeString(controlsMode.getName(), 32);
}
@@ -102,16 +97,14 @@ public class LambdaControls implements ModInitializer
* @param feature The feature data to send.
* @return The packet byte buffer.
*/
public PacketByteBuf makeFeatureBuffer(@NotNull LambdaControlsFeature feature)
{
public PacketByteBuf makeFeatureBuffer(@NotNull LambdaControlsFeature feature) {
Objects.requireNonNull(feature, "Feature cannot be null.");
PacketByteBuf buffer = new PacketByteBuf(Unpooled.buffer()).writeString(feature.getName(), 64);
buffer.writeBoolean(feature.isAllowed());
return buffer;
}
public PacketByteBuf makeHello(@NotNull ControlsMode controlsMode)
{
public PacketByteBuf makeHello(@NotNull ControlsMode controlsMode) {
String version = "";
Optional<ModContainer> container;
if ((container = FabricLoader.getInstance().getModContainer(LambdaControlsConstants.NAMESPACE)).isPresent()) {
@@ -125,8 +118,7 @@ public class LambdaControls implements ModInitializer
*
* @return The LambdaControls instance.
*/
public static LambdaControls get()
{
public static LambdaControls get() {
return INSTANCE;
}
}

View File

@@ -18,10 +18,9 @@ import org.aperlambda.lambdacommon.Identifier;
* @version 1.1.0
* @since 1.1.0
*/
public class LambdaControlsConstants
{
public static final String NAMESPACE = "lambdacontrols";
public class LambdaControlsConstants {
public static final String NAMESPACE = "lambdacontrols";
public static final Identifier CONTROLS_MODE_CHANNEL = new Identifier(NAMESPACE, "controls_mode");
public static final Identifier FEATURE_CHANNEL = new Identifier(NAMESPACE, "feature");
public static final Identifier HELLO_CHANNEL = new Identifier(NAMESPACE, "hello");
public static final Identifier FEATURE_CHANNEL = new Identifier(NAMESPACE, "feature");
public static final Identifier HELLO_CHANNEL = new Identifier(NAMESPACE, "hello");
}

View File

@@ -24,37 +24,33 @@ import java.util.Optional;
* @version 1.5.0
* @since 1.1.0
*/
public class LambdaControlsFeature implements Nameable
{
private static final List<LambdaControlsFeature> FEATURES = new ArrayList<>();
public static final LambdaControlsFeature FAST_BLOCK_PLACING = new LambdaControlsFeature("fast_block_placing", true, true);
public static final LambdaControlsFeature HORIZONTAL_REACHAROUND = new LambdaControlsFeature("horizontal_reacharound", true, false);
public static final LambdaControlsFeature VERTICAL_REACHAROUND = new LambdaControlsFeature("vertical_reacharound", true, false);
public class LambdaControlsFeature implements Nameable {
private static final List<LambdaControlsFeature> FEATURES = new ArrayList<>();
public static final LambdaControlsFeature FAST_BLOCK_PLACING = new LambdaControlsFeature("fast_block_placing", true, true);
public static final LambdaControlsFeature HORIZONTAL_REACHAROUND = new LambdaControlsFeature("horizontal_reacharound", true, false);
public static final LambdaControlsFeature VERTICAL_REACHAROUND = new LambdaControlsFeature("vertical_reacharound", true, false);
private final String key;
private final String key;
private final boolean defaultAllowed;
private boolean allowed;
private boolean allowed;
private final boolean defaultEnabled;
private boolean enabled;
private boolean enabled;
public LambdaControlsFeature(@NotNull String key, boolean allowed, boolean enabled)
{
public LambdaControlsFeature(@NotNull String key, boolean allowed, boolean enabled) {
Objects.requireNonNull(key, "Feature key cannot be null.");
this.key = key;
this.setAllowed(this.defaultAllowed = allowed);
this.setEnabled(this.defaultEnabled = enabled);
}
public LambdaControlsFeature(@NotNull String key)
{
public LambdaControlsFeature(@NotNull String key) {
this(key, false, false);
}
/**
* Allows the feature.
*/
public void allow()
{
public void allow() {
this.setAllowed(true);
}
@@ -63,8 +59,7 @@ public class LambdaControlsFeature implements Nameable
*
* @return True if this feature is allowed, else false.
*/
public boolean isAllowed()
{
public boolean isAllowed() {
return this.allowed;
}
@@ -73,16 +68,14 @@ public class LambdaControlsFeature implements Nameable
*
* @param allowed True if this feature is allowed, else false.
*/
public void setAllowed(boolean allowed)
{
public void setAllowed(boolean allowed) {
this.allowed = allowed;
}
/**
* Resets allowed state to default.
*/
public void resetAllowed()
{
public void resetAllowed() {
this.setAllowed(this.defaultAllowed);
}
@@ -91,8 +84,7 @@ public class LambdaControlsFeature implements Nameable
*
* @return True if this feature is enabled, else false.
*/
public boolean isEnabled()
{
public boolean isEnabled() {
return this.enabled;
}
@@ -101,8 +93,7 @@ public class LambdaControlsFeature implements Nameable
*
* @param enabled True if this feature is enabled, else false.
*/
public void setEnabled(boolean enabled)
{
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
@@ -113,28 +104,24 @@ public class LambdaControlsFeature implements Nameable
* @see #isAllowed()
* @see #isEnabled()
*/
public boolean isAvailable()
{
public boolean isAvailable() {
return this.isAllowed() && this.isEnabled();
}
/**
* Resets the feature to its default values.
*/
public void reset()
{
public void reset() {
this.resetAllowed();
this.setEnabled(this.defaultEnabled);
}
@Override
public @NotNull String getName()
{
public @NotNull String getName() {
return this.key;
}
public static @NotNull Optional<LambdaControlsFeature> fromName(@NotNull String key)
{
public static @NotNull Optional<LambdaControlsFeature> fromName(@NotNull String key) {
Objects.requireNonNull(key, "Cannot find features with a null name.");
return FEATURES.parallelStream().filter(feature -> feature.getName().equals(key)).findFirst();
}
@@ -142,16 +129,14 @@ public class LambdaControlsFeature implements Nameable
/**
* Resets all features to their default values.
*/
public static void resetAll()
{
public static void resetAll() {
FEATURES.parallelStream().forEach(LambdaControlsFeature::reset);
}
/**
* Resets all features to allow state.
*/
public static void resetAllAllowed()
{
public static void resetAllAllowed() {
FEATURES.parallelStream().forEach(LambdaControlsFeature::resetAllowed);
}

View File

@@ -16,8 +16,7 @@ package dev.lambdaurora.lambdacontrols.client;
* @version 1.1.0
* @since 1.1.0
*/
public enum ButtonState
{
public enum ButtonState {
NONE(0),
PRESS(1),
RELEASE(2),
@@ -25,8 +24,7 @@ public enum ButtonState
public final int id;
ButtonState(int id)
{
ButtonState(int id) {
this.id = id;
}
@@ -35,8 +33,7 @@ public enum ButtonState
*
* @return True if this state is a pressed state, else false.
*/
public boolean isPressed()
{
public boolean isPressed() {
return this == PRESS || this == REPEAT;
}
@@ -45,8 +42,7 @@ public enum ButtonState
*
* @return True if this state is an unpressed state, else false.
*/
public boolean isUnpressed()
{
public boolean isUnpressed() {
return this == RELEASE || this == NONE;
}
}

View File

@@ -25,8 +25,7 @@ import java.util.Optional;
* @version 1.4.3
* @since 1.0.0
*/
public enum ControllerType implements Nameable
{
public enum ControllerType implements Nameable {
DEFAULT(0),
DUALSHOCK(1),
SWITCH(2),
@@ -35,17 +34,15 @@ public enum ControllerType implements Nameable
STEAM(5),
OUYA(6);
private final int id;
private final int id;
private final Text text;
ControllerType(int id)
{
ControllerType(int id) {
this.id = id;
this.text = new TranslatableText("lambdacontrols.controller_type." + this.getName());
}
ControllerType(int id, @NotNull Text text)
{
ControllerType(int id, @NotNull Text text) {
this.id = id;
this.text = text;
}
@@ -55,8 +52,7 @@ public enum ControllerType implements Nameable
*
* @return The controller type's identifier.
*/
public int getId()
{
public int getId() {
return this.id;
}
@@ -65,8 +61,7 @@ public enum ControllerType implements Nameable
*
* @return The next available controller type.
*/
public @NotNull ControllerType next()
{
public @NotNull ControllerType next() {
ControllerType[] v = values();
if (v.length == this.ordinal() + 1)
return v[0];
@@ -78,14 +73,12 @@ public enum ControllerType implements Nameable
*
* @return The translated text of this controller type.
*/
public @NotNull Text getTranslatedText()
{
public @NotNull Text getTranslatedText() {
return this.text;
}
@Override
public @NotNull String getName()
{
public @NotNull String getName() {
return this.name().toLowerCase();
}
@@ -95,8 +88,7 @@ public enum ControllerType implements Nameable
* @param id The identifier of the controller type.
* @return The controller type if found, else empty.
*/
public static @NotNull Optional<ControllerType> byId(@NotNull String id)
{
public static @NotNull Optional<ControllerType> byId(@NotNull String id) {
return Arrays.stream(values()).filter(mode -> mode.getName().equalsIgnoreCase(id)).findFirst();
}
}

View File

@@ -24,15 +24,13 @@ import java.util.Optional;
* @version 1.4.0
* @since 1.0.0
*/
public enum HudSide implements Nameable
{
public enum HudSide implements Nameable {
LEFT,
RIGHT;
private final Text text;
HudSide()
{
HudSide() {
this.text = new TranslatableText(this.getTranslationKey());
}
@@ -41,8 +39,7 @@ public enum HudSide implements Nameable
*
* @return The next available side.
*/
public @NotNull HudSide next()
{
public @NotNull HudSide next() {
HudSide[] v = values();
if (v.length == this.ordinal() + 1)
return v[0];
@@ -54,8 +51,7 @@ public enum HudSide implements Nameable
*
* @return The translation key of this hude side.
*/
public @NotNull String getTranslationKey()
{
public @NotNull String getTranslationKey() {
return "lambdacontrols.hud_side." + this.getName();
}
@@ -64,14 +60,12 @@ public enum HudSide implements Nameable
*
* @return The translated text of this hud side.
*/
public @NotNull Text getTranslatedText()
{
public @NotNull Text getTranslatedText() {
return this.text;
}
@Override
public @NotNull String getName()
{
public @NotNull String getName() {
return this.name().toLowerCase();
}
@@ -81,8 +75,7 @@ public enum HudSide implements Nameable
* @param id The identifier of the hud side.
* @return The hud side if found, else empty.
*/
public static @NotNull Optional<HudSide> byId(@NotNull String id)
{
public static @NotNull Optional<HudSide> byId(@NotNull String id) {
return Arrays.stream(values()).filter(mode -> mode.getName().equalsIgnoreCase(id)).findFirst();
}
}

View File

@@ -10,24 +10,26 @@
package dev.lambdaurora.lambdacontrols.client;
import dev.lambdaurora.lambdacontrols.ControlsMode;
import dev.lambdaurora.lambdacontrols.LambdaControls;
import dev.lambdaurora.lambdacontrols.LambdaControlsConstants;
import dev.lambdaurora.lambdacontrols.LambdaControlsFeature;
import dev.lambdaurora.lambdacontrols.client.compat.LambdaControlsCompat;
import dev.lambdaurora.lambdacontrols.client.controller.ButtonBinding;
import dev.lambdaurora.lambdacontrols.client.controller.Controller;
import dev.lambdaurora.lambdacontrols.client.controller.InputManager;
import dev.lambdaurora.lambdacontrols.client.gui.LambdaControlsHud;
import dev.lambdaurora.lambdacontrols.client.gui.TouchscreenOverlay;
import dev.lambdaurora.lambdacontrols.client.ring.KeyBindingRingAction;
import dev.lambdaurora.lambdacontrols.client.ring.LambdaRing;
import dev.lambdaurora.lambdacontrols.LambdaControls;
import dev.lambdaurora.lambdacontrols.client.controller.ButtonBinding;
import dev.lambdaurora.lambdacontrols.client.controller.Controller;
import dev.lambdaurora.lambdacontrols.client.controller.InputManager;
import me.lambdaurora.spruceui.event.OpenScreenCallback;
import me.lambdaurora.spruceui.hud.HudManager;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
import net.fabricmc.fabric.api.network.ClientSidePacketRegistry;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.client.options.KeyBinding;
import net.minecraft.client.toast.SystemToast;
import net.minecraft.client.util.InputUtil;
@@ -43,36 +45,34 @@ import java.io.File;
* Represents the LambdaControls client mod.
*
* @author LambdAurora
* @version 1.5.0
* @version 1.6.0
* @since 1.1.0
*/
public class LambdaControlsClient extends LambdaControls implements ClientModInitializer
{
private static LambdaControlsClient INSTANCE;
public static final KeyBinding BINDING_LOOK_UP = InputManager.makeKeyBinding(new Identifier(LambdaControlsConstants.NAMESPACE, "look_up"),
public class LambdaControlsClient extends LambdaControls implements ClientModInitializer {
private static LambdaControlsClient INSTANCE;
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");
public static final KeyBinding BINDING_LOOK_RIGHT = InputManager.makeKeyBinding(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");
public static final KeyBinding BINDING_LOOK_DOWN = InputManager.makeKeyBinding(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");
public static final KeyBinding BINDING_LOOK_LEFT = InputManager.makeKeyBinding(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");
/*public static final KeyBinding BINDING_RING = InputManager.makeKeyBinding(new Identifier(LambdaControlsConstants.NAMESPACE, "ring"),
InputUtil.Type.MOUSE, GLFW.GLFW_MOUSE_BUTTON_5, "key.categories.misc");*/
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 CURSOR_TEXTURE = new Identifier(LambdaControlsConstants.NAMESPACE, "textures/gui/cursor.png");
public final static File MAPPINGS_FILE = new File("config/gamecontrollerdb.txt");
public final LambdaControlsConfig config = new LambdaControlsConfig(this);
public final LambdaInput input = new LambdaInput(this);
public final LambdaRing ring = new LambdaRing(this);
public final LambdaReacharound reacharound = new LambdaReacharound();
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 CURSOR_TEXTURE = new Identifier(LambdaControlsConstants.NAMESPACE, "textures/gui/cursor.png");
public final static File MAPPINGS_FILE = new File("config/gamecontrollerdb.txt");
public final LambdaControlsConfig config = new LambdaControlsConfig(this);
public final LambdaInput input = new LambdaInput(this);
public final LambdaRing ring = new LambdaRing(this);
public final LambdaReacharound reacharound = new LambdaReacharound();
private LambdaControlsHud hud;
private ControlsMode previousControlsMode;
@Override
public void onInitializeClient()
{
public void onInitializeClient() {
INSTANCE = this;
KeyBindingHelper.registerKeyBinding(BINDING_LOOK_UP);
KeyBindingHelper.registerKeyBinding(BINDING_LOOK_RIGHT);
@@ -82,13 +82,19 @@ public class LambdaControlsClient extends LambdaControls implements ClientModIni
this.ring.registerAction("keybinding", KeyBindingRingAction.FACTORY);
ClientSidePacketRegistry.INSTANCE.register(CONTROLS_MODE_CHANNEL, (context, attachedData) -> context.getTaskQueue()
.execute(() -> ClientSidePacketRegistry.INSTANCE.sendToServer(CONTROLS_MODE_CHANNEL, this.makeControlsModeBuffer(this.config.getControlsMode()))));
ClientSidePacketRegistry.INSTANCE.register(FEATURE_CHANNEL, (context, attachedData) -> {
String name = attachedData.readString(64);
boolean allowed = attachedData.readBoolean();
LambdaControlsFeature.fromName(name).ifPresent(feature -> context.getTaskQueue().execute(() -> feature.setAllowed(allowed)));
ClientPlayNetworking.registerGlobalReceiver(CONTROLS_MODE_CHANNEL, (client, handler, buf, responseSender) -> {
responseSender.sendPacket(CONTROLS_MODE_CHANNEL, this.makeControlsModeBuffer(this.config.getControlsMode()));
});
ClientPlayNetworking.registerGlobalReceiver(FEATURE_CHANNEL, (client, handler, buf, responseSender) -> {
String name = buf.readString(64);
boolean allowed = buf.readBoolean();
LambdaControlsFeature.fromName(name).ifPresent(feature -> client.execute(() -> feature.setAllowed(allowed)));
});
ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> {
sender.sendPacket(HELLO_CHANNEL, this.makeHello(this.config.getControlsMode()));
sender.sendPacket(CONTROLS_MODE_CHANNEL, this.makeControlsModeBuffer(this.config.getControlsMode()));
});
ClientPlayConnectionEvents.DISCONNECT.register(this::onLeave);
ClientTickEvents.START_CLIENT_TICK.register(this.reacharound::tick);
ClientTickEvents.END_CLIENT_TICK.register(this::onTick);
@@ -110,8 +116,7 @@ public class LambdaControlsClient extends LambdaControls implements ClientModIni
/**
* This method is called when Minecraft is initializing.
*/
public void onMcInit(@NotNull MinecraftClient client)
{
public void onMcInit(@NotNull MinecraftClient client) {
ButtonBinding.init(client.options);
this.config.load();
this.hud.setVisible(this.config.isHudEnabled());
@@ -135,10 +140,9 @@ public class LambdaControlsClient extends LambdaControls implements ClientModIni
/**
* This method is called every Minecraft tick.
*
* @param client The client instance.
* @param client the client instance
*/
public void onTick(@NotNull MinecraftClient client)
{
public void onTick(@NotNull MinecraftClient client) {
this.input.tick(client);
if (this.config.getControlsMode() == ControlsMode.CONTROLLER && (client.isWindowFocused() || this.config.hasUnfocusedInput()))
this.input.tickController(client);
@@ -148,24 +152,21 @@ public class LambdaControlsClient extends LambdaControls implements ClientModIni
}*/
}
public void onRender(MinecraftClient client)
{
public void onRender(MinecraftClient client) {
this.input.onRender(client.getTickDelta(), client);
}
/**
* Called when leaving a server.
*/
public void onLeave()
{
public void onLeave(ClientPlayNetworkHandler handler, MinecraftClient client) {
LambdaControlsFeature.resetAllAllowed();
}
/**
* Switches the controls mode if the auto switch is enabled.
*/
public void switchControlsMode()
{
public void switchControlsMode() {
if (this.config.hasAutoSwitchMode()) {
if (this.config.getController().isGamepad()) {
this.previousControlsMode = this.config.getControlsMode();
@@ -185,8 +186,7 @@ public class LambdaControlsClient extends LambdaControls implements ClientModIni
*
* @param enabled True if the HUD is enabled, else false.
*/
public void setHudEnabled(boolean enabled)
{
public void setHudEnabled(boolean enabled) {
this.config.setHudEnabled(enabled);
this.hud.setVisible(enabled);
}
@@ -196,8 +196,7 @@ public class LambdaControlsClient extends LambdaControls implements ClientModIni
*
* @return The LambdaControls client instance.
*/
public static LambdaControlsClient get()
{
public static LambdaControlsClient get() {
return INSTANCE;
}
}

View File

@@ -20,11 +20,9 @@ import io.github.prospector.modmenu.api.ModMenuApi;
* @version 1.3.0
* @since 1.1.0
*/
public class LambdaControlsModMenu implements ModMenuApi
{
public class LambdaControlsModMenu implements ModMenuApi {
@Override
public ConfigScreenFactory<?> getModConfigScreenFactory()
{
public ConfigScreenFactory<?> getModConfigScreenFactory() {
return parent -> new LambdaControlsSettingsScreen(parent, false);
}
}

View File

@@ -217,7 +217,7 @@ public class LambdaInput {
this.mouseSpeedX = this.mouseSpeedY = 0.0F;
INPUT_MANAGER.resetMousePosition(windowWidth, windowHeight);
} else if (isScreenInteractive(client.currentScreen) && this.config.hasVirtualMouse()) {
((MouseAccessor) client.mouse).lambdacontrols_onCursorPos(client.getWindow().getHandle(), 0, 0);
((MouseAccessor) client.mouse).lambdacontrols$onCursorPos(client.getWindow().getHandle(), 0, 0);
INPUT_MANAGER.resetMouseTarget(client);
}
this.inventoryInteractionCooldown = 5;
@@ -378,13 +378,13 @@ public class LambdaInput {
HandledScreen screen = (HandledScreen) client.currentScreen;
HandledScreenAccessor accessor = (HandledScreenAccessor) screen;
Slot slot = ((HandledScreenAccessor) client.currentScreen).lambdacontrols_getSlotAt(x, y);
Slot slot = ((HandledScreenAccessor) client.currentScreen).lambdacontrols$getSlotAt(x, y);
int slotId;
if (slot == null) {
if (client.player.inventory.getCursorStack().isEmpty())
return false;
slotId = accessor.lambdacontrols_isClickOutsideBounds(x, y, accessor.getX(), accessor.getY(), GLFW_MOUSE_BUTTON_1) ? -999 : -1;
slotId = accessor.lambdacontrols$isClickOutsideBounds(x, y, accessor.getX(), accessor.getY(), GLFW_MOUSE_BUTTON_1) ? -999 : -1;
} else {
slotId = slot.id;
}
@@ -394,7 +394,7 @@ public class LambdaInput {
switch (button) {
case GLFW_GAMEPAD_BUTTON_A:
if (screen instanceof CreativeInventoryScreen)
if (((CreativeInventoryScreenAccessor) screen).lambdacontrols_isCreativeInventorySlot(slot))
if (((CreativeInventoryScreenAccessor) screen).lambdacontrols$isCreativeInventorySlot(slot))
actionType = SlotActionType.CLONE;
if (slot != null && LambdaControlsCompat.streamCompatHandlers().anyMatch(handler -> handler.isCreativeSlot(screen, slot)))
actionType = SlotActionType.CLONE;
@@ -409,7 +409,7 @@ public class LambdaInput {
return false;
}
accessor.lambdacontrols_onMouseClick(slot, slotId, clickData, actionType);
accessor.lambdacontrols$onMouseClick(slot, slotId, clickData, actionType);
return true;
}
@@ -501,7 +501,7 @@ public class LambdaInput {
CreativeInventoryScreen screen = (CreativeInventoryScreen) client.currentScreen;
CreativeInventoryScreenAccessor accessor = (CreativeInventoryScreenAccessor) screen;
// @TODO allow rebinding to left stick
if (accessor.lambdacontrols_hasScrollbar() && absValue >= deadZone) {
if (accessor.lambdacontrols$hasScrollbar() && absValue >= deadZone) {
screen.mouseScrolled(0.0, 0.0, -value);
}
return;
@@ -655,7 +655,7 @@ public class LambdaInput {
this.actionGuiCooldown = 2; // Prevent to press too quickly the focused element, so we have to skip 5 ticks.
return false;
} else if (element instanceof AlwaysSelectedEntryListWidget) {
((EntryListWidgetAccessor) element).lambdacontrols_moveSelection(right ? EntryListWidget.MoveDirection.UP : EntryListWidget.MoveDirection.DOWN);
((EntryListWidgetAccessor) element).lambdacontrols$moveSelection(right ? EntryListWidget.MoveDirection.UP : EntryListWidget.MoveDirection.DOWN);
return false;
} else if (element instanceof ParentElement) {
ParentElement entryList = (ParentElement) element;

View File

@@ -33,14 +33,12 @@ import org.jetbrains.annotations.Nullable;
* @version 1.5.0
* @since 1.3.2
*/
public class LambdaReacharound
{
private BlockHitResult lastReacharoundResult = null;
private boolean lastReacharoundVertical = false;
private boolean onSlab = false;
public class LambdaReacharound {
private BlockHitResult lastReacharoundResult = null;
private boolean lastReacharoundVertical = false;
private boolean onSlab = false;
public void tick(@NotNull MinecraftClient client)
{
public void tick(@NotNull MinecraftClient client) {
this.lastReacharoundResult = this.tryVerticalReachAround(client);
if (this.lastReacharoundResult == null) {
this.lastReacharoundResult = this.tryHorizontalReachAround(client);
@@ -53,8 +51,7 @@ public class LambdaReacharound
*
* @return The last reach around result.
*/
public @Nullable BlockHitResult getLastReacharoundResult()
{
public @Nullable BlockHitResult getLastReacharoundResult() {
return this.lastReacharoundResult;
}
@@ -63,8 +60,7 @@ public class LambdaReacharound
*
* @return True if the reach around is vertical.
*/
public boolean isLastReacharoundVertical()
{
public boolean isLastReacharoundVertical() {
return this.lastReacharoundVertical;
}
@@ -73,13 +69,11 @@ public class LambdaReacharound
*
* @return True if reacharound is available, else false.
*/
public boolean isReacharoundAvailable()
{
public boolean isReacharoundAvailable() {
return LambdaControlsFeature.HORIZONTAL_REACHAROUND.isAvailable() || LambdaControlsFeature.VERTICAL_REACHAROUND.isAvailable();
}
private float getPlayerRange(@NotNull MinecraftClient client)
{
private float getPlayerRange(@NotNull MinecraftClient client) {
return client.interactionManager != null ? client.interactionManager.getReachDistance() : 0.f;
}
@@ -89,8 +83,7 @@ public class LambdaReacharound
* @param client The client instance.
* @return A block hit result if vertical reach-around is possible, else null.
*/
public @Nullable BlockHitResult tryVerticalReachAround(@NotNull MinecraftClient client)
{
public @Nullable BlockHitResult tryVerticalReachAround(@NotNull MinecraftClient client) {
if (!LambdaControlsFeature.VERTICAL_REACHAROUND.isAvailable())
return null;
if (client.player == null || client.world == null || client.crosshairTarget == null || client.crosshairTarget.getType() != HitResult.Type.MISS
@@ -122,8 +115,7 @@ public class LambdaReacharound
* @param client The client instance.
* @return A block hit result if horizontal reach-around is possible.
*/
public @Nullable BlockHitResult tryHorizontalReachAround(@NotNull MinecraftClient client)
{
public @Nullable BlockHitResult tryHorizontalReachAround(@NotNull MinecraftClient client) {
if (!LambdaControlsFeature.HORIZONTAL_REACHAROUND.isAvailable())
return null;
@@ -156,15 +148,13 @@ public class LambdaReacharound
return null;
}
public @NotNull BlockHitResult withSideForReacharound(@NotNull BlockHitResult result, @Nullable ItemStack stack)
{
public @NotNull BlockHitResult withSideForReacharound(@NotNull BlockHitResult result, @Nullable ItemStack stack) {
if (stack == null || stack.isEmpty() || !(stack.getItem() instanceof BlockItem))
return result;
return withSideForReacharound(result, Block.getBlockFromItem(stack.getItem()));
}
public @NotNull BlockHitResult withSideForReacharound(@NotNull BlockHitResult result, @NotNull Block block)
{
public @NotNull BlockHitResult withSideForReacharound(@NotNull BlockHitResult result, @NotNull Block block) {
if (block instanceof SlabBlock) {
if (this.onSlab) result = result.withSide(Direction.UP);
else result = result.withSide(Direction.DOWN);

View File

@@ -23,18 +23,16 @@ import java.util.Optional;
* @version 1.4.0
* @since 1.2.0
*/
public enum VirtualMouseSkin implements Nameable
{
public enum VirtualMouseSkin implements Nameable {
DEFAULT_LIGHT("default_light"),
DEFAULT_DARK("default_dark"),
SECOND_LIGHT("second_light"),
SECOND_DARK("second_dark");
private final String name;
private final Text text;
private final Text text;
VirtualMouseSkin(String name)
{
VirtualMouseSkin(String name) {
this.name = name;
this.text = new TranslatableText(this.getTranslationKey());
}
@@ -44,8 +42,7 @@ public enum VirtualMouseSkin implements Nameable
*
* @return The next available virtual mouse skin.
*/
public @NotNull VirtualMouseSkin next()
{
public @NotNull VirtualMouseSkin next() {
VirtualMouseSkin[] v = values();
if (v.length == this.ordinal() + 1)
return v[0];
@@ -57,8 +54,7 @@ public enum VirtualMouseSkin implements Nameable
*
* @return The virtual mouse skin's translation key.
*/
public @NotNull String getTranslationKey()
{
public @NotNull String getTranslationKey() {
return "lambdacontrols.virtual_mouse.skin." + this.getName();
}
@@ -67,14 +63,12 @@ public enum VirtualMouseSkin implements Nameable
*
* @return The translated text of this virtual mouse skin.
*/
public @NotNull Text getTranslatedText()
{
public @NotNull Text getTranslatedText() {
return this.text;
}
@Override
public @NotNull String getName()
{
public @NotNull String getName() {
return this.name;
}
@@ -84,8 +78,7 @@ public enum VirtualMouseSkin implements Nameable
* @param id The identifier of the virtual mouse skin.
* @return The virtual mouse skin if found, else empty.
*/
public static @NotNull Optional<VirtualMouseSkin> byId(@NotNull String id)
{
public static @NotNull Optional<VirtualMouseSkin> byId(@NotNull String id) {
return Arrays.stream(values()).filter(mode -> mode.getName().equalsIgnoreCase(id)).findFirst();
}
}

View File

@@ -26,8 +26,7 @@ import org.jetbrains.annotations.Nullable;
* @version 1.5.0
* @since 1.1.0
*/
public interface CompatHandler
{
public interface CompatHandler {
/**
* Handles compatibility of a mod.
*
@@ -41,8 +40,7 @@ public interface CompatHandler
* @param screen The screen.
* @return True if the mouse is required on the specified screen, else false.
*/
default boolean requireMouseOnScreen(Screen screen)
{
default boolean requireMouseOnScreen(Screen screen) {
return false;
}
@@ -55,8 +53,7 @@ public interface CompatHandler
* @return A slot if present, else null.
* @since 1.5.0
*/
default @Nullable Pair<Integer, Integer> getSlotAt(@NotNull Screen screen, int mouseX, int mouseY)
{
default @Nullable Pair<Integer, Integer> getSlotAt(@NotNull Screen screen, int mouseX, int mouseY) {
return null;
}
@@ -64,35 +61,32 @@ public interface CompatHandler
* Returns whether the current slot is a creative slot or not.
*
* @param screen The screen.
* @param slot The slot to check.
* @param slot The slot to check.
* @return True if the slot is a creative slot, else false.
*/
default boolean isCreativeSlot(@NotNull HandledScreen screen, @NotNull Slot slot)
{
default boolean isCreativeSlot(@NotNull HandledScreen screen, @NotNull Slot slot) {
return false;
}
/**
* Returns a custom translation key to make custom attack action strings on the HUD.
*
* @param client The client instance.
* @param client The client instance.
* @param placeResult The last place block result.
* @return Null if untouched, else a translation key.
*/
default String getAttackActionAt(@NotNull MinecraftClient client, @Nullable BlockHitResult placeResult)
{
default String getAttackActionAt(@NotNull MinecraftClient client, @Nullable BlockHitResult placeResult) {
return null;
}
/**
* Returns a custom translation key to make custom use action strings on the HUD.
*
* @param client The client instance.
* @param client The client instance.
* @param placeResult The last place block result.
* @return Null if untouched, else a translation key.
*/
default String getUseActionAt(@NotNull MinecraftClient client, @Nullable BlockHitResult placeResult)
{
default String getUseActionAt(@NotNull MinecraftClient client, @Nullable BlockHitResult placeResult) {
return null;
}
@@ -103,8 +97,7 @@ public interface CompatHandler
* @param screen The screen.
* @return True if the handle was fired and succeed, else false.
*/
default boolean handleMenuBack(@NotNull MinecraftClient client, @NotNull Screen screen)
{
default boolean handleMenuBack(@NotNull MinecraftClient client, @NotNull Screen screen) {
return false;
}
}

View File

@@ -25,20 +25,17 @@ import java.util.Optional;
* @version 1.3.2
* @since 1.3.2
*/
public class HQMCompat implements CompatHandler
{
public static final String GUI_BASE_CLASS_PATH = "hardcorequesting.client.interfaces.GuiBase";
private Optional<Class<?>> guiBaseClass;
public class HQMCompat implements CompatHandler {
public static final String GUI_BASE_CLASS_PATH = "hardcorequesting.client.interfaces.GuiBase";
private Optional<Class<?>> guiBaseClass;
@Override
public void handle(@NotNull LambdaControlsClient mod)
{
public void handle(@NotNull LambdaControlsClient mod) {
this.guiBaseClass = LambdaReflection.getClass(GUI_BASE_CLASS_PATH);
}
@Override
public boolean requireMouseOnScreen(Screen screen)
{
public boolean requireMouseOnScreen(Screen screen) {
return this.guiBaseClass.map(clazz -> clazz.isInstance(screen)).orElse(false);
}
}

View File

@@ -31,8 +31,7 @@ import java.util.stream.Stream;
* @version 1.5.0
* @since 1.1.0
*/
public class LambdaControlsCompat
{
public class LambdaControlsCompat {
private static final List<CompatHandler> HANDLERS = new ArrayList<>();
/**
@@ -40,8 +39,7 @@ public class LambdaControlsCompat
*
* @param mod The mod instance.
*/
public static void init(@NotNull LambdaControlsClient mod)
{
public static void init(@NotNull LambdaControlsClient mod) {
if (FabricLoader.getInstance().isModLoaded("okzoomer")) {
mod.log("Adding okzoomer compatibility...");
HANDLERS.add(new OkZoomerCompat());
@@ -63,8 +61,7 @@ public class LambdaControlsCompat
*
* @param handler The compatibility handler to register.
*/
public static void registerCompatHandler(@NotNull CompatHandler handler)
{
public static void registerCompatHandler(@NotNull CompatHandler handler) {
HANDLERS.add(handler);
}
@@ -73,8 +70,7 @@ public class LambdaControlsCompat
*
* @return A stream of compatibility handlers.
*/
public static Stream<CompatHandler> streamCompatHandlers()
{
public static Stream<CompatHandler> streamCompatHandlers() {
return HANDLERS.stream();
}
@@ -84,8 +80,7 @@ public class LambdaControlsCompat
* @param screen The screen.
* @return True if the mouse is requried on the specified screen, else false.
*/
public static boolean requireMouseOnScreen(Screen screen)
{
public static boolean requireMouseOnScreen(Screen screen) {
return HANDLERS.stream().anyMatch(handler -> handler.requireMouseOnScreen(screen));
}
@@ -97,8 +92,7 @@ public class LambdaControlsCompat
* @param mouseY The mouse Y-coordinate.
* @return A slot if present, else null.
*/
public static @Nullable Pair<Integer, Integer> getSlotAt(@NotNull Screen screen, int mouseX, int mouseY)
{
public static @Nullable Pair<Integer, Integer> getSlotAt(@NotNull Screen screen, int mouseX, int mouseY) {
for (CompatHandler handler : HANDLERS) {
Pair<Integer, Integer> slot = handler.getSlotAt(screen, mouseX, mouseY);
if (slot != null)
@@ -110,12 +104,11 @@ public class LambdaControlsCompat
/**
* Returns a custom translation key to make custom attack action strings on the HUD.
*
* @param client The client instance.
* @param client The client instance.
* @param placeResult The last place block result.
* @return Null if untouched, else a translation key.
*/
public static String getAttackActionAt(@NotNull MinecraftClient client, @Nullable BlockHitResult placeResult)
{
public static String getAttackActionAt(@NotNull MinecraftClient client, @Nullable BlockHitResult placeResult) {
for (CompatHandler handler : HANDLERS) {
String action = handler.getAttackActionAt(client, placeResult);
if (action != null) {
@@ -128,12 +121,11 @@ public class LambdaControlsCompat
/**
* Returns a custom translation key to make custom use action strings on the HUD.
*
* @param client The client instance.
* @param client The client instance.
* @param placeResult The last place block result.
* @return Null if untouched, else a translation key.
*/
public static String getUseActionAt(@NotNull MinecraftClient client, @Nullable BlockHitResult placeResult)
{
public static String getUseActionAt(@NotNull MinecraftClient client, @Nullable BlockHitResult placeResult) {
for (CompatHandler handler : HANDLERS) {
String action = handler.getUseActionAt(client, placeResult);
if (action != null) {
@@ -150,8 +142,7 @@ public class LambdaControlsCompat
* @param screen The screen.
* @return True if the handle was fired and succeed, else false.
*/
public static boolean handleMenuBack(@NotNull MinecraftClient client, @NotNull Screen screen)
{
public static boolean handleMenuBack(@NotNull MinecraftClient client, @NotNull Screen screen) {
for (CompatHandler handler : HANDLERS) {
if (handler.handleMenuBack(client, screen))
return true;
@@ -164,8 +155,7 @@ public class LambdaControlsCompat
*
* @return True if Roughly Enough Items is present, else false.
*/
public static boolean isReiPresent()
{
public static boolean isReiPresent() {
return FabricLoader.getInstance().isModLoaded("roughlyenoughitems");
}
}

View File

@@ -25,58 +25,48 @@ import java.util.Set;
* @version 1.5.0
* @since 1.2.0
*/
public class LambdaControlsMixinPlugin implements IMixinConfigPlugin
{
public class LambdaControlsMixinPlugin implements IMixinConfigPlugin {
private final HashMap<String, Boolean> conditionalMixins = new HashMap<>();
public LambdaControlsMixinPlugin()
{
public LambdaControlsMixinPlugin() {
this.putConditionalMixin("EntryListWidgetAccessor", LambdaControlsCompat.isReiPresent());
this.putConditionalMixin("EntryWidgetAccessor", LambdaControlsCompat.isReiPresent());
this.putConditionalMixin("RecipeViewingScreenAccessor", LambdaControlsCompat.isReiPresent());
this.putConditionalMixin("VillagerRecipeViewingScreenAccessor", LambdaControlsCompat.isReiPresent());
}
private void putConditionalMixin(@NotNull String path, boolean condition)
{
private void putConditionalMixin(@NotNull String path, boolean condition) {
this.conditionalMixins.put("me.lambdaurora.lambdacontrols.client.compat.mixin." + path, condition);
}
@Override
public void onLoad(String mixinPackage)
{
public void onLoad(String mixinPackage) {
}
@Override
public String getRefMapperConfig()
{
public String getRefMapperConfig() {
return null;
}
@Override
public boolean shouldApplyMixin(String targetClassName, String mixinClassName)
{
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
return this.conditionalMixins.getOrDefault(mixinClassName, Boolean.TRUE);
}
@Override
public void acceptTargets(Set<String> myTargets, Set<String> otherTargets)
{
public void acceptTargets(Set<String> myTargets, Set<String> otherTargets) {
}
@Override
public List<String> getMixins()
{
public List<String> getMixins() {
return null;
}
@Override
public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo)
{
public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
}
@Override
public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo)
{
public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
}
}

View File

@@ -9,9 +9,9 @@
package dev.lambdaurora.lambdacontrols.client.compat;
import io.github.joaoh1.okzoomer.client.keybinds.ZoomKeybinds;
import dev.lambdaurora.lambdacontrols.client.LambdaControlsClient;
import dev.lambdaurora.lambdacontrols.client.controller.ButtonBinding;
import io.github.joaoh1.okzoomer.client.keybinds.ZoomKeybinds;
import org.jetbrains.annotations.NotNull;
import org.lwjgl.glfw.GLFW;
@@ -22,11 +22,9 @@ import org.lwjgl.glfw.GLFW;
* @version 1.4.3
* @since 1.1.0
*/
public class OkZoomerCompat implements CompatHandler
{
public class OkZoomerCompat implements CompatHandler {
@Override
public void handle(@NotNull LambdaControlsClient mod)
{
public void handle(@NotNull LambdaControlsClient mod) {
new ButtonBinding.Builder("zoom")
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP, GLFW.GLFW_GAMEPAD_BUTTON_X)
.onlyInGame()
@@ -36,26 +34,26 @@ public class OkZoomerCompat implements CompatHandler
.register();
if (ZoomKeybinds.areExtraKeybindsEnabled()) {
new ButtonBinding.Builder("zoom_in")
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP, ButtonBinding.axisAsButton(GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER, true))
.onlyInGame()
.cooldown(true)
.category(ButtonBinding.MISC_CATEGORY)
.linkKeybind(ZoomKeybinds.increaseZoomKey)
.register();
new ButtonBinding.Builder("zoom_out")
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP, ButtonBinding.axisAsButton(GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, true))
.onlyInGame()
.cooldown(true)
.category(ButtonBinding.MISC_CATEGORY)
.linkKeybind(ZoomKeybinds.decreaseZoomKey)
.register();
new ButtonBinding.Builder("zoom_reset")
.onlyInGame()
.cooldown(true)
.category(ButtonBinding.MISC_CATEGORY)
.linkKeybind(ZoomKeybinds.resetZoomKey)
.register();
new ButtonBinding.Builder("zoom_in")
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP, ButtonBinding.axisAsButton(GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER, true))
.onlyInGame()
.cooldown(true)
.category(ButtonBinding.MISC_CATEGORY)
.linkKeybind(ZoomKeybinds.increaseZoomKey)
.register();
new ButtonBinding.Builder("zoom_out")
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP, ButtonBinding.axisAsButton(GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, true))
.onlyInGame()
.cooldown(true)
.category(ButtonBinding.MISC_CATEGORY)
.linkKeybind(ZoomKeybinds.decreaseZoomKey)
.register();
new ButtonBinding.Builder("zoom_reset")
.onlyInGame()
.cooldown(true)
.category(ButtonBinding.MISC_CATEGORY)
.linkKeybind(ZoomKeybinds.resetZoomKey)
.register();
}
}
}

View File

@@ -50,14 +50,12 @@ import static org.lwjgl.glfw.GLFW.*;
* @version 1.5.0
* @since 1.2.0
*/
public class ReiCompat implements CompatHandler
{
public class ReiCompat implements CompatHandler {
private static final Pair<Integer, Integer> INVALID_SLOT = new Pair<>(-1, -1);
private static EntryListWidget ENTRY_LIST_WIDGET;
private static EntryListWidget ENTRY_LIST_WIDGET;
@Override
public void handle(@NotNull LambdaControlsClient mod)
{
public void handle(@NotNull LambdaControlsClient mod) {
ButtonBinding.builder(new Identifier("rei", "category_back"))
.buttons(GLFW_GAMEPAD_BUTTON_LEFT_BUMPER)
.filter((client, binding) -> isViewingScreen(client.currentScreen))
@@ -114,14 +112,12 @@ public class ReiCompat implements CompatHandler
}
@Override
public boolean requireMouseOnScreen(Screen screen)
{
public boolean requireMouseOnScreen(Screen screen) {
return isViewingScreen(screen) || screen instanceof PreRecipeViewingScreen;
}
@Override
public @Nullable Pair<Integer, Integer> getSlotAt(@NotNull Screen screen, int mouseX, int mouseY)
{
public @Nullable Pair<Integer, Integer> getSlotAt(@NotNull Screen screen, int mouseX, int mouseY) {
Optional<ContainerScreenOverlay> overlay = ScreenHelper.getOptionalOverlay();
if (overlay.isPresent() && overlay.get().isInside(mouseX, mouseY)) {
EntryListWidget widget = getEntryListWidget();
@@ -141,8 +137,7 @@ public class ReiCompat implements CompatHandler
return null;
}
private @Nullable Pair<Integer, Integer> getSlotAt(@NotNull Element element, int mouseX, int mouseY, boolean allowEmpty)
{
private @Nullable Pair<Integer, Integer> getSlotAt(@NotNull Element element, int mouseX, int mouseY, boolean allowEmpty) {
if (element instanceof EntryWidget) {
EntryWidget entry = (EntryWidget) element;
if (entry.containsMouse(mouseX, mouseY)) {
@@ -167,14 +162,12 @@ public class ReiCompat implements CompatHandler
return null;
}
private static boolean isViewingScreen(Screen screen)
{
private static boolean isViewingScreen(Screen screen) {
return screen instanceof RecipeViewingScreen || screen instanceof VillagerRecipeViewingScreen;
}
@Override
public boolean handleMenuBack(@NotNull MinecraftClient client, @NotNull Screen screen)
{
public boolean handleMenuBack(@NotNull MinecraftClient client, @NotNull Screen screen) {
if (!isViewingScreen(screen))
return false;
@@ -183,8 +176,7 @@ public class ReiCompat implements CompatHandler
return true;
}
private static EntryListWidget getEntryListWidget()
{
private static EntryListWidget getEntryListWidget() {
if (ENTRY_LIST_WIDGET == null) {
ENTRY_LIST_WIDGET = LambdaReflection.getFirstFieldOfType(ContainerScreenOverlay.class, EntryListWidget.class)
.map(field -> (EntryListWidget) LambdaReflection.getFieldValue(null, field))
@@ -193,8 +185,7 @@ public class ReiCompat implements CompatHandler
return ENTRY_LIST_WIDGET;
}
private static @Nullable EntryStack getCurrentStack(@NotNull MinecraftClient client)
{
private static @Nullable EntryStack getCurrentStack(@NotNull MinecraftClient client) {
double x = client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth();
double y = client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight();
@@ -216,8 +207,7 @@ public class ReiCompat implements CompatHandler
return getCurrentStack(widget, x, y);
}
private static @Nullable EntryStack getCurrentStack(@NotNull Element element, double mouseX, double mouseY)
{
private static @Nullable EntryStack getCurrentStack(@NotNull Element element, double mouseX, double mouseY) {
if (element instanceof EntryWidget) {
EntryWidget entry = (EntryWidget) element;
if (entry.containsMouse(mouseX, mouseY))
@@ -239,8 +229,7 @@ public class ReiCompat implements CompatHandler
return null;
}
private static PressAction handleShowRecipeUsage(boolean usage)
{
private static PressAction handleShowRecipeUsage(boolean usage) {
return (client, button, value, action) -> {
if (action.isUnpressed())
return false;
@@ -263,8 +252,7 @@ public class ReiCompat implements CompatHandler
};
}
private static PressAction handlePage(boolean next)
{
private static PressAction handlePage(boolean next) {
return (client, button, value, action) -> {
if (action == ButtonState.RELEASE)
return false;
@@ -293,8 +281,7 @@ public class ReiCompat implements CompatHandler
* @param next True if the action is to switch to the next tab.
* @return The handler.
*/
private static PressAction handleTab(boolean next)
{
private static PressAction handleTab(boolean next) {
return (client, button, value, action) -> {
if (action != ButtonState.RELEASE)
return false;
@@ -319,8 +306,7 @@ public class ReiCompat implements CompatHandler
};
}
private static PressAction handleRecipe(boolean next)
{
private static PressAction handleRecipe(boolean next) {
return (client, button, value, action) -> {
if (action.isUnpressed())
return false;
@@ -363,8 +349,7 @@ public class ReiCompat implements CompatHandler
};
}
private static int getNextIndex(int currentIndex, int size, boolean next)
{
private static int getNextIndex(int currentIndex, int size, boolean next) {
int nextIndex = currentIndex + (next ? 1 : -1);
if (nextIndex < 0)
nextIndex = size - 1;

View File

@@ -24,8 +24,7 @@ import java.util.List;
* @since 1.5.0
*/
@Mixin(value = EntryListWidget.class, remap = false)
public interface EntryListWidgetAccessor
{
public interface EntryListWidgetAccessor {
@Accessor(value = "entries")
List<EntryListEntryWidget> getEntries();
}

View File

@@ -22,8 +22,7 @@ import org.spongepowered.asm.mixin.gen.Invoker;
* @since 1.5.0
*/
@Mixin(value = EntryWidget.class, remap = false)
public interface EntryWidgetAccessor
{
public interface EntryWidgetAccessor {
@Invoker("getCurrentEntry")
EntryStack lambdacontrols_getCurrentEntry();
}

View File

@@ -22,8 +22,7 @@ import org.spongepowered.asm.mixin.gen.Accessor;
* @since 1.2.0
*/
@Mixin(value = RecipeViewingScreen.class, remap = false)
public interface RecipeViewingScreenAccessor
{
public interface RecipeViewingScreenAccessor {
@Accessor("categoryBack")
Button getCategoryBack();

View File

@@ -28,8 +28,7 @@ import java.util.Map;
* @since 1.2.0
*/
@Mixin(VillagerRecipeViewingScreen.class)
public interface VillagerRecipeViewingScreenAccessor
{
public interface VillagerRecipeViewingScreenAccessor {
@Accessor(value = "categoryMap", remap = false)
Map<RecipeCategory<?>, List<RecipeDisplay>> getCategoryMap();

View File

@@ -26,37 +26,31 @@ import java.util.List;
* @version 1.1.0
* @since 1.1.0
*/
public class ButtonCategory implements Identifiable
{
public class ButtonCategory implements Identifiable {
private final List<ButtonBinding> bindings = new ArrayList<>();
private final Identifier id;
private int priority;
private final Identifier id;
private int priority;
public ButtonCategory(@NotNull Identifier id, int priority)
{
public ButtonCategory(@NotNull Identifier id, int priority) {
this.id = id;
this.priority = priority;
}
public ButtonCategory(@NotNull Identifier id)
{
public ButtonCategory(@NotNull Identifier id) {
this(id, 100);
}
public void registerBinding(@NotNull ButtonBinding binding)
{
public void registerBinding(@NotNull ButtonBinding binding) {
if (this.bindings.contains(binding))
throw new IllegalStateException("Cannot register twice a button binding in the same category.");
this.bindings.add(binding);
}
public void registerAllBindings(@NotNull ButtonBinding... bindings)
{
public void registerAllBindings(@NotNull ButtonBinding... bindings) {
this.registerAllBindings(Arrays.asList(bindings));
}
public void registerAllBindings(@NotNull List<ButtonBinding> bindings)
{
public void registerAllBindings(@NotNull List<ButtonBinding> bindings) {
bindings.forEach(this::registerBinding);
}
@@ -65,8 +59,7 @@ public class ButtonCategory implements Identifiable
*
* @return The bindings assigned to this category.
*/
public @NotNull List<ButtonBinding> getBindings()
{
public @NotNull List<ButtonBinding> getBindings() {
return Collections.unmodifiableList(this.bindings);
}
@@ -77,8 +70,7 @@ public class ButtonCategory implements Identifiable
*
* @return The translated name.
*/
public @NotNull String getTranslatedName()
{
public @NotNull String getTranslatedName() {
if (this.id.getNamespace().equals("minecraft"))
return I18n.translate(this.id.getName());
else
@@ -91,14 +83,12 @@ public class ButtonCategory implements Identifiable
*
* @return The priority of this category.
*/
public int getPriority()
{
public int getPriority() {
return this.priority;
}
@Override
public @NotNull Identifier getIdentifier()
{
public @NotNull Identifier getIdentifier() {
return this.id;
}
}

View File

@@ -44,13 +44,11 @@ import static org.lwjgl.BufferUtils.createByteBuffer;
* @version 1.4.3
* @since 1.0.0
*/
public class Controller implements Nameable
{
public class Controller implements Nameable {
private static final Map<Integer, Controller> CONTROLLERS = new HashMap<>();
private final int id;
private final int id;
public Controller(int id)
{
public Controller(int id) {
this.id = id;
}
@@ -59,8 +57,7 @@ public class Controller implements Nameable
*
* @return The identifier of this controller.
*/
public int getId()
{
public int getId() {
return this.id;
}
@@ -69,8 +66,7 @@ public class Controller implements Nameable
*
* @return The controller's GUID.
*/
public String getGuid()
{
public String getGuid() {
String guid = GLFW.glfwGetJoystickGUID(this.id);
return guid == null ? "" : guid;
}
@@ -80,8 +76,7 @@ public class Controller implements Nameable
*
* @return True if this controller is connected, else false.
*/
public boolean isConnected()
{
public boolean isConnected() {
return GLFW.glfwJoystickPresent(this.id);
}
@@ -90,8 +85,7 @@ public class Controller implements Nameable
*
* @return True if this controller is a gamepad, else false.
*/
public boolean isGamepad()
{
public boolean isGamepad() {
return this.isConnected() && GLFW.glfwJoystickIsGamepad(this.id);
}
@@ -101,8 +95,7 @@ public class Controller implements Nameable
* @return The controller's name.
*/
@Override
public @NotNull String getName()
{
public @NotNull String getName() {
String name = this.isGamepad() ? GLFW.glfwGetGamepadName(this.id) : GLFW.glfwGetJoystickName(this.id);
return name == null ? String.valueOf(this.getId()) : name;
}
@@ -112,16 +105,14 @@ public class Controller implements Nameable
*
* @return The state of the controller input.
*/
public GLFWGamepadState getState()
{
public GLFWGamepadState getState() {
GLFWGamepadState state = GLFWGamepadState.create();
if (this.isGamepad())
GLFW.glfwGetGamepadState(this.id, state);
return state;
}
public static @NotNull Controller byId(int id)
{
public static @NotNull Controller byId(int id) {
if (id > GLFW.GLFW_JOYSTICK_LAST) {
LambdaControlsClient.get().log("Controller '" + id + "' doesn't exist.");
id = GLFW.GLFW_JOYSTICK_LAST;
@@ -136,8 +127,7 @@ public class Controller implements Nameable
}
}
public static @NotNull Optional<Controller> byGuid(@NotNull String guid)
{
public static @NotNull Optional<Controller> byGuid(@NotNull String guid) {
return CONTROLLERS.values().stream().filter(Controller::isConnected)
.filter(controller -> controller.getGuid().equals(guid))
.max(Comparator.comparingInt(Controller::getId));
@@ -146,13 +136,12 @@ public class Controller implements Nameable
/**
* Reads the specified resource and returns the raw data as a ByteBuffer.
*
* @param resource The resource to read.
* @param resource The resource to read.
* @param bufferSize The initial buffer size.
* @return The resource data.
* @throws IOException If an IO error occurs.
*/
private static ByteBuffer ioResourceToBuffer(String resource, int bufferSize) throws IOException
{
private static ByteBuffer ioResourceToBuffer(String resource, int bufferSize) throws IOException {
ByteBuffer buffer = null;
Path path = Paths.get(resource);
@@ -171,8 +160,7 @@ public class Controller implements Nameable
/**
* Updates the controller mappings.
*/
public static void updateMappings()
{
public static void updateMappings() {
try {
if (!LambdaControlsClient.MAPPINGS_FILE.exists())
return;

View File

@@ -41,14 +41,11 @@ import java.util.stream.Collectors;
* @version 1.4.3
* @since 1.1.0
*/
public class InputHandlers
{
private InputHandlers()
{
public class InputHandlers {
private InputHandlers() {
}
public static PressAction handleHotbar(boolean next)
{
public static PressAction handleHotbar(boolean next) {
return (client, button, value, action) -> {
if (action == ButtonState.RELEASE)
return false;
@@ -68,7 +65,7 @@ public class InputHandlers
nextTab = ItemGroup.GROUPS.length - 1;
else if (nextTab >= ItemGroup.GROUPS.length)
nextTab = 0;
inventory.lambdacontrols_setSelectedTab(ItemGroup.GROUPS[nextTab]);
inventory.lambdacontrols$setSelectedTab(ItemGroup.GROUPS[nextTab]);
return true;
} else if (client.currentScreen instanceof InventoryScreen) {
RecipeBookWidgetAccessor recipeBook = (RecipeBookWidgetAccessor) ((InventoryScreen) client.currentScreen).getRecipeBookWidget();
@@ -84,7 +81,7 @@ public class InputHandlers
currentTab.setToggled(false);
recipeBook.setCurrentTab(currentTab = tabs.get(nextTab));
currentTab.setToggled(true);
recipeBook.lambdacontrols_refreshResults(true);
recipeBook.lambdacontrols$refreshResults(true);
return true;
} else if (client.currentScreen instanceof AdvancementsScreen) {
AdvancementsScreenAccessor screen = (AdvancementsScreenAccessor) client.currentScreen;
@@ -109,8 +106,7 @@ public class InputHandlers
};
}
public static boolean handlePauseGame(@NotNull MinecraftClient client, @NotNull ButtonBinding binding, float value, @NotNull ButtonState action)
{
public static boolean handlePauseGame(@NotNull MinecraftClient client, @NotNull ButtonBinding binding, float value, @NotNull ButtonState action) {
if (action == ButtonState.PRESS) {
// If in game, then pause the game.
if (client.currentScreen == null)
@@ -126,21 +122,19 @@ public class InputHandlers
/**
* Handles the screenshot action.
*
* @param client The client instance.
* @param client The client instance.
* @param binding The binding which fired the action.
* @param action The action done on the binding.
* @param action The action done on the binding.
* @return True if handled, else false.
*/
public static boolean handleScreenshot(@NotNull MinecraftClient client, @NotNull ButtonBinding binding, float value, @NotNull ButtonState action)
{
public static boolean handleScreenshot(@NotNull MinecraftClient client, @NotNull ButtonBinding binding, float value, @NotNull ButtonState action) {
if (action == ButtonState.RELEASE)
ScreenshotUtils.saveScreenshot(client.runDirectory, client.getWindow().getFramebufferWidth(), client.getWindow().getFramebufferHeight(), client.getFramebuffer(),
text -> client.execute(() -> client.inGameHud.getChatHud().addMessage(text)));
return true;
}
public static boolean handleToggleSneak(@NotNull MinecraftClient client, @NotNull ButtonBinding button, float value, @NotNull ButtonState action)
{
public static boolean handleToggleSneak(@NotNull MinecraftClient client, @NotNull ButtonBinding button, float value, @NotNull ButtonState action) {
button.asKeyBinding().ifPresent(binding -> {
boolean sneakToggled = client.options.sneakToggled;
if (client.player.abilities.flying && sneakToggled)
@@ -152,8 +146,7 @@ public class InputHandlers
return true;
}
public static PressAction handleInventorySlotPad(int direction)
{
public static PressAction handleInventorySlotPad(int direction) {
return (client, binding, value, action) -> {
if (!(client.currentScreen instanceof HandledScreen && action != ButtonState.RELEASE))
return false;
@@ -166,7 +159,7 @@ public class InputHandlers
double mouseY = client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight();
// Finds the hovered slot.
Slot mouseSlot = accessor.lambdacontrols_getSlotAt(mouseX, mouseY);
Slot mouseSlot = accessor.lambdacontrols$getSlotAt(mouseX, mouseY);
// Finds the closest slot in the GUI within 14 pixels.
Optional<Slot> closestSlot = inventory.getScreenHandler().slots.parallelStream()
@@ -224,36 +217,33 @@ public class InputHandlers
/**
* Returns always true to the filter.
*
* @param client The client instance.
* @param client The client instance.
* @param binding The affected binding.
* @return True.
*/
public static boolean always(@NotNull MinecraftClient client, @NotNull ButtonBinding binding)
{
public static boolean always(@NotNull MinecraftClient client, @NotNull ButtonBinding binding) {
return true;
}
/**
* Returns whether the client is in game or not.
*
* @param client The client instance.
* @param client The client instance.
* @param binding The affected binding.
* @return True if the client is in game, else false.
*/
public static boolean inGame(@NotNull MinecraftClient client, @NotNull ButtonBinding binding)
{
public static boolean inGame(@NotNull MinecraftClient client, @NotNull ButtonBinding binding) {
return client.currentScreen == null;
}
/**
* Returns whether the client is in a non-interactive screen (which means require mouse input) or not.
*
* @param client The client instance.
* @param client The client instance.
* @param binding The affected binding.
* @return True if the client is in a non-interactive screen, else false.
*/
public static boolean inNonInteractiveScreens(@NotNull MinecraftClient client, @NotNull ButtonBinding binding)
{
public static boolean inNonInteractiveScreens(@NotNull MinecraftClient client, @NotNull ButtonBinding binding) {
if (client.currentScreen == null)
return false;
return !LambdaInput.isScreenInteractive(client.currentScreen);
@@ -262,24 +252,22 @@ public class InputHandlers
/**
* Returns whether the client is in an inventory or not.
*
* @param client The client instance.
* @param client The client instance.
* @param binding The affected binding.
* @return True if the client is in an inventory, else false.
*/
public static boolean inInventory(@NotNull MinecraftClient client, @NotNull ButtonBinding binding)
{
public static boolean inInventory(@NotNull MinecraftClient client, @NotNull ButtonBinding binding) {
return client.currentScreen instanceof HandledScreen;
}
/**
* Returns whether the client is in the advancements screen or not.
*
* @param client The client instance.
* @param client The client instance.
* @param binding The affected binding.
* @return True if the client is in the advancements screen, else false.
*/
public static boolean inAdvancements(@NotNull MinecraftClient client, @NotNull ButtonBinding binding)
{
public static boolean inAdvancements(@NotNull MinecraftClient client, @NotNull ButtonBinding binding) {
return client.currentScreen instanceof AdvancementsScreen;
}
}

View File

@@ -36,31 +36,27 @@ import java.util.stream.Stream;
* @version 1.4.0
* @since 1.1.0
*/
public class InputManager
{
public static final InputManager INPUT_MANAGER = new InputManager();
private static final List<ButtonBinding> BINDINGS = new ArrayList<>();
private static final List<ButtonCategory> CATEGORIES = new ArrayList<>();
public static final Map<Integer, ButtonState> STATES = new HashMap<>();
public static final Map<Integer, Float> BUTTON_VALUES = new HashMap<>();
private int prevTargetMouseX = 0;
private int prevTargetMouseY = 0;
private int targetMouseX = 0;
private int targetMouseY = 0;
public class InputManager {
public static final InputManager INPUT_MANAGER = new InputManager();
private static final List<ButtonBinding> BINDINGS = new ArrayList<>();
private static final List<ButtonCategory> CATEGORIES = new ArrayList<>();
public static final Map<Integer, ButtonState> STATES = new HashMap<>();
public static final Map<Integer, Float> BUTTON_VALUES = new HashMap<>();
private int prevTargetMouseX = 0;
private int prevTargetMouseY = 0;
private int targetMouseX = 0;
private int targetMouseY = 0;
protected InputManager()
{
protected InputManager() {
}
public void tick(@NotNull MinecraftClient client)
{
public void tick(@NotNull MinecraftClient client) {
if (LambdaControlsClient.get().config.getControlsMode() == ControlsMode.CONTROLLER) {
this.controllerTick(client);
}
}
public void controllerTick(@NotNull MinecraftClient client)
{
public void controllerTick(@NotNull MinecraftClient client) {
this.prevTargetMouseX = this.targetMouseX;
this.prevTargetMouseY = this.targetMouseY;
}
@@ -70,32 +66,29 @@ public class InputManager
*
* @param client The client instance.
*/
public void updateMousePosition(@NotNull MinecraftClient client)
{
public void updateMousePosition(@NotNull MinecraftClient client) {
Objects.requireNonNull(client, "Client instance cannot be null.");
if (this.prevTargetMouseX != this.targetMouseX || this.prevTargetMouseY != this.targetMouseY) {
double mouseX = this.prevTargetMouseX + (this.targetMouseX - this.prevTargetMouseX) * client.getTickDelta() + 0.5;
double mouseY = this.prevTargetMouseY + (this.targetMouseY - this.prevTargetMouseY) * client.getTickDelta() + 0.5;
if (!LambdaControlsClient.get().config.hasVirtualMouse())
GLFW.glfwSetCursorPos(client.getWindow().getHandle(), mouseX, mouseY);
((MouseAccessor) client.mouse).lambdacontrols_onCursorPos(client.getWindow().getHandle(), mouseX, mouseY);
((MouseAccessor) client.mouse).lambdacontrols$onCursorPos(client.getWindow().getHandle(), mouseX, mouseY);
}
}
/**
* Resets the mouse position.
*
* @param windowWidth The window width.
* @param windowWidth The window width.
* @param windowHeight The window height.
*/
public void resetMousePosition(int windowWidth, int windowHeight)
{
public void resetMousePosition(int windowWidth, int windowHeight) {
this.targetMouseX = this.prevTargetMouseX = (int) (windowWidth / 2.F);
this.targetMouseY = this.prevTargetMouseY = (int) (windowHeight / 2.F);
}
public void resetMouseTarget(@NotNull MinecraftClient client)
{
public void resetMouseTarget(@NotNull MinecraftClient client) {
double mouseX = client.mouse.getX();
double mouseY = client.mouse.getY();
this.prevTargetMouseX = this.targetMouseX = (int) mouseX;
@@ -108,8 +101,7 @@ public class InputManager
* @param binding The binding to check.
* @return True if the binding is registered, else false.
*/
public static boolean hasBinding(@NotNull ButtonBinding binding)
{
public static boolean hasBinding(@NotNull ButtonBinding binding) {
return BINDINGS.contains(binding);
}
@@ -119,8 +111,7 @@ public class InputManager
* @param name The name of the binding to check.
* @return True if the binding is registered, else false.
*/
public static boolean hasBinding(@NotNull String name)
{
public static boolean hasBinding(@NotNull String name) {
return BINDINGS.parallelStream().map(ButtonBinding::getName).anyMatch(binding -> binding.equalsIgnoreCase(name));
}
@@ -130,8 +121,7 @@ public class InputManager
* @param identifier The identifier of the binding to check.
* @return True if the binding is registered, else false.
*/
public static boolean hasBinding(@NotNull Identifier identifier)
{
public static boolean hasBinding(@NotNull Identifier identifier) {
return hasBinding(identifier.getNamespace() + "." + identifier.getName());
}
@@ -141,39 +131,33 @@ public class InputManager
* @param binding The binding to register.
* @return The registered binding.
*/
public static @NotNull ButtonBinding registerBinding(@NotNull ButtonBinding binding)
{
public static @NotNull ButtonBinding registerBinding(@NotNull ButtonBinding binding) {
if (hasBinding(binding))
throw new IllegalStateException("Cannot register twice a button binding in the registry.");
BINDINGS.add(binding);
return binding;
}
public static @NotNull ButtonBinding registerBinding(@NotNull Identifier id, int[] defaultButton, @NotNull List<PressAction> actions, @NotNull PairPredicate<MinecraftClient, ButtonBinding> filter, boolean hasCooldown)
{
public static @NotNull ButtonBinding registerBinding(@NotNull Identifier id, int[] defaultButton, @NotNull List<PressAction> actions, @NotNull PairPredicate<MinecraftClient, ButtonBinding> filter, boolean hasCooldown) {
return registerBinding(new ButtonBinding(id.getNamespace() + "." + id.getName(), defaultButton, actions, filter, hasCooldown));
}
public static @NotNull ButtonBinding registerBinding(@NotNull Identifier id, int[] defaultButton, boolean hasCooldown)
{
public static @NotNull ButtonBinding registerBinding(@NotNull Identifier id, int[] defaultButton, boolean hasCooldown) {
return registerBinding(id, defaultButton, Collections.emptyList(), InputHandlers::always, hasCooldown);
}
public static @NotNull ButtonBinding registerBinding(@NotNull net.minecraft.util.Identifier id, int[] defaultButton, @NotNull List<PressAction> actions, @NotNull PairPredicate<MinecraftClient, ButtonBinding> filter, boolean hasCooldown)
{
public static @NotNull ButtonBinding registerBinding(@NotNull net.minecraft.util.Identifier id, int[] defaultButton, @NotNull List<PressAction> actions, @NotNull PairPredicate<MinecraftClient, ButtonBinding> filter, boolean hasCooldown) {
return registerBinding(new Identifier(id.getNamespace(), id.getPath()), defaultButton, actions, filter, hasCooldown);
}
public static @NotNull ButtonBinding registerBinding(@NotNull net.minecraft.util.Identifier id, int[] defaultButton, boolean hasCooldown)
{
public static @NotNull ButtonBinding registerBinding(@NotNull net.minecraft.util.Identifier id, int[] defaultButton, boolean hasCooldown) {
return registerBinding(id, defaultButton, Collections.emptyList(), InputHandlers::always, hasCooldown);
}
/**
* Sorts bindings to get bindings with the higher button counts first.
*/
public static void sortBindings()
{
public static void sortBindings() {
synchronized (BINDINGS) {
List<ButtonBinding> sorted = BINDINGS.stream().sorted(Collections.reverseOrder(Comparator.comparingInt(binding -> binding.getButton().length)))
.collect(Collectors.toList());
@@ -188,24 +172,20 @@ public class InputManager
* @param category The category to register.
* @return The registered category.
*/
public static ButtonCategory registerCategory(@NotNull ButtonCategory category)
{
public static ButtonCategory registerCategory(@NotNull ButtonCategory category) {
CATEGORIES.add(category);
return category;
}
public static ButtonCategory registerCategory(@NotNull Identifier identifier, int priority)
{
public static ButtonCategory registerCategory(@NotNull Identifier identifier, int priority) {
return registerCategory(new ButtonCategory(identifier, priority));
}
public static ButtonCategory registerCategory(@NotNull Identifier identifier)
{
public static ButtonCategory registerCategory(@NotNull Identifier identifier) {
return registerCategory(new ButtonCategory(identifier));
}
protected static ButtonCategory registerDefaultCategory(@NotNull String key, @NotNull Consumer<ButtonCategory> keyAdder)
{
protected static ButtonCategory registerDefaultCategory(@NotNull String key, @NotNull Consumer<ButtonCategory> keyAdder) {
ButtonCategory category = registerCategory(new Identifier("minecraft", key), CATEGORIES.size());
keyAdder.accept(category);
return category;
@@ -216,8 +196,7 @@ public class InputManager
*
* @param config The configuration instance.
*/
public static void loadButtonBindings(@NotNull LambdaControlsConfig config)
{
public static void loadButtonBindings(@NotNull LambdaControlsConfig config) {
List<ButtonBinding> queue = new ArrayList<>(BINDINGS);
queue.forEach(config::loadButtonBinding);
}
@@ -228,8 +207,7 @@ public class InputManager
* @param binding The binding.
* @return The current state of the binding.
*/
public static @NotNull ButtonState getBindingState(@NotNull ButtonBinding binding)
{
public static @NotNull ButtonState getBindingState(@NotNull ButtonBinding binding) {
ButtonState state = ButtonState.REPEAT;
for (int btn : binding.getButton()) {
ButtonState btnState = InputManager.STATES.getOrDefault(btn, ButtonState.NONE);
@@ -246,8 +224,7 @@ public class InputManager
return state;
}
public static float getBindingValue(@NotNull ButtonBinding binding, @NotNull ButtonState state)
{
public static float getBindingValue(@NotNull ButtonBinding binding, @NotNull ButtonState state) {
if (state.isUnpressed())
return 0.f;
@@ -269,8 +246,7 @@ public class InputManager
* @param button The button to check.
* @return True if the button has duplicated bindings, else false.
*/
public static boolean hasDuplicatedBindings(int[] button)
{
public static boolean hasDuplicatedBindings(int[] button) {
return BINDINGS.parallelStream().filter(binding -> areButtonsEquivalent(binding.getButton(), button)).count() > 1;
}
@@ -280,8 +256,7 @@ public class InputManager
* @param binding The binding to check.
* @return True if the button has duplicated bindings, else false.
*/
public static boolean hasDuplicatedBindings(ButtonBinding binding)
{
public static boolean hasDuplicatedBindings(ButtonBinding binding) {
return BINDINGS.parallelStream().filter(other -> areButtonsEquivalent(other.getButton(), binding.getButton()) && other.filter.equals(binding.filter)).count() > 1;
}
@@ -292,8 +267,7 @@ public class InputManager
* @param buttons2 Second set of buttons.
* @return True if the two sets of buttons are equivalent, else false.
*/
public static boolean areButtonsEquivalent(int[] buttons1, int[] buttons2)
{
public static boolean areButtonsEquivalent(int[] buttons1, int[] buttons2) {
if (buttons1.length != buttons2.length)
return false;
int count = 0;
@@ -312,19 +286,17 @@ public class InputManager
* Returns whether the button set contains the specified button or not.
*
* @param buttons The button set.
* @param button The button to check.
* @param button The button to check.
* @return True if the button set contains the specified button, else false.
*/
public static boolean containsButton(int[] buttons, int button)
{
public static boolean containsButton(int[] buttons, int button) {
return Arrays.stream(buttons).anyMatch(btn -> btn == button);
}
/**
* Updates the button states.
*/
public static void updateStates()
{
public static void updateStates() {
STATES.forEach((btn, state) -> {
if (state == ButtonState.PRESS)
STATES.put(btn, ButtonState.REPEAT);
@@ -333,8 +305,7 @@ public class InputManager
});
}
public static void updateBindings(@NotNull MinecraftClient client)
{
public static void updateBindings(@NotNull MinecraftClient client) {
List<Integer> skipButtons = new ArrayList<>();
Map<ButtonBinding, Pair<ButtonState, Float>> states = new HashMap<>();
for (ButtonBinding binding : BINDINGS) {
@@ -367,54 +338,48 @@ public class InputManager
});
}
public static void queueMousePosition(double x, double y)
{
public static void queueMousePosition(double x, double y) {
INPUT_MANAGER.targetMouseX = (int) MathHelper.clamp(x, 0, MinecraftClient.getInstance().getWindow().getWidth());
INPUT_MANAGER.targetMouseY = (int) MathHelper.clamp(y, 0, MinecraftClient.getInstance().getWindow().getHeight());
}
public static void queueMoveMousePosition(double x, double y)
{
public static void queueMoveMousePosition(double x, double y) {
queueMousePosition(INPUT_MANAGER.targetMouseX + x, INPUT_MANAGER.targetMouseY + y);
}
public static @NotNull Stream<ButtonBinding> streamBindings()
{
public static @NotNull Stream<ButtonBinding> streamBindings() {
return BINDINGS.stream();
}
public static @NotNull Stream<ButtonCategory> streamCategories()
{
public static @NotNull Stream<ButtonCategory> streamCategories() {
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 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)
{
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 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)
{
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

@@ -23,8 +23,7 @@ import org.jetbrains.annotations.NotNull;
* @since 1.0.0
*/
@FunctionalInterface
public interface PressAction
{
public interface PressAction {
PressAction DEFAULT_ACTION = (client, button, value, action) -> {
if (action == ButtonState.REPEAT || client.currentScreen != null)
return false;

View File

@@ -9,11 +9,11 @@
package dev.lambdaurora.lambdacontrols.client.gui;
import dev.lambdaurora.lambdacontrols.client.compat.LambdaControlsCompat;
import dev.lambdaurora.lambdacontrols.ControlsMode;
import dev.lambdaurora.lambdacontrols.LambdaControlsConstants;
import dev.lambdaurora.lambdacontrols.client.HudSide;
import dev.lambdaurora.lambdacontrols.client.LambdaControlsClient;
import dev.lambdaurora.lambdacontrols.client.compat.LambdaControlsCompat;
import dev.lambdaurora.lambdacontrols.client.controller.ButtonBinding;
import me.lambdaurora.spruceui.hud.Hud;
import net.minecraft.client.MinecraftClient;
@@ -35,34 +35,31 @@ import org.jetbrains.annotations.Nullable;
* @version 1.3.2
* @since 1.0.0
*/
public class LambdaControlsHud extends Hud
{
public class LambdaControlsHud extends Hud {
private final LambdaControlsClient mod;
private MinecraftClient client;
private int attackWidth = 0;
private int attackButtonWidth = 0;
private int dropItemWidth = 0;
private int dropItemButtonWidth = 0;
private int inventoryWidth = 0;
private int inventoryButtonWidth = 0;
private int swapHandsWidth = 0;
private int swapHandsButtonWidth = 0;
private int useWidth = 0;
private int useButtonWidth = 0;
private BlockHitResult placeHitResult;
private String attackAction = "";
private String placeAction = "";
private int ticksDisplayedCrosshair = 0;
private MinecraftClient client;
private int attackWidth = 0;
private int attackButtonWidth = 0;
private int dropItemWidth = 0;
private int dropItemButtonWidth = 0;
private int inventoryWidth = 0;
private int inventoryButtonWidth = 0;
private int swapHandsWidth = 0;
private int swapHandsButtonWidth = 0;
private int useWidth = 0;
private int useButtonWidth = 0;
private BlockHitResult placeHitResult;
private String attackAction = "";
private String placeAction = "";
private int ticksDisplayedCrosshair = 0;
public LambdaControlsHud(@NotNull LambdaControlsClient mod)
{
public LambdaControlsHud(@NotNull LambdaControlsClient mod) {
super(new Identifier(LambdaControlsConstants.NAMESPACE, "hud/button_indicator"));
this.mod = mod;
}
@Override
public void init(@NotNull MinecraftClient client, int screenWidth, int screenHeight)
{
public void init(@NotNull MinecraftClient client, int screenWidth, int screenHeight) {
super.init(client, screenWidth, screenHeight);
this.client = client;
this.inventoryWidth = this.width(ButtonBinding.INVENTORY);
@@ -79,8 +76,7 @@ public class LambdaControlsHud extends Hud
* Renders the LambdaControls' HUD.
*/
@Override
public void render(MatrixStack matrices, float tickDelta)
{
public void render(MatrixStack matrices, float tickDelta) {
if (this.mod.config.getControlsMode() == ControlsMode.CONTROLLER && this.client.currentScreen == null) {
int y = bottom(2);
this.renderFirstIcons(matrices, this.mod.config.getHudSide() == HudSide.LEFT ? 2 : client.getWindow().getScaledWidth() - 2, y);
@@ -103,8 +99,7 @@ public class LambdaControlsHud extends Hud
}
}
public void renderFirstIcons(MatrixStack matrices, int x, int y)
{
public void renderFirstIcons(MatrixStack matrices, int x, int y) {
int offset = 2 + this.inventoryWidth + this.inventoryButtonWidth + 4;
int currentX = this.mod.config.getHudSide() == HudSide.LEFT ? x : x - this.inventoryButtonWidth;
this.drawButton(matrices, currentX, y, ButtonBinding.INVENTORY, true);
@@ -119,8 +114,7 @@ public class LambdaControlsHud extends Hud
this.drawButton(matrices, currentX, y, ButtonBinding.DROP_ITEM, !this.client.player.getMainHandStack().isEmpty());
}
public void renderSecondIcons(MatrixStack matrices, int x, int y)
{
public void renderSecondIcons(MatrixStack matrices, int x, int y) {
int offset;
int currentX = x;
if (!this.placeAction.isEmpty()) {
@@ -142,8 +136,7 @@ public class LambdaControlsHud extends Hud
this.drawButton(matrices, currentX, y, ButtonBinding.ATTACK, this.attackWidth != 0);
}
public void renderFirstSection(MatrixStack matrices, int x, int y)
{
public void renderFirstSection(MatrixStack matrices, int x, int y) {
int currentX = this.mod.config.getHudSide() == HudSide.LEFT ? x + this.inventoryButtonWidth + 2 : x - this.inventoryButtonWidth - 2 - this.inventoryWidth;
this.drawTip(matrices, currentX, y, ButtonBinding.INVENTORY, true);
currentX += this.mod.config.getHudSide() == HudSide.LEFT ? this.inventoryWidth + 4 + this.swapHandsButtonWidth + 2
@@ -158,8 +151,7 @@ public class LambdaControlsHud extends Hud
this.drawTip(matrices, currentX, y, ButtonBinding.DROP_ITEM, !this.client.player.getMainHandStack().isEmpty());
}
public void renderSecondSection(MatrixStack matrices, int x, int y)
{
public void renderSecondSection(MatrixStack matrices, int x, int y) {
int currentX = x;
if (!this.placeAction.isEmpty()) {
@@ -181,8 +173,7 @@ public class LambdaControlsHud extends Hud
}
@Override
public void tick()
{
public void tick() {
super.tick();
if (this.mod.config.getControlsMode() == ControlsMode.CONTROLLER) {
if (this.client.crosshairTarget == null)
@@ -249,41 +240,34 @@ public class LambdaControlsHud extends Hud
}
@Override
public boolean hasTicks()
{
public boolean hasTicks() {
return true;
}
private int bottom(int y)
{
private int bottom(int y) {
return this.client.getWindow().getScaledHeight() - y - LambdaControlsRenderer.ICON_SIZE;
}
private int width(@NotNull ButtonBinding binding)
{
private int width(@NotNull ButtonBinding binding) {
return this.width(binding.getTranslationKey());
}
private int width(@Nullable String text)
{
private int width(@Nullable String text) {
if (text == null || text.isEmpty())
return 0;
return this.client.textRenderer.getWidth(I18n.translate(text));
}
private void drawButton(MatrixStack matrices, 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)
LambdaControlsRenderer.drawButton(matrices, x, y, button, this.client);
}
private void drawTip(MatrixStack matrices, int x, int y, @NotNull ButtonBinding button, boolean display)
{
private void drawTip(MatrixStack matrices, int x, int y, @NotNull ButtonBinding button, boolean display) {
this.drawTip(matrices, x, y, button.getTranslationKey(), display);
}
private void drawTip(MatrixStack matrices, int x, int y, @NotNull String action, boolean display)
{
private void drawTip(MatrixStack matrices, int x, int y, @NotNull String action, boolean display) {
if (!display)
return;
String translatedAction = I18n.translate(action);

View File

@@ -10,11 +10,11 @@
package dev.lambdaurora.lambdacontrols.client.gui;
import com.mojang.blaze3d.systems.RenderSystem;
import dev.lambdaurora.lambdacontrols.client.LambdaControlsClient;
import dev.lambdaurora.lambdacontrols.client.LambdaInput;
import dev.lambdaurora.lambdacontrols.client.compat.LambdaControlsCompat;
import dev.lambdaurora.lambdacontrols.client.util.HandledScreenAccessor;
import dev.lambdaurora.lambdacontrols.client.LambdaControlsClient;
import dev.lambdaurora.lambdacontrols.client.controller.ButtonBinding;
import dev.lambdaurora.lambdacontrols.client.util.HandledScreenAccessor;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawableHelper;
@@ -33,14 +33,12 @@ import org.lwjgl.glfw.GLFW;
* @version 1.5.0
* @since 1.2.0
*/
public class LambdaControlsRenderer
{
public static final int ICON_SIZE = 20;
public class LambdaControlsRenderer {
public static final int ICON_SIZE = 20;
private static final int BUTTON_SIZE = 15;
private static final int AXIS_SIZE = 18;
private static final int AXIS_SIZE = 18;
public static int getButtonSize(int button)
{
public static int getButtonSize(int button) {
switch (button) {
case -1:
return 0;
@@ -64,8 +62,7 @@ public class LambdaControlsRenderer
* @param binding The binding.
* @return The width.
*/
public static int getBindingIconWidth(@NotNull ButtonBinding binding)
{
public static int getBindingIconWidth(@NotNull ButtonBinding binding) {
return getBindingIconWidth(binding.getButton());
}
@@ -75,8 +72,7 @@ public class LambdaControlsRenderer
* @param buttons The buttons.
* @return The width.
*/
public static int getBindingIconWidth(int[] buttons)
{
public static int getBindingIconWidth(int[] buttons) {
int width = 0;
for (int i = 0; i < buttons.length; i++) {
width += ICON_SIZE;
@@ -87,13 +83,11 @@ public class LambdaControlsRenderer
return width;
}
public static Pair<Integer, Integer> drawButton(MatrixStack matrices, 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(matrices, x, y, button.getButton(), client);
}
public static Pair<Integer, Integer> drawButton(MatrixStack matrices, 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 length = 0;
int currentX = x;
@@ -112,8 +106,7 @@ public class LambdaControlsRenderer
}
@SuppressWarnings("deprecated")
public static int drawButton(MatrixStack matrices, 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;
if (button == -1)
return 0;
@@ -204,13 +197,11 @@ public class LambdaControlsRenderer
return ICON_SIZE;
}
public static int drawButtonTip(MatrixStack matrices, 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(matrices, x, y, button.getButton(), button.getTranslationKey(), display, client);
}
public static int drawButtonTip(MatrixStack matrices, 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) {
int buttonWidth = drawButton(matrices, x, y, button, client).key;
@@ -223,13 +214,11 @@ public class LambdaControlsRenderer
return -10;
}
private static int getButtonTipWidth(@NotNull String action, @NotNull TextRenderer textRenderer)
{
private static int getButtonTipWidth(@NotNull String action, @NotNull TextRenderer textRenderer) {
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) {
if (!LambdaControlsClient.get().config.hasVirtualMouse() || (client.currentScreen == null || LambdaInput.isScreenInteractive(client.currentScreen)))
return;
@@ -243,7 +232,7 @@ public class LambdaControlsRenderer
int guiLeft = inventoryScreen.getX();
int guiTop = inventoryScreen.getY();
Slot slot = inventoryScreen.lambdacontrols_getSlotAt(mouseX, mouseY);
Slot slot = inventoryScreen.lambdacontrols$getSlotAt(mouseX, mouseY);
if (slot != null) {
mouseX = guiLeft + slot.x;
@@ -273,14 +262,13 @@ public class LambdaControlsRenderer
/**
* Draws the virtual cursor.
*
* @param matrices The matrix stack.
* @param x X coordinate.
* @param y Y coordinate.
* @param matrices The matrix stack.
* @param x X coordinate.
* @param y Y coordinate.
* @param hoverSlot True if hovering a slot, else false.
* @param client The client instance.
* @param client The client instance.
*/
public static void drawCursor(@NotNull MatrixStack matrices, int x, int y, boolean hoverSlot, @NotNull MinecraftClient client)
{
public static void drawCursor(@NotNull MatrixStack matrices, int x, int y, boolean hoverSlot, @NotNull MinecraftClient client) {
client.getTextureManager().bindTexture(LambdaControlsClient.CURSOR_TEXTURE);
RenderSystem.disableDepthTest();

View File

@@ -9,8 +9,8 @@
package dev.lambdaurora.lambdacontrols.client.gui;
import dev.lambdaurora.lambdacontrols.client.ring.RingPage;
import dev.lambdaurora.lambdacontrols.client.LambdaControlsClient;
import dev.lambdaurora.lambdacontrols.client.ring.RingPage;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.TranslatableText;
@@ -22,25 +22,21 @@ import net.minecraft.text.TranslatableText;
* @version 1.4.3
* @since 1.4.3
*/
public class RingScreen extends Screen
{
public class RingScreen extends Screen {
protected final LambdaControlsClient mod;
public RingScreen()
{
public RingScreen() {
super(new TranslatableText("lambdacontrols.menu.title.ring"));
this.mod = LambdaControlsClient.get();
}
@Override
public boolean isPauseScreen()
{
public boolean isPauseScreen() {
return false;
}
@Override
public void render(MatrixStack matrices, int mouseX, int mouseY, float delta)
{
public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
super.render(matrices, mouseX, mouseY, delta);
RingPage page = this.mod.ring.getCurrentPage();
@@ -49,8 +45,7 @@ public class RingScreen extends Screen
}
@Override
public boolean mouseReleased(double mouseX, double mouseY, int button)
{
public boolean mouseReleased(double mouseX, double mouseY, int button) {
/*if (LambdaControlsClient.BINDING_RING.matchesMouse(button)) {
this.onClose();
return true;

View File

@@ -17,10 +17,8 @@ import org.jetbrains.annotations.NotNull;
/**
* Represents the touchscreen overlay
*/
public class TouchscreenOverlay extends Screen
{
public TouchscreenOverlay(@NotNull LambdaControlsClient mod)
{
public class TouchscreenOverlay extends Screen {
public TouchscreenOverlay(@NotNull LambdaControlsClient mod) {
super(new LiteralText("Touchscreen overlay"));
}
/*public static final Identifier WIDGETS_LOCATION = new Identifier("lambdacontrols", "textures/gui/widgets.png");

View File

@@ -9,8 +9,8 @@
package dev.lambdaurora.lambdacontrols.client.gui.widget;
import dev.lambdaurora.lambdacontrols.client.gui.LambdaControlsRenderer;
import dev.lambdaurora.lambdacontrols.client.controller.ButtonBinding;
import dev.lambdaurora.lambdacontrols.client.gui.LambdaControlsRenderer;
import me.lambdaurora.spruceui.Position;
import me.lambdaurora.spruceui.SpruceTexts;
import me.lambdaurora.spruceui.widget.AbstractSpruceIconButtonWidget;

View File

@@ -14,8 +14,7 @@ import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(AbstractButtonWidget.class)
public interface AbstractButtonWidgetAccessor
{
public interface AbstractButtonWidgetAccessor {
@Accessor("height")
int getHeight();
}

View File

@@ -22,8 +22,7 @@ import java.util.Map;
* Represents an accessor of {@link AdvancementsScreen}.
*/
@Mixin(AdvancementsScreen.class)
public interface AdvancementsScreenAccessor
{
public interface AdvancementsScreenAccessor {
@Accessor("advancementHandler")
ClientAdvancementManager getAdvancementManager();

View File

@@ -1,32 +0,0 @@
/*
* Copyright © 2020 LambdAurora <aurora42lambda@gmail.com>
*
* This file is part of LambdaControls.
*
* Licensed under the MIT license. For more information,
* see the LICENSE file.
*/
package dev.lambdaurora.lambdacontrols.client.mixin;
import dev.lambdaurora.lambdacontrols.LambdaControls;
import dev.lambdaurora.lambdacontrols.client.LambdaControlsClient;
import net.fabricmc.fabric.api.network.ClientSidePacketRegistry;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.network.packet.s2c.play.GameJoinS2CPacket;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(ClientPlayNetworkHandler.class)
public class ClientPlayNetworkHandlerMixin
{
@Inject(method = "onGameJoin", at = @At(value = "TAIL"))
private void onGameJoin(GameJoinS2CPacket packet, CallbackInfo ci)
{
ClientSidePacketRegistry.INSTANCE.sendToServer(LambdaControls.HELLO_CHANNEL, LambdaControls.get().makeHello(LambdaControlsClient.get().config.getControlsMode()));
ClientSidePacketRegistry.INSTANCE.sendToServer(LambdaControls.CONTROLS_MODE_CHANNEL,
LambdaControls.get().makeControlsModeBuffer(LambdaControlsClient.get().config.getControlsMode()));
}
}

View File

@@ -31,7 +31,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
*/
@Mixin(ClientPlayerEntity.class)
public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity {
private boolean lambdacontrols_driftingPrevented = false;
private boolean lambdacontrols$driftingPrevented = false;
@Shadow
protected abstract boolean hasMovementInput();
@@ -56,13 +56,13 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity
if (type == MovementType.SELF) {
if (this.abilities.flying && (!mod.config.hasFlyDrifting() || !mod.config.hasFlyVerticalDrifting())) {
if (!this.hasMovementInput()) {
if (!this.lambdacontrols_driftingPrevented) {
if (!this.lambdacontrols$driftingPrevented) {
if (!mod.config.hasFlyDrifting())
this.setVelocity(this.getVelocity().multiply(0, 1.0, 0));
}
this.lambdacontrols_driftingPrevented = true;
this.lambdacontrols$driftingPrevented = true;
} else
this.lambdacontrols_driftingPrevented = false;
this.lambdacontrols$driftingPrevented = false;
}
}
}

View File

@@ -26,20 +26,17 @@ import org.spongepowered.asm.mixin.injection.Redirect;
* Injects the new controls settings button.
*/
@Mixin(ControlsOptionsScreen.class)
public class ControlsOptionsScreenMixin extends GameOptionsScreen
{
public ControlsOptionsScreenMixin(Screen parent, GameOptions gameOptions, Text text)
{
public class ControlsOptionsScreenMixin extends GameOptionsScreen {
public ControlsOptionsScreenMixin(Screen parent, GameOptions gameOptions, Text text) {
super(parent, gameOptions, text);
}
@Redirect(method = "init", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/options/ControlsOptionsScreen;addButton(Lnet/minecraft/client/gui/widget/AbstractButtonWidget;)Lnet/minecraft/client/gui/widget/AbstractButtonWidget;", ordinal = 1))
private AbstractButtonWidget onInit(ControlsOptionsScreen screen, AbstractButtonWidget btn)
{
private AbstractButtonWidget onInit(ControlsOptionsScreen screen, AbstractButtonWidget btn) {
/*if (this.parent instanceof ControllerControlsWidget)
return this.addButton(btn);
else*/
return this.addButton(new ButtonWidget(btn.x, btn.y, btn.getWidth(), ((AbstractButtonWidgetAccessor) btn).getHeight(), new TranslatableText("menu.options"),
b -> this.client.openScreen(new LambdaControlsSettingsScreen(this, true))));
return this.addButton(new ButtonWidget(btn.x, btn.y, btn.getWidth(), ((AbstractButtonWidgetAccessor) btn).getHeight(), new TranslatableText("menu.options"),
b -> this.client.openScreen(new LambdaControlsSettingsScreen(this, true))));
}
}

View File

@@ -22,8 +22,7 @@ import org.spongepowered.asm.mixin.gen.Invoker;
* Represents an accessor to CreativeInventoryScreen.
*/
@Mixin(CreativeInventoryScreen.class)
public interface CreativeInventoryScreenAccessor
{
public interface CreativeInventoryScreenAccessor {
/**
* Gets the selected tab.
*
@@ -38,7 +37,7 @@ public interface CreativeInventoryScreenAccessor
* @param group The tab's item group.
*/
@Invoker("setSelectedTab")
void lambdacontrols_setSelectedTab(@NotNull ItemGroup group);
void lambdacontrols$setSelectedTab(@NotNull ItemGroup group);
/**
* Returns whether the slot belongs to the creative inventory or not.
@@ -47,7 +46,7 @@ public interface CreativeInventoryScreenAccessor
* @return True if the slot is from the creative inventory, else false.
*/
@Invoker("isCreativeInventorySlot")
boolean lambdacontrols_isCreativeInventorySlot(@Nullable Slot slot);
boolean lambdacontrols$isCreativeInventorySlot(@Nullable Slot slot);
/**
* Returns whether the current tab has a scrollbar or not.
@@ -55,5 +54,5 @@ public interface CreativeInventoryScreenAccessor
* @return True if the current tab has a scrollbar, else false.
*/
@Invoker("hasScrollbar")
boolean lambdacontrols_hasScrollbar();
boolean lambdacontrols$hasScrollbar();
}

View File

@@ -14,8 +14,7 @@ import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
@Mixin(EntryListWidget.class)
public interface EntryListWidgetAccessor
{
public interface EntryListWidgetAccessor {
@Invoker("moveSelection")
void lambdacontrols_moveSelection(EntryListWidget.MoveDirection direction);
void lambdacontrols$moveSelection(EntryListWidget.MoveDirection direction);
}

View File

@@ -22,14 +22,12 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
* Sets the default of the Auto-Jump option to false.
*/
@Mixin(GameOptions.class)
public class GameOptionsMixin
{
public class GameOptionsMixin {
@Shadow
public boolean autoJump;
@Inject(method = "load", at = @At("HEAD"))
public void onInit(CallbackInfo ci)
{
public void onInit(CallbackInfo ci) {
// Set default value of the Auto-Jump option to false.
this.autoJump = false;
}

View File

@@ -21,15 +21,13 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(GameRenderer.class)
public class GameRendererMixin
{
public class GameRendererMixin {
@Shadow
@Final
private MinecraftClient client;
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Mouse;getX()D"))
private void onRender(float tickDelta, long startTime, boolean fullRender, CallbackInfo ci)
{
private void onRender(float tickDelta, long startTime, boolean fullRender, CallbackInfo ci) {
if (this.client.currentScreen != null && LambdaControlsClient.get().config.getControlsMode() == ControlsMode.CONTROLLER)
LambdaControlsClient.get().input.onPreRenderScreen(this.client, this.client.currentScreen);
}

View File

@@ -32,8 +32,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
* Represents the mixin for the class ContainerScreen.
*/
@Mixin(HandledScreen.class)
public abstract class HandledScreenMixin implements HandledScreenAccessor
{
public abstract class HandledScreenMixin implements HandledScreenAccessor {
@Accessor("x")
public abstract int getX();
@@ -41,17 +40,16 @@ public abstract class HandledScreenMixin implements HandledScreenAccessor
public abstract int getY();
@Invoker("getSlotAt")
public abstract Slot lambdacontrols_getSlotAt(double posX, double posY);
public abstract Slot lambdacontrols$getSlotAt(double posX, double posY);
@Invoker("isClickOutsideBounds")
public abstract boolean lambdacontrols_isClickOutsideBounds(double mouseX, double mouseY, int x, int y, int button);
public abstract boolean lambdacontrols$isClickOutsideBounds(double mouseX, double mouseY, int x, int y, int button);
@Invoker("onMouseClick")
public abstract void lambdacontrols_onMouseClick(@Nullable Slot slot, int slotId, int clickData, SlotActionType actionType);
public abstract void lambdacontrols$onMouseClick(@Nullable Slot slot, int slotId, int clickData, SlotActionType actionType);
@Inject(method = "render", at = @At("RETURN"))
public void onRender(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci)
{
public void onRender(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) {
if (LambdaControlsClient.get().config.getControlsMode() == ControlsMode.CONTROLLER) {
MinecraftClient client = MinecraftClient.getInstance();
int x = 2, y = client.getWindow().getScaledHeight() - 2 - LambdaControlsRenderer.ICON_SIZE;

View File

@@ -15,8 +15,7 @@ import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
@Mixin(KeyBinding.class)
public class KeyBindingMixin implements KeyBindingAccessor
{
public class KeyBindingMixin implements KeyBindingAccessor {
@Shadow
private int timesPressed;
@@ -24,8 +23,7 @@ public class KeyBindingMixin implements KeyBindingAccessor
private boolean pressed;
@Override
public boolean lambdacontrols_press()
{
public boolean lambdacontrols$press() {
boolean oldPressed = this.pressed;
if (!this.pressed)
this.pressed = true;
@@ -34,8 +32,7 @@ public class KeyBindingMixin implements KeyBindingAccessor
}
@Override
public boolean lambdacontrols_unpress()
{
public boolean lambdacontrols$unpress() {
if (this.pressed) {
this.pressed = false;
return true;

View File

@@ -38,8 +38,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
@Mixin(MinecraftClient.class)
public abstract class MinecraftClientMixin
{
public abstract class MinecraftClientMixin {
@Shadow
@Nullable
public HitResult crosshairTarget;
@@ -63,26 +62,24 @@ public abstract class MinecraftClientMixin
@Shadow
private int itemUseCooldown;
private BlockPos lambdacontrols_lastTargetPos;
private Vec3d lambdacontrols_lastPos;
private Direction lambdacontrols_lastTargetSide;
private BlockPos lambdacontrols$lastTargetPos;
private Vec3d lambdacontrols$lastPos;
private Direction lambdacontrols$lastTargetSide;
@Inject(method = "<init>", at = @At("RETURN"))
private void onInit(CallbackInfo ci)
{
private void onInit(CallbackInfo ci) {
LambdaControlsClient.get().onMcInit((MinecraftClient) (Object) this);
}
@Inject(method = "tick", at = @At("HEAD"))
private void onStartTick(CallbackInfo ci)
{
private void onStartTick(CallbackInfo ci) {
if (this.player == null)
return;
if (!LambdaControlsFeature.FAST_BLOCK_PLACING.isAvailable())
return;
if (this.lambdacontrols_lastPos == null)
this.lambdacontrols_lastPos = this.player.getPos();
if (this.lambdacontrols$lastPos == null)
this.lambdacontrols$lastPos = this.player.getPos();
int cooldown = this.itemUseCooldown;
BlockHitResult hitResult;
@@ -91,50 +88,41 @@ public abstract class MinecraftClientMixin
BlockPos targetPos = hitResult.getBlockPos();
Direction side = hitResult.getSide();
boolean sidewaysBlockPlacing = this.lambdacontrols_lastTargetPos == null || !targetPos.equals(this.lambdacontrols_lastTargetPos.offset(this.lambdacontrols_lastTargetSide));
boolean backwardsBlockPlacing = this.player.input.movementForward < 0.0f && (this.lambdacontrols_lastTargetPos == null || targetPos.equals(this.lambdacontrols_lastTargetPos.offset(this.lambdacontrols_lastTargetSide)));
boolean sidewaysBlockPlacing = this.lambdacontrols$lastTargetPos == null || !targetPos.equals(this.lambdacontrols$lastTargetPos.offset(this.lambdacontrols$lastTargetSide));
boolean backwardsBlockPlacing = this.player.input.movementForward < 0.0f && (this.lambdacontrols$lastTargetPos == null || targetPos.equals(this.lambdacontrols$lastTargetPos.offset(this.lambdacontrols$lastTargetSide)));
if (cooldown > 1
&& !targetPos.equals(this.lambdacontrols_lastTargetPos)
&& !targetPos.equals(this.lambdacontrols$lastTargetPos)
&& (sidewaysBlockPlacing || backwardsBlockPlacing)) {
this.itemUseCooldown = 1;
}
this.lambdacontrols_lastTargetPos = targetPos.toImmutable();
this.lambdacontrols_lastTargetSide = side;
this.lambdacontrols$lastTargetPos = targetPos.toImmutable();
this.lambdacontrols$lastTargetSide = side;
}
// Removed front placing sprinting as way too cheaty.
else if (this.player.isSprinting()) {
/*else if (this.player.isSprinting()) {
hitResult = LambdaControlsClient.get().reacharound.getLastReacharoundResult();
if (hitResult != null) {
if (cooldown > 0)
this.itemUseCooldown = 0;
}
}
this.lambdacontrols_lastPos = this.player.getPos();
}*/
this.lambdacontrols$lastPos = this.player.getPos();
}
@Inject(method = "render", at = @At("HEAD"))
private void onRender(boolean fullRender, CallbackInfo ci)
{
private void onRender(boolean fullRender, CallbackInfo ci) {
LambdaControlsClient.get().onRender((MinecraftClient) (Object) (this));
}
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/GameRenderer;render(FJZ)V", shift = At.Shift.AFTER))
private void renderVirtualCursor(boolean fullRender, CallbackInfo ci)
{
private void renderVirtualCursor(boolean fullRender, CallbackInfo ci) {
LambdaControlsRenderer.renderVirtualCursor(new MatrixStack(), (MinecraftClient) (Object) this);
}
@Inject(method = "disconnect(Lnet/minecraft/client/gui/screen/Screen;)V", at = @At("RETURN"))
private void onLeave(@Nullable Screen screen, CallbackInfo ci)
{
LambdaControlsClient.get().onLeave();
}
@Inject(method = "doItemUse()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/hit/HitResult;getType()Lnet/minecraft/util/hit/HitResult$Type;"), locals = LocalCapture.CAPTURE_FAILEXCEPTION, cancellable = true)
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) {
LambdaControlsClient mod = LambdaControlsClient.get();
if (!stackInHand.isEmpty() && this.player.pitch > 35.0F && mod.reacharound.isReacharoundAvailable()) {
if (this.crosshairTarget != null && this.crosshairTarget.getType() == HitResult.Type.MISS && this.player.isOnGround()) {

View File

@@ -36,7 +36,7 @@ public abstract class MouseMixin implements MouseAccessor
private MinecraftClient client;
@Invoker("onCursorPos")
public abstract void lambdacontrols_onCursorPos(long window, double x, double y);
public abstract void lambdacontrols$onCursorPos(long window, double x, double y);
@Inject(method = "method_1605", at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/client/gui/screen/Screen;mouseReleased(DDI)Z"))
private void onMouseBackButton(boolean[] result, double mouseX, double mouseY, int button, CallbackInfo ci)

View File

@@ -25,16 +25,13 @@ import org.spongepowered.asm.mixin.injection.Redirect;
* Injects the new controls settings button.
*/
@Mixin(OptionsScreen.class)
public class OptionsScreenMixin extends Screen
{
protected OptionsScreenMixin(Text title)
{
public class OptionsScreenMixin extends Screen {
protected OptionsScreenMixin(Text title) {
super(title);
}
@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(OptionsScreen screen, AbstractButtonWidget btn)
{
private AbstractButtonWidget lambdacontrols$onInit(OptionsScreen screen, AbstractButtonWidget btn) {
if (LambdaControlsClient.get().config.getControlsMode() == ControlsMode.CONTROLLER) {
return this.addButton(new ButtonWidget(btn.x, btn.y, btn.getWidth(), ((AbstractButtonWidgetAccessor) btn).getHeight(), btn.getMessage(),
b -> this.client.openScreen(new LambdaControlsSettingsScreen(this, false))));

View File

@@ -18,8 +18,7 @@ import org.spongepowered.asm.mixin.gen.Invoker;
import java.util.List;
@Mixin(RecipeBookWidget.class)
public interface RecipeBookWidgetAccessor
{
public interface RecipeBookWidgetAccessor {
@Accessor("tabButtons")
List<RecipeGroupButtonWidget> getTabButtons();
@@ -30,5 +29,5 @@ public interface RecipeBookWidgetAccessor
void setCurrentTab(RecipeGroupButtonWidget currentTab);
@Invoker("refreshResults")
void lambdacontrols_refreshResults(boolean resetCurrentPage);
void lambdacontrols$refreshResults(boolean resetCurrentPage);
}

View File

@@ -41,8 +41,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
* Handles the rendering of the block outline of the reach-around features.
*/
@Mixin(WorldRenderer.class)
public abstract class WorldRendererMixin
{
public abstract class WorldRendererMixin {
@Shadow
@Final
private MinecraftClient client;
@@ -55,8 +54,7 @@ public abstract class WorldRendererMixin
private BufferBuilderStorage bufferBuilders;
@Shadow
private static void drawShapeOutline(MatrixStack matrixStack, VertexConsumer vertexConsumer, VoxelShape voxelShape, double d, double e, double f, float g, float h, float i, float j)
{
private static void drawShapeOutline(MatrixStack matrixStack, VertexConsumer vertexConsumer, VoxelShape voxelShape, double d, double e, double f, float g, float h, float i, float j) {
}
@Inject(
@@ -69,8 +67,7 @@ public abstract class WorldRendererMixin
)
)
private void onOutlineRender(MatrixStack matrices, float tickDelta, long limitTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer,
LightmapTextureManager lightmapTextureManager, Matrix4f matrix4f, CallbackInfo ci)
{
LightmapTextureManager lightmapTextureManager, Matrix4f matrix4f, CallbackInfo ci) {
if (this.client.crosshairTarget == null || this.client.crosshairTarget.getType() != HitResult.Type.MISS || !LambdaControlsClient.get().config.shouldRenderReacharoundOutline())
return;
BlockHitResult result = LambdaControlsClient.get().reacharound.getLastReacharoundResult();

View File

@@ -14,28 +14,23 @@ import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.util.math.MatrixStack;
import org.jetbrains.annotations.NotNull;
public class DummyRingAction extends RingAction
{
public DummyRingAction(@NotNull Config config)
{
public class DummyRingAction extends RingAction {
public DummyRingAction(@NotNull Config config) {
super(config);
}
@Override
public @NotNull String getName()
{
public @NotNull String getName() {
return "dummy";
}
@Override
public void onAction(@NotNull RingButtonMode mode)
{
public void onAction(@NotNull RingButtonMode mode) {
}
@Override
public void drawIcon(@NotNull MatrixStack matrices, @NotNull TextRenderer textRenderer, int x, int y, boolean hovered)
{
public void drawIcon(@NotNull MatrixStack matrices, @NotNull TextRenderer textRenderer, int x, int y, boolean hovered) {
drawCenteredString(matrices, textRenderer, this.getName(), x + 25, y + 25 - textRenderer.fontHeight / 2, 0xffffff);
}
}

View File

@@ -21,26 +21,22 @@ import org.jetbrains.annotations.Nullable;
import java.util.function.Supplier;
public class KeyBindingRingAction extends RingAction
{
public static final Factory FACTORY = new Factory();
public final KeyBinding binding;
public class KeyBindingRingAction extends RingAction {
public static final Factory FACTORY = new Factory();
public final KeyBinding binding;
public KeyBindingRingAction(@NotNull Config config, @NotNull KeyBinding binding)
{
public KeyBindingRingAction(@NotNull Config config, @NotNull KeyBinding binding) {
super(config);
this.binding = binding;
}
@Override
public @NotNull String getName()
{
public @NotNull String getName() {
return this.binding.getTranslationKey();
}
@Override
public void onAction(@NotNull RingButtonMode mode)
{
public void onAction(@NotNull RingButtonMode mode) {
KeyBindingAccessor accessor = (KeyBindingAccessor) this.binding;
switch (mode) {
case PRESS:
@@ -55,22 +51,18 @@ public class KeyBindingRingAction extends RingAction
}
@Override
public void drawIcon(@NotNull MatrixStack matrices, @NotNull TextRenderer textRenderer, int x, int y, boolean hovered)
{
public void drawIcon(@NotNull MatrixStack matrices, @NotNull TextRenderer textRenderer, int x, int y, boolean hovered) {
drawCenteredText(matrices, textRenderer, new TranslatableText(this.getName()), x + 25, y + 25 - textRenderer.fontHeight / 2, 0xffffff);
}
protected static class Factory implements RingAction.Factory
{
protected static class Factory implements RingAction.Factory {
@Override
public @NotNull Supplier<RingAction> newFromGui(@NotNull Screen screen)
{
public @NotNull Supplier<RingAction> newFromGui(@NotNull Screen screen) {
return () -> null;
}
@Override
public @Nullable RingAction parse(@NotNull Config config)
{
public @Nullable RingAction parse(@NotNull Config config) {
return null;
}
}

View File

@@ -10,9 +10,9 @@
package dev.lambdaurora.lambdacontrols.client.ring;
import com.electronwill.nightconfig.core.Config;
import dev.lambdaurora.lambdacontrols.client.LambdaControlsClient;
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import dev.lambdaurora.lambdacontrols.client.LambdaControlsClient;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
@@ -26,22 +26,19 @@ import java.util.List;
* @version 1.5.0
* @since 1.4.0
*/
public final class LambdaRing
{
public final class LambdaRing {
public static final int ELEMENT_SIZE = 50;
private final Object2ObjectMap<String, RingAction.Factory> actionFactories = new Object2ObjectOpenHashMap<>();
private final List<RingPage> pages = new ArrayList<>(Collections.singletonList(RingPage.DEFAULT));
private final List<RingPage> pages = new ArrayList<>(Collections.singletonList(RingPage.DEFAULT));
private final LambdaControlsClient mod;
private int currentPage = 0;
private int currentPage = 0;
public LambdaRing(@NotNull LambdaControlsClient mod)
{
public LambdaRing(@NotNull LambdaControlsClient mod) {
this.mod = mod;
}
public void registerAction(@NotNull String name, @NotNull RingAction.Factory factory)
{
public void registerAction(@NotNull String name, @NotNull RingAction.Factory factory) {
if (this.actionFactories.containsKey(name)) {
this.mod.warn("Tried to register twice a ring action: \"" + name + "\".");
return;
@@ -54,8 +51,7 @@ public final class LambdaRing
*
* @param config The configuration.
*/
public void load(@NotNull Config config)
{
public void load(@NotNull Config config) {
List<Config> configPages = config.get("ring.pages");
if (configPages != null) {
this.pages.clear();
@@ -68,8 +64,7 @@ public final class LambdaRing
}
}
public @NotNull RingPage getCurrentPage()
{
public @NotNull RingPage getCurrentPage() {
if (this.currentPage >= this.pages.size())
this.currentPage = this.pages.size() - 1;
else if (this.currentPage < 0)

View File

@@ -29,13 +29,11 @@ import java.util.function.Supplier;
* @version 1.5.0
* @since 1.4.0
*/
public abstract class RingAction extends DrawableHelper implements Nameable
{
protected Config config;
public abstract class RingAction extends DrawableHelper implements Nameable {
protected Config config;
protected boolean activated = false;
public RingAction(@NotNull Config config)
{
public RingAction(@NotNull Config config) {
this.config = config;
}
@@ -44,8 +42,7 @@ public abstract class RingAction extends DrawableHelper implements Nameable
*
* @return The text name.
*/
public Text getTextName()
{
public Text getTextName() {
return new TranslatableText(this.getName());
}
@@ -54,13 +51,11 @@ public abstract class RingAction extends DrawableHelper implements Nameable
*
* @return True if the action is activated, else false.
*/
public boolean isActivated()
{
public boolean isActivated() {
return this.activated;
}
public void activate(@NotNull RingButtonMode mode)
{
public void activate(@NotNull RingButtonMode mode) {
this.activated = !this.activated;
this.onAction(mode);
@@ -68,8 +63,7 @@ public abstract class RingAction extends DrawableHelper implements Nameable
public abstract void onAction(@NotNull RingButtonMode mode);
public void render(@NotNull MatrixStack matrices, @NotNull TextRenderer textRenderer, int x, int y, boolean hovered)
{
public void render(@NotNull MatrixStack matrices, @NotNull TextRenderer textRenderer, int x, int y, boolean hovered) {
fill(matrices, x, y, x + LambdaRing.ELEMENT_SIZE, y + LambdaRing.ELEMENT_SIZE, hovered ? 0xbb777777 : 0xbb000000);
drawIcon(matrices, textRenderer, x, y, hovered);
}
@@ -82,8 +76,7 @@ public abstract class RingAction extends DrawableHelper implements Nameable
* @version 1.4.3
* @since 1.4.3
*/
public interface Factory
{
public interface Factory {
@NotNull Supplier<RingAction> newFromGui(@NotNull Screen screen);
@Nullable RingAction parse(@NotNull Config config);

View File

@@ -21,17 +21,15 @@ import org.jetbrains.annotations.NotNull;
* @version 1.4.0
* @since 1.4.0
*/
public enum RingButtonMode implements Nameable
{
public enum RingButtonMode implements Nameable {
PRESS("press"),
HOLD("hold"),
TOGGLE("toggle");
private final String name;
private final Text text;
private final Text text;
RingButtonMode(@NotNull String name)
{
RingButtonMode(@NotNull String name) {
this.name = name;
this.text = new TranslatableText(this.getTranslationKey());
}
@@ -41,8 +39,7 @@ public enum RingButtonMode implements Nameable
*
* @return The next ring button mode.
*/
public @NotNull RingButtonMode next()
{
public @NotNull RingButtonMode next() {
RingButtonMode[] v = values();
if (v.length == this.ordinal() + 1)
return v[0];
@@ -54,8 +51,7 @@ public enum RingButtonMode implements Nameable
*
* @return The translation key of this ring button mode.
*/
public @NotNull String getTranslationKey()
{
public @NotNull String getTranslationKey() {
return "lambdacontrols.ring.button_mode." + this.getName();
}
@@ -64,14 +60,12 @@ public enum RingButtonMode implements Nameable
*
* @return The translated name of this ring button mode.
*/
public @NotNull Text getTranslatedText()
{
public @NotNull Text getTranslatedText() {
return this.text;
}
@Override
public @NotNull String getName()
{
public @NotNull String getName() {
return this.name;
}
}

View File

@@ -25,15 +25,13 @@ import java.util.Optional;
* @version 1.5.0
* @since 1.4.0
*/
public class RingPage extends DrawableHelper
{
public class RingPage extends DrawableHelper {
public static final RingPage DEFAULT = new RingPage("Default");
public final String name;
private RingAction[] actions = new RingAction[8];
public final String name;
private RingAction[] actions = new RingAction[8];
public RingPage(@NotNull String name)
{
public RingPage(@NotNull String name) {
this.name = name;
for (int i = 0; i < 8; i++) {
this.actions[i] = null;
@@ -43,15 +41,14 @@ public class RingPage extends DrawableHelper
/**
* Renders the ring page.
*
* @param matrices The matrices.
* @param width The screen width.
* @param height The screen height.
* @param mouseX The mouse X-coordinate.
* @param mouseY The mouse Y-coordinate.
* @param matrices The matrices.
* @param width The screen width.
* @param height The screen height.
* @param mouseX The mouse X-coordinate.
* @param mouseY The mouse Y-coordinate.
* @param tickDelta The tick delta.
*/
public void render(@NotNull MatrixStack matrices, @NotNull TextRenderer textRenderer, int width, int height, int mouseX, int mouseY, float tickDelta)
{
public void render(@NotNull MatrixStack matrices, @NotNull TextRenderer textRenderer, int width, int height, int mouseX, int mouseY, float tickDelta) {
int centerX = width / 2;
int centerY = height / 2;
@@ -83,8 +80,7 @@ public class RingPage extends DrawableHelper
}
}
private static boolean isHovered(int x, int y, int mouseX, int mouseY)
{
private static boolean isHovered(int x, int y, int mouseX, int mouseY) {
return mouseX >= x && mouseY >= y && mouseX <= x + LambdaRing.ELEMENT_SIZE && mouseY <= y + LambdaRing.ELEMENT_SIZE;
}
@@ -94,8 +90,7 @@ public class RingPage extends DrawableHelper
* @param config The configuration.
* @return An optional ring page.
*/
public static @NotNull Optional<RingPage> parseRingPage(@NotNull Config config)
{
public static @NotNull Optional<RingPage> parseRingPage(@NotNull Config config) {
String name = config.get("name");
if (name == null)
return Optional.empty();

View File

@@ -16,8 +16,7 @@ import org.jetbrains.annotations.Nullable;
/**
* Represents an accessor to AbstractContainerScreen.
*/
public interface HandledScreenAccessor
{
public interface HandledScreenAccessor {
/**
* Gets the left coordinate of the GUI.
*
@@ -39,17 +38,17 @@ public interface HandledScreenAccessor
* @param pos_y The Y position to check.
* @return The slot at the specified position.
*/
Slot lambdacontrols_getSlotAt(double pos_x, double pos_y);
Slot lambdacontrols$getSlotAt(double pos_x, double pos_y);
boolean lambdacontrols_isClickOutsideBounds(double mouseX, double mouseY, int x, int y, int button);
boolean lambdacontrols$isClickOutsideBounds(double mouseX, double mouseY, int x, int y, int button);
/**
* Handles a mouse click on the specified slot.
*
* @param slot The slot instance.
* @param slotId The slot id.
* @param clickData The click data.
* @param slot The slot instance.
* @param slotId The slot id.
* @param clickData The click data.
* @param actionType The action type.
*/
void lambdacontrols_onMouseClick(@Nullable Slot slot, int slotId, int clickData, SlotActionType actionType);
void lambdacontrols$onMouseClick(@Nullable Slot slot, int slotId, int clickData, SlotActionType actionType);
}

View File

@@ -12,17 +12,15 @@ package dev.lambdaurora.lambdacontrols.client.util;
/**
* Represents a Minecraft keybinding with extra access.
*/
public interface KeyBindingAccessor
{
boolean lambdacontrols_press();
public interface KeyBindingAccessor {
boolean lambdacontrols$press();
boolean lambdacontrols_unpress();
boolean lambdacontrols$unpress();
default boolean lambdacontrols_handlePressState(boolean pressed)
{
default boolean lambdacontrols_handlePressState(boolean pressed) {
if (pressed)
return this.lambdacontrols_press();
return this.lambdacontrols$press();
else
return this.lambdacontrols_unpress();
return this.lambdacontrols$unpress();
}
}

View File

@@ -12,7 +12,6 @@ package dev.lambdaurora.lambdacontrols.client.util;
/**
* Represents mouse's extra access.
*/
public interface MouseAccessor
{
void lambdacontrols_onCursorPos(long window, double x, double y);
public interface MouseAccessor {
void lambdacontrols$onCursorPos(long window, double x, double y);
}

View File

@@ -23,8 +23,7 @@ import org.jetbrains.annotations.NotNull;
* @since 1.1.0
*/
@FunctionalInterface
public interface PlayerChangeControlsModeCallback
{
public interface PlayerChangeControlsModeCallback {
Event<PlayerChangeControlsModeCallback> EVENT = EventFactory.createArrayBacked(PlayerChangeControlsModeCallback.class, listeners -> (player, controlsMode) -> {
for (PlayerChangeControlsModeCallback event : listeners) {
event.apply(player, controlsMode);

View File

@@ -6,7 +6,6 @@
"AbstractButtonWidgetAccessor",
"AdvancementsScreenAccessor",
"ClientPlayerEntityMixin",
"ClientPlayNetworkHandlerMixin",
"ControlsOptionsScreenMixin",
"CreativeInventoryScreenAccessor",
"EntryListWidgetAccessor",