1
0
mirror of https://github.com/chylex/Better-Controls.git synced 2024-11-25 01:42:45 +01:00

Compare commits

..

2 Commits

Author SHA1 Message Date
ead8c84549
Release v1.3.1 for Minecraft 1.20.5+ 2024-05-08 07:47:58 +02:00
2850f523a2
Update for Minecraft 1.20.5 2024-05-08 05:12:32 +02:00
9 changed files with 26 additions and 68 deletions

View File

@ -3,22 +3,18 @@ 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.ConfigScreenHandler.ConfigScreenFactory; import net.neoforged.neoforge.client.gui.IConfigScreenFactory;
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(ConfigScreenFactory.class, () -> new ConfigScreenFactory(BetterControlsScreen::new)); ModLoadingContext.get().registerExtensionPoint(IConfigScreenFactory.class, () -> BetterControlsScreen::new);
} }
ModLoadingContext.get().registerExtensionPoint(DisplayTest.class, () -> new DisplayTest(() -> NetworkConstants.IGNORESERVERONLY, (a, b) -> true));
} }
} }

View File

@ -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.0b modVersion=1.3.1
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

View File

@ -14,15 +14,11 @@ 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;
@ -216,6 +212,8 @@ 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<>();
@ -233,10 +231,16 @@ 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;
//noinspection DataFlowIssue optionsWidget = addRenderableWidget(new OptionListWidget(width, layout.getContentHeight(), layout.getHeaderHeight(), y - TITLE_MARGIN_TOP + BOTTOM_PADDING, elements));
addRenderableWidget(Button.builder(CommonComponents.GUI_DONE, btn -> minecraft.setScreen(lastScreen)).pos(width / 2 - 99, height - 25).size(200, 20).build()); }
addRenderableWidget(optionsWidget = new OptionListWidget(width, height - 50, 21, y - TITLE_MARGIN_TOP + BOTTOM_PADDING, elements)); @Override
protected void repositionElements() {
super.repositionElements();
if (optionsWidget != null) {
optionsWidget.updateSize(width, layout);
}
} }
@Override @Override
@ -244,17 +248,6 @@ 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();

View File

@ -12,6 +12,7 @@ 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) {

View File

@ -12,6 +12,7 @@ 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);

View File

@ -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);

View File

@ -3,21 +3,22 @@ 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);
@ -27,48 +28,13 @@ 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 AbstractWidget widget)) { if (child instanceof final OptionsList optionsList) {
continue;
}
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("..."); final MutableComponent buttonTitle = BetterControlsScreen.TITLE.plainCopy().append("...");
addRenderableWidget(Button.builder(buttonTitle, btn -> showOptionsScreen(screen)).pos(x, y).size(150, 20).build()); optionsList.addSmall(List.of(Button.builder(buttonTitle, btn -> showOptionsScreen(screen)).build()));
break;
if (doneButton != null) { }
doneButton.setY(y + 24);
} }
} }

View File

@ -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);

View File

@ -10,6 +10,7 @@ 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) {