mirror of
https://github.com/TeamMidnightDust/MidnightControls.git
synced 2025-12-13 07:15:10 +01:00
Reformat code and update networking.
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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))));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))));
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
"AbstractButtonWidgetAccessor",
|
||||
"AdvancementsScreenAccessor",
|
||||
"ClientPlayerEntityMixin",
|
||||
"ClientPlayNetworkHandlerMixin",
|
||||
"ControlsOptionsScreenMixin",
|
||||
"CreativeInventoryScreenAccessor",
|
||||
"EntryListWidgetAccessor",
|
||||
|
||||
Reference in New Issue
Block a user