mirror of
https://github.com/chylex/Better-Controls.git
synced 2024-11-25 01:42:45 +01:00
Compare commits
No commits in common. "ead8c8454944b8d2d75430294889a1fe5ed7ce2f" and "ffa30b0ca8daaa25893c0249f5a4a136d427c23d" have entirely different histories.
ead8c84549
...
ffa30b0ca8
@ -3,18 +3,22 @@ package chylex.bettercontrols;
|
|||||||
import chylex.bettercontrols.config.BetterControlsConfig;
|
import chylex.bettercontrols.config.BetterControlsConfig;
|
||||||
import chylex.bettercontrols.gui.BetterControlsScreen;
|
import chylex.bettercontrols.gui.BetterControlsScreen;
|
||||||
import net.neoforged.api.distmarker.Dist;
|
import net.neoforged.api.distmarker.Dist;
|
||||||
|
import net.neoforged.fml.IExtensionPoint.DisplayTest;
|
||||||
import net.neoforged.fml.ModLoadingContext;
|
import net.neoforged.fml.ModLoadingContext;
|
||||||
import net.neoforged.fml.common.Mod;
|
import net.neoforged.fml.common.Mod;
|
||||||
import net.neoforged.fml.loading.FMLEnvironment;
|
import net.neoforged.fml.loading.FMLEnvironment;
|
||||||
import net.neoforged.fml.loading.FMLPaths;
|
import net.neoforged.fml.loading.FMLPaths;
|
||||||
import net.neoforged.neoforge.client.gui.IConfigScreenFactory;
|
import net.neoforged.neoforge.client.ConfigScreenHandler.ConfigScreenFactory;
|
||||||
|
import net.neoforged.neoforge.network.NetworkConstants;
|
||||||
|
|
||||||
@Mod("bettercontrols")
|
@Mod("bettercontrols")
|
||||||
public final class BetterControlsMod {
|
public final class BetterControlsMod {
|
||||||
public BetterControlsMod() {
|
public BetterControlsMod() {
|
||||||
if (FMLEnvironment.dist == Dist.CLIENT) {
|
if (FMLEnvironment.dist == Dist.CLIENT) {
|
||||||
BetterControlsCommon.setConfig(BetterControlsConfig.load(FMLPaths.CONFIGDIR.get().resolve("BetterControls.json")));
|
BetterControlsCommon.setConfig(BetterControlsConfig.load(FMLPaths.CONFIGDIR.get().resolve("BetterControls.json")));
|
||||||
ModLoadingContext.get().registerExtensionPoint(IConfigScreenFactory.class, () -> BetterControlsScreen::new);
|
ModLoadingContext.get().registerExtensionPoint(ConfigScreenFactory.class, () -> new ConfigScreenFactory(BetterControlsScreen::new));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ModLoadingContext.get().registerExtensionPoint(DisplayTest.class, () -> new DisplayTest(() -> NetworkConstants.IGNORESERVERONLY, (a, b) -> true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ modId=bettercontrols
|
|||||||
modName=Better Controls
|
modName=Better Controls
|
||||||
modDescription=Adds many powerful key bindings and options to control your movement.\\n\\nThe features complement vanilla mechanics without giving unfair advantages, so server use should be fine.
|
modDescription=Adds many powerful key bindings and options to control your movement.\\n\\nThe features complement vanilla mechanics without giving unfair advantages, so server use should be fine.
|
||||||
modAuthor=chylex
|
modAuthor=chylex
|
||||||
modVersion=1.3.1
|
modVersion=1.3.0b
|
||||||
modLicense=MPL-2.0
|
modLicense=MPL-2.0
|
||||||
modSourcesURL=https://github.com/chylex/Better-Controls
|
modSourcesURL=https://github.com/chylex/Better-Controls
|
||||||
modIssuesURL=https://github.com/chylex/Better-Controls/issues
|
modIssuesURL=https://github.com/chylex/Better-Controls/issues
|
||||||
|
@ -14,11 +14,15 @@ import com.mojang.blaze3d.platform.InputConstants;
|
|||||||
import it.unimi.dsi.fastutil.booleans.BooleanConsumer;
|
import it.unimi.dsi.fastutil.booleans.BooleanConsumer;
|
||||||
import net.minecraft.client.KeyMapping;
|
import net.minecraft.client.KeyMapping;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.client.gui.GuiGraphics;
|
||||||
|
import net.minecraft.client.gui.components.Button;
|
||||||
import net.minecraft.client.gui.components.CycleButton;
|
import net.minecraft.client.gui.components.CycleButton;
|
||||||
import net.minecraft.client.gui.components.events.GuiEventListener;
|
import net.minecraft.client.gui.components.events.GuiEventListener;
|
||||||
import net.minecraft.client.gui.screens.OptionsSubScreen;
|
import net.minecraft.client.gui.screens.OptionsSubScreen;
|
||||||
import net.minecraft.client.gui.screens.Screen;
|
import net.minecraft.client.gui.screens.Screen;
|
||||||
|
import net.minecraft.network.chat.CommonComponents;
|
||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -212,8 +216,6 @@ public class BetterControlsScreen extends OptionsSubScreen {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init() {
|
public void init() {
|
||||||
super.init();
|
|
||||||
|
|
||||||
allKeyBindings.clear();
|
allKeyBindings.clear();
|
||||||
|
|
||||||
final List<GuiEventListener> elements = new ArrayList<>();
|
final List<GuiEventListener> elements = new ArrayList<>();
|
||||||
@ -231,16 +233,10 @@ public class BetterControlsScreen extends OptionsSubScreen {
|
|||||||
elements.add(new TextWidget(0, y, ROW_WIDTH, ROW_HEIGHT, text("Miscellaneous"), CENTER));
|
elements.add(new TextWidget(0, y, ROW_WIDTH, ROW_HEIGHT, text("Miscellaneous"), CENTER));
|
||||||
y = generateMiscellaneousOptions(y + ROW_HEIGHT, elements) + TITLE_MARGIN_TOP;
|
y = generateMiscellaneousOptions(y + ROW_HEIGHT, elements) + TITLE_MARGIN_TOP;
|
||||||
|
|
||||||
optionsWidget = addRenderableWidget(new OptionListWidget(width, layout.getContentHeight(), layout.getHeaderHeight(), y - TITLE_MARGIN_TOP + BOTTOM_PADDING, elements));
|
//noinspection DataFlowIssue
|
||||||
}
|
addRenderableWidget(Button.builder(CommonComponents.GUI_DONE, btn -> minecraft.setScreen(lastScreen)).pos(width / 2 - 99, height - 25).size(200, 20).build());
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void repositionElements() {
|
|
||||||
super.repositionElements();
|
|
||||||
|
|
||||||
if (optionsWidget != null) {
|
addRenderableWidget(optionsWidget = new OptionListWidget(width, height - 50, 21, y - TITLE_MARGIN_TOP + BOTTOM_PADDING, elements));
|
||||||
optionsWidget.updateSize(width, layout);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -248,6 +244,17 @@ public class BetterControlsScreen extends OptionsSubScreen {
|
|||||||
BetterControlsCommon.getConfig().save();
|
BetterControlsCommon.getConfig().save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void renderBackground(final @NotNull GuiGraphics graphics, final int mouseX, final int mouseY, final float delta) {
|
||||||
|
renderDirtBackground(graphics);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void render(final @NotNull GuiGraphics graphics, final int mouseX, final int mouseY, final float delta) {
|
||||||
|
super.render(graphics, mouseX, mouseY, delta);
|
||||||
|
graphics.drawCenteredString(font, title, width / 2, 8, TextWidget.WHITE);
|
||||||
|
}
|
||||||
|
|
||||||
private void startEditingKeyBinding(final KeyBindingWidget widget) {
|
private void startEditingKeyBinding(final KeyBindingWidget widget) {
|
||||||
if (editingKeyBinding != null) {
|
if (editingKeyBinding != null) {
|
||||||
editingKeyBinding.stopEditing();
|
editingKeyBinding.stopEditing();
|
||||||
|
@ -12,7 +12,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||||||
import static org.spongepowered.asm.mixin.injection.At.Shift.AFTER;
|
import static org.spongepowered.asm.mixin.injection.At.Shift.AFTER;
|
||||||
|
|
||||||
@Mixin(KeyboardInput.class)
|
@Mixin(KeyboardInput.class)
|
||||||
@SuppressWarnings("UnreachableCode")
|
|
||||||
public abstract class HookClientPlayerInputTick {
|
public abstract class HookClientPlayerInputTick {
|
||||||
@Inject(method = "tick(ZF)V", at = @At(value = "FIELD", target = "Lnet/minecraft/client/player/KeyboardInput;up:Z", ordinal = 0, shift = AFTER))
|
@Inject(method = "tick(ZF)V", at = @At(value = "FIELD", target = "Lnet/minecraft/client/player/KeyboardInput;up:Z", ordinal = 0, shift = AFTER))
|
||||||
private void afterInputTick(final CallbackInfo info) {
|
private void afterInputTick(final CallbackInfo info) {
|
||||||
|
@ -12,7 +12,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||||||
import static org.spongepowered.asm.mixin.injection.At.Shift.AFTER;
|
import static org.spongepowered.asm.mixin.injection.At.Shift.AFTER;
|
||||||
|
|
||||||
@Mixin(LocalPlayer.class)
|
@Mixin(LocalPlayer.class)
|
||||||
@SuppressWarnings("UnreachableCode")
|
|
||||||
public abstract class HookClientPlayerTick extends AbstractClientPlayer {
|
public abstract class HookClientPlayerTick extends AbstractClientPlayer {
|
||||||
protected HookClientPlayerTick(final ClientLevel world, final GameProfile profile) {
|
protected HookClientPlayerTick(final ClientLevel world, final GameProfile profile) {
|
||||||
super(world, profile);
|
super(world, profile);
|
||||||
|
@ -11,8 +11,8 @@ import org.spongepowered.asm.mixin.injection.At;
|
|||||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
import org.spongepowered.asm.mixin.injection.Slice;
|
import org.spongepowered.asm.mixin.injection.Slice;
|
||||||
|
|
||||||
|
@SuppressWarnings("SameReturnValue")
|
||||||
@Mixin(LocalPlayer.class)
|
@Mixin(LocalPlayer.class)
|
||||||
@SuppressWarnings({ "SameReturnValue", "UnreachableCode" })
|
|
||||||
public abstract class HookClientPlayerVerticalFlightSpeed extends LivingEntity {
|
public abstract class HookClientPlayerVerticalFlightSpeed extends LivingEntity {
|
||||||
protected HookClientPlayerVerticalFlightSpeed(final EntityType<? extends LivingEntity> type, final Level world) {
|
protected HookClientPlayerVerticalFlightSpeed(final EntityType<? extends LivingEntity> type, final Level world) {
|
||||||
super(type, world);
|
super(type, world);
|
||||||
|
@ -3,22 +3,21 @@ package chylex.bettercontrols.mixin;
|
|||||||
import chylex.bettercontrols.gui.BetterControlsScreen;
|
import chylex.bettercontrols.gui.BetterControlsScreen;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.Options;
|
import net.minecraft.client.Options;
|
||||||
|
import net.minecraft.client.gui.components.AbstractWidget;
|
||||||
import net.minecraft.client.gui.components.Button;
|
import net.minecraft.client.gui.components.Button;
|
||||||
import net.minecraft.client.gui.components.OptionsList;
|
|
||||||
import net.minecraft.client.gui.components.events.GuiEventListener;
|
import net.minecraft.client.gui.components.events.GuiEventListener;
|
||||||
import net.minecraft.client.gui.screens.OptionsSubScreen;
|
import net.minecraft.client.gui.screens.OptionsSubScreen;
|
||||||
import net.minecraft.client.gui.screens.Screen;
|
import net.minecraft.client.gui.screens.Screen;
|
||||||
import net.minecraft.client.gui.screens.controls.ControlsScreen;
|
import net.minecraft.client.gui.screens.controls.ControlsScreen;
|
||||||
|
import net.minecraft.network.chat.CommonComponents;
|
||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
import net.minecraft.network.chat.MutableComponent;
|
import net.minecraft.network.chat.MutableComponent;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Mixin(ControlsScreen.class)
|
@Mixin(ControlsScreen.class)
|
||||||
@SuppressWarnings("UnreachableCode")
|
|
||||||
public abstract class HookControlsScreen extends OptionsSubScreen {
|
public abstract class HookControlsScreen extends OptionsSubScreen {
|
||||||
public HookControlsScreen(final Screen parentScreen, final Options options, final Component title) {
|
public HookControlsScreen(final Screen parentScreen, final Options options, final Component title) {
|
||||||
super(parentScreen, options, title);
|
super(parentScreen, options, title);
|
||||||
@ -28,13 +27,48 @@ public abstract class HookControlsScreen extends OptionsSubScreen {
|
|||||||
public void afterInit(final CallbackInfo ci) {
|
public void afterInit(final CallbackInfo ci) {
|
||||||
@SuppressWarnings("ConstantConditions")
|
@SuppressWarnings("ConstantConditions")
|
||||||
final ControlsScreen screen = (ControlsScreen)(Object)this;
|
final ControlsScreen screen = (ControlsScreen)(Object)this;
|
||||||
|
final int center = width / 2;
|
||||||
|
|
||||||
|
int leftBottomY = 0;
|
||||||
|
int rightBottomY = 0;
|
||||||
|
AbstractWidget doneButton = null;
|
||||||
|
|
||||||
for (final GuiEventListener child : children()) {
|
for (final GuiEventListener child : children()) {
|
||||||
if (child instanceof final OptionsList optionsList) {
|
if (!(child instanceof final AbstractWidget widget)) {
|
||||||
final MutableComponent buttonTitle = BetterControlsScreen.TITLE.plainCopy().append("...");
|
continue;
|
||||||
optionsList.addSmall(List.of(Button.builder(buttonTitle, btn -> showOptionsScreen(screen)).build()));
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (widget instanceof final Button button && button.getMessage() == CommonComponents.GUI_DONE) {
|
||||||
|
doneButton = widget;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
final int bottomY = widget.getY() + widget.getHeight();
|
||||||
|
|
||||||
|
if (widget.getX() + widget.getWidth() < center) {
|
||||||
|
leftBottomY = Math.max(leftBottomY, bottomY);
|
||||||
|
}
|
||||||
|
if (widget.getX() >= center) {
|
||||||
|
rightBottomY = Math.max(rightBottomY, bottomY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final int x, y;
|
||||||
|
|
||||||
|
if (leftBottomY <= rightBottomY) {
|
||||||
|
x = center - 155;
|
||||||
|
y = leftBottomY + 4;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
x = center + 5;
|
||||||
|
y = rightBottomY + 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
final MutableComponent buttonTitle = BetterControlsScreen.TITLE.plainCopy().append("...");
|
||||||
|
addRenderableWidget(Button.builder(buttonTitle, btn -> showOptionsScreen(screen)).pos(x, y).size(150, 20).build());
|
||||||
|
|
||||||
|
if (doneButton != null) {
|
||||||
|
doneButton.setY(y + 24);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,8 +13,8 @@ import org.spongepowered.asm.mixin.injection.Redirect;
|
|||||||
import org.spongepowered.asm.mixin.injection.Slice;
|
import org.spongepowered.asm.mixin.injection.Slice;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
|
@SuppressWarnings("SameReturnValue")
|
||||||
@Mixin(Player.class)
|
@Mixin(Player.class)
|
||||||
@SuppressWarnings({ "SameReturnValue", "UnreachableCode" })
|
|
||||||
public abstract class HookPlayerHorizontalFlightSpeed extends LivingEntity {
|
public abstract class HookPlayerHorizontalFlightSpeed extends LivingEntity {
|
||||||
protected HookPlayerHorizontalFlightSpeed(final EntityType<? extends LivingEntity> type, final Level world) {
|
protected HookPlayerHorizontalFlightSpeed(final EntityType<? extends LivingEntity> type, final Level world) {
|
||||||
super(type, world);
|
super(type, world);
|
||||||
|
@ -10,7 +10,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
|||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
@Mixin(OptionInstance.class)
|
@Mixin(OptionInstance.class)
|
||||||
@SuppressWarnings("UnreachableCode")
|
|
||||||
public abstract class HookToggleOptionButtons {
|
public abstract class HookToggleOptionButtons {
|
||||||
@Inject(method = "createButton(Lnet/minecraft/client/Options;IIILjava/util/function/Consumer;)Lnet/minecraft/client/gui/components/AbstractWidget;", at = @At("RETURN"))
|
@Inject(method = "createButton(Lnet/minecraft/client/Options;IIILjava/util/function/Consumer;)Lnet/minecraft/client/gui/components/AbstractWidget;", at = @At("RETURN"))
|
||||||
private <T> void disableToggleOptions(final Options options, final int x, final int y, final int width, final Consumer<T> callback, final CallbackInfoReturnable<AbstractWidget> cir) {
|
private <T> void disableToggleOptions(final Options options, final int x, final int y, final int width, final Consumer<T> callback, final CallbackInfoReturnable<AbstractWidget> cir) {
|
||||||
|
Loading…
Reference in New Issue
Block a user