1
0
forked from Clones/Controlify

TitleScreen and OptionsScreen guides

This commit is contained in:
isXander
2023-05-14 22:51:25 +01:00
parent 8dd2cd181e
commit c552667985
6 changed files with 164 additions and 0 deletions

View File

@ -0,0 +1,24 @@
package dev.isxander.controlify.mixins.feature.screenop.vanilla;
import dev.isxander.controlify.screenop.ScreenProcessor;
import dev.isxander.controlify.screenop.ScreenProcessorProvider;
import dev.isxander.controlify.screenop.compat.vanilla.PauseScreenProcessor;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.screens.PauseScreen;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
@Mixin(PauseScreen.class)
public class PauseScreenMixin implements ScreenProcessorProvider {
@Shadow private @Nullable Button disconnectButton;
@Unique private final PauseScreenProcessor processor
= new PauseScreenProcessor((PauseScreen) (Object) this, () -> disconnectButton);
@Override
public ScreenProcessor<?> screenProcessor() {
return processor;
}
}

View File

@ -0,0 +1,19 @@
package dev.isxander.controlify.mixins.feature.screenop.vanilla;
import dev.isxander.controlify.screenop.ScreenProcessor;
import dev.isxander.controlify.screenop.ScreenProcessorProvider;
import dev.isxander.controlify.screenop.compat.vanilla.TitleScreenProcessor;
import net.minecraft.client.gui.screens.TitleScreen;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
@Mixin(TitleScreen.class)
public class TitleScreenMixin implements ScreenProcessorProvider {
@Unique private final ScreenProcessor<?> processor
= new TitleScreenProcessor((TitleScreen) (Object) this);
@Override
public ScreenProcessor<?> screenProcessor() {
return processor;
}
}

View File

@ -13,6 +13,7 @@ import dev.isxander.controlify.virtualmouse.VirtualMouseBehaviour;
import dev.isxander.controlify.virtualmouse.VirtualMouseHandler; import dev.isxander.controlify.virtualmouse.VirtualMouseHandler;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.ComponentPath; import net.minecraft.client.gui.ComponentPath;
import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.gui.components.tabs.Tab; import net.minecraft.client.gui.components.tabs.Tab;
import net.minecraft.client.gui.components.tabs.TabNavigationBar; import net.minecraft.client.gui.components.tabs.TabNavigationBar;
@ -20,6 +21,7 @@ import net.minecraft.client.gui.navigation.FocusNavigationEvent;
import net.minecraft.client.gui.navigation.ScreenDirection; import net.minecraft.client.gui.navigation.ScreenDirection;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.client.resources.sounds.SimpleSoundInstance;
import net.minecraft.network.chat.Component;
import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundEvents;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
@ -223,6 +225,16 @@ public class ScreenProcessor<T extends Screen> {
return tree; return tree;
} }
protected final Optional<AbstractWidget> getWidget(String translationKey) {
var translatedName = Component.translatable(translationKey).getString();
return screen.children().stream()
.filter(child -> child instanceof AbstractWidget)
.map(AbstractWidget.class::cast)
.filter(widget -> widget.getMessage().getString().equals(translatedName))
.findAny();
}
public static void playClackSound() { public static void playClackSound() {
minecraft.getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)); minecraft.getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F));
} }

View File

@ -0,0 +1,58 @@
package dev.isxander.controlify.screenop.compat.vanilla;
import dev.isxander.controlify.api.buttonguide.ButtonGuideApi;
import dev.isxander.controlify.api.buttonguide.ButtonGuidePredicate;
import dev.isxander.controlify.api.buttonguide.ButtonRenderPosition;
import dev.isxander.controlify.controller.Controller;
import dev.isxander.controlify.screenop.ScreenProcessor;
import net.minecraft.client.gui.components.AbstractButton;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.screens.OptionsScreen;
import net.minecraft.client.gui.screens.PauseScreen;
import java.util.function.Supplier;
public class PauseScreenProcessor extends ScreenProcessor<PauseScreen> {
private final Supplier<Button> disconnectButtonSupplier;
public PauseScreenProcessor(PauseScreen screen, Supplier<Button> disconnectButtonSupplier) {
super(screen);
this.disconnectButtonSupplier = disconnectButtonSupplier;
}
@Override
protected void handleButtons(Controller<?, ?> controller) {
super.handleButtons(controller);
if (controller.bindings().GUI_ABSTRACT_ACTION_1.justPressed()) {
minecraft.setScreen(new OptionsScreen(screen, minecraft.options));
}
if (controller.bindings().GUI_ABSTRACT_ACTION_2.justPressed()) {
disconnectButtonSupplier.get().onPress();
}
}
@Override
public void onWidgetRebuild() {
super.onWidgetRebuild();
ButtonGuideApi.addGuideToButton(
(AbstractButton) getWidget("menu.returnToGame").orElseThrow(),
bindings -> bindings.GUI_BACK,
ButtonRenderPosition.TEXT,
ButtonGuidePredicate.ALWAYS
);
ButtonGuideApi.addGuideToButton(
(AbstractButton) getWidget("menu.options").orElseThrow(),
bindings -> bindings.GUI_ABSTRACT_ACTION_1,
ButtonRenderPosition.TEXT,
ButtonGuidePredicate.ALWAYS
);
ButtonGuideApi.addGuideToButton(
disconnectButtonSupplier.get(),
bindings -> bindings.GUI_ABSTRACT_ACTION_2,
ButtonRenderPosition.TEXT,
ButtonGuidePredicate.ALWAYS
);
}
}

View File

@ -0,0 +1,49 @@
package dev.isxander.controlify.screenop.compat.vanilla;
import dev.isxander.controlify.api.buttonguide.ButtonGuideApi;
import dev.isxander.controlify.api.buttonguide.ButtonGuidePredicate;
import dev.isxander.controlify.api.buttonguide.ButtonRenderPosition;
import dev.isxander.controlify.controller.Controller;
import dev.isxander.controlify.screenop.ScreenProcessor;
import net.minecraft.client.gui.components.AbstractButton;
import net.minecraft.client.gui.screens.OptionsScreen;
import net.minecraft.client.gui.screens.TitleScreen;
public class TitleScreenProcessor extends ScreenProcessor<TitleScreen> {
public TitleScreenProcessor(TitleScreen screen) {
super(screen);
}
@Override
protected void handleButtons(Controller<?, ?> controller) {
if (controller.bindings().GUI_BACK.justPressed()) {
screen.setFocused(getWidget("menu.quit").orElseThrow());
playClackSound();
}
super.handleButtons(controller);
if (controller.bindings().GUI_ABSTRACT_ACTION_1.justPressed()) {
minecraft.setScreen(new OptionsScreen(screen, minecraft.options));
playClackSound();
}
}
@Override
public void onWidgetRebuild() {
super.onWidgetRebuild();
ButtonGuideApi.addGuideToButton(
(AbstractButton) getWidget("menu.quit").orElseThrow(),
bindings -> bindings.GUI_BACK,
ButtonRenderPosition.TEXT,
ButtonGuidePredicate.ALWAYS
);
ButtonGuideApi.addGuideToButton(
(AbstractButton) getWidget("menu.options").orElseThrow(),
bindings -> bindings.GUI_ABSTRACT_ACTION_1,
ButtonRenderPosition.TEXT,
ButtonGuidePredicate.ALWAYS
);
}
}

View File

@ -66,10 +66,12 @@
"feature.screenop.vanilla.JoinMultiplayerScreenMixin", "feature.screenop.vanilla.JoinMultiplayerScreenMixin",
"feature.screenop.vanilla.LanguageSelectionListEntryMixin", "feature.screenop.vanilla.LanguageSelectionListEntryMixin",
"feature.screenop.vanilla.OptionsSubScreenAccessor", "feature.screenop.vanilla.OptionsSubScreenAccessor",
"feature.screenop.vanilla.PauseScreenMixin",
"feature.screenop.vanilla.SelectWorldScreenAccessor", "feature.screenop.vanilla.SelectWorldScreenAccessor",
"feature.screenop.vanilla.SelectWorldScreenMixin", "feature.screenop.vanilla.SelectWorldScreenMixin",
"feature.screenop.vanilla.ServerSelectionListEntryMixin", "feature.screenop.vanilla.ServerSelectionListEntryMixin",
"feature.screenop.vanilla.TabNavigationBarAccessor", "feature.screenop.vanilla.TabNavigationBarAccessor",
"feature.screenop.vanilla.TitleScreenMixin",
"feature.screenop.vanilla.WorldSelectionListEntryMixin", "feature.screenop.vanilla.WorldSelectionListEntryMixin",
"feature.settingsbutton.ControlsScreenMixin", "feature.settingsbutton.ControlsScreenMixin",
"feature.virtualmouse.GameRendererMixin", "feature.virtualmouse.GameRendererMixin",