forked from Clones/Controlify
➕ TitleScreen and OptionsScreen guides
This commit is contained in:
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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));
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -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
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -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",
|
||||||
|
Reference in New Issue
Block a user