forked from Clones/Controlify
🤝 Simple voice chat compatibility (fix PTT & whisper not working)
This commit is contained in:
@ -3,6 +3,7 @@ package dev.isxander.controlify;
|
||||
import com.mojang.blaze3d.Blaze3D;
|
||||
import dev.isxander.controlify.api.ControlifyApi;
|
||||
import dev.isxander.controlify.api.entrypoint.ControlifyEntrypoint;
|
||||
import dev.isxander.controlify.compatibility.ControlifyCompat;
|
||||
import dev.isxander.controlify.gui.controllers.ControllerBindHandler;
|
||||
import dev.isxander.controlify.gui.screen.ControllerCarouselScreen;
|
||||
import dev.isxander.controlify.controller.Controller;
|
||||
@ -264,6 +265,7 @@ public class Controlify implements ControlifyApi {
|
||||
ReachAroundHandler.reachAroundPolicy = ReachAroundPolicy.UNSET;
|
||||
});
|
||||
|
||||
ControlifyCompat.init();
|
||||
FabricLoader.getInstance().getEntrypoints("controlify", ControlifyEntrypoint.class).forEach(entrypoint -> {
|
||||
try {
|
||||
entrypoint.onControlifyPreInit(this);
|
||||
|
@ -1,24 +1,39 @@
|
||||
package dev.isxander.controlify.compatibility;
|
||||
|
||||
import dev.isxander.controlify.compatibility.immediatelyfast.ImmediatelyFastCompat;
|
||||
import dev.isxander.controlify.compatibility.simplevoicechat.SimpleVoiceChatCompat;
|
||||
import dev.isxander.controlify.utils.Log;
|
||||
import net.fabricmc.loader.api.FabricLoader;
|
||||
import net.minecraft.Util;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
public class ControlifyCompat {
|
||||
public static final boolean IMMEDIATELY_FAST = mod("immediatelyfast");
|
||||
private static final Function<String, Boolean> modsLoaded = Util.memoize(modid ->
|
||||
FabricLoader.getInstance().isModLoaded(modid));
|
||||
|
||||
public static final String IMMEDIATELY_FAST = "immediatelyfast";
|
||||
public static final String SIMPLE_VOICE_CHAT = "voicechat";
|
||||
|
||||
public static void init() {
|
||||
wrapCompatCall(SIMPLE_VOICE_CHAT, SimpleVoiceChatCompat::init);
|
||||
}
|
||||
|
||||
public static void ifBeginHudBatching() {
|
||||
if (IMMEDIATELY_FAST) {
|
||||
ImmediatelyFastCompat.beginHudBatching();
|
||||
}
|
||||
wrapCompatCall(IMMEDIATELY_FAST, ImmediatelyFastCompat::beginHudBatching);
|
||||
}
|
||||
|
||||
public static void ifEndHudBatching() {
|
||||
if (IMMEDIATELY_FAST) {
|
||||
ImmediatelyFastCompat.endHudBatching();
|
||||
}
|
||||
wrapCompatCall(IMMEDIATELY_FAST, ImmediatelyFastCompat::endHudBatching);
|
||||
}
|
||||
|
||||
private static boolean mod(String id) {
|
||||
return FabricLoader.getInstance().isModLoaded(id);
|
||||
private static void wrapCompatCall(String modid, Runnable runnable) {
|
||||
if (modsLoaded.apply(modid)) {
|
||||
try {
|
||||
runnable.run();
|
||||
} catch (Throwable t) {
|
||||
Log.LOGGER.error("Failed to run compatibility code for %s, potentially unsupported version?".formatted(modid), t);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,84 @@
|
||||
package dev.isxander.controlify.compatibility.simplevoicechat;
|
||||
|
||||
import de.maxhenkel.voicechat.voice.client.ClientManager;
|
||||
import de.maxhenkel.voicechat.voice.client.KeyEvents;
|
||||
import dev.isxander.controlify.api.bind.BindingSupplier;
|
||||
import dev.isxander.controlify.api.bind.ControlifyBindingsApi;
|
||||
import dev.isxander.controlify.api.event.ControlifyEvents;
|
||||
import dev.isxander.controlify.bindings.EmptyBind;
|
||||
import dev.isxander.controlify.mixins.compat.simplevoicechat.KeyEventsAccessor;
|
||||
import net.minecraft.network.chat.CommonComponents;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
|
||||
public class SimpleVoiceChatCompat {
|
||||
private static BindingSupplier pttHoldSupplier, pttToggleSupplier;
|
||||
private static BindingSupplier whisperHoldSupplier, whisperToggleSupplier;
|
||||
|
||||
private static boolean pttDown, whisperDown;
|
||||
|
||||
public static void init() {
|
||||
ControlifyBindingsApi.get().excludeVanillaBind(KeyEvents.KEY_PTT);
|
||||
ControlifyBindingsApi.get().excludeVanillaBind(KeyEvents.KEY_WHISPER);
|
||||
|
||||
Component category = Component.translatable("key.categories.voicechat");
|
||||
pttHoldSupplier = ControlifyBindingsApi.get().registerBind(new ResourceLocation("voicechat", "ptt_hold"), builder -> builder
|
||||
.name(Component.translatable("key.push_to_talk").append(CommonComponents.SPACE).append(Component.translatable("controlify.compat.svc.hold")))
|
||||
.category(category)
|
||||
.defaultBind(new EmptyBind<>()));
|
||||
pttToggleSupplier = ControlifyBindingsApi.get().registerBind(new ResourceLocation("voicechat", "ptt_toggle"), builder -> builder
|
||||
.name(Component.translatable("key.push_to_talk").append(CommonComponents.SPACE).append(Component.translatable("controlify.compat.svc.toggle")))
|
||||
.category(category)
|
||||
.defaultBind(new EmptyBind<>()));
|
||||
whisperHoldSupplier = ControlifyBindingsApi.get().registerBind(new ResourceLocation("voicechat", "whisper_hold"), builder -> builder
|
||||
.name(Component.translatable("key.whisper").append(CommonComponents.SPACE).append(Component.translatable("controlify.compat.svc.hold")))
|
||||
.category(category)
|
||||
.defaultBind(new EmptyBind<>()));
|
||||
whisperToggleSupplier = ControlifyBindingsApi.get().registerBind(new ResourceLocation("voicechat", "whisper_toggle"), builder -> builder
|
||||
.name(Component.translatable("key.whisper").append(CommonComponents.SPACE).append(Component.translatable("controlify.compat.svc.toggle")))
|
||||
.category(category)
|
||||
.defaultBind(new EmptyBind<>()));
|
||||
|
||||
ControlifyEvents.ACTIVE_CONTROLLER_TICKED.register(controller -> {
|
||||
var pttHold = pttHoldSupplier.onController(controller);
|
||||
var pttToggle = pttToggleSupplier.onController(controller);
|
||||
var whisperHold = whisperHoldSupplier.onController(controller);
|
||||
var whisperToggle = whisperToggleSupplier.onController(controller);
|
||||
|
||||
if (pttToggle.justPressed()) {
|
||||
pttDown = !pttDown;
|
||||
checkConnected();
|
||||
}
|
||||
if (whisperToggle.justPressed()) {
|
||||
whisperDown = !whisperDown;
|
||||
checkConnected();
|
||||
}
|
||||
|
||||
if (pttHold.justPressed() || whisperHold.justPressed()) {
|
||||
checkConnected();
|
||||
}
|
||||
if (pttHold.held()) {
|
||||
pttDown = true;
|
||||
} else if (pttHold.justReleased()) {
|
||||
pttDown = false;
|
||||
}
|
||||
if (whisperHold.held()) {
|
||||
whisperDown = true;
|
||||
} else if (whisperHold.justReleased()) {
|
||||
whisperDown = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static boolean isPTTDown() {
|
||||
return pttDown;
|
||||
}
|
||||
|
||||
public static boolean isWhisperDown() {
|
||||
return whisperDown;
|
||||
}
|
||||
|
||||
private static void checkConnected() {
|
||||
((KeyEventsAccessor) ClientManager.instance().getKeyEvents()).invokeCheckConnected();
|
||||
}
|
||||
}
|
@ -21,14 +21,4 @@ public class YACLScreenProcessor extends ScreenProcessor<YACLScreen> {
|
||||
|
||||
super.handleButtons(controller);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onWidgetRebuild() {
|
||||
//ButtonGuideApi.addGuideToButton(screen.finishedSaveButton, bindings -> bindings.GUI_ABSTRACT_ACTION_1, ButtonRenderPosition.TEXT, ButtonGuidePredicate.ALWAYS);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setInitialFocus() {
|
||||
// screen.setFocused(screen.optionList);
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,13 @@
|
||||
package dev.isxander.controlify.mixins.compat.simplevoicechat;
|
||||
|
||||
import de.maxhenkel.voicechat.voice.client.KeyEvents;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Pseudo;
|
||||
import org.spongepowered.asm.mixin.gen.Invoker;
|
||||
|
||||
@Pseudo
|
||||
@Mixin(value = KeyEvents.class, remap = false)
|
||||
public interface KeyEventsAccessor {
|
||||
@Invoker
|
||||
boolean invokeCheckConnected();
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
package dev.isxander.controlify.mixins.compat.simplevoicechat;
|
||||
|
||||
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
|
||||
import de.maxhenkel.voicechat.voice.client.PTTKeyHandler;
|
||||
import dev.isxander.controlify.compatibility.simplevoicechat.SimpleVoiceChatCompat;
|
||||
import org.objectweb.asm.Opcodes;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Pseudo;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
|
||||
@Pseudo
|
||||
@Mixin(value = PTTKeyHandler.class, remap = false)
|
||||
public class PTTKeyHandlerMixin {
|
||||
@ModifyExpressionValue(
|
||||
method = {
|
||||
"isPTTDown()Z",
|
||||
"isAnyDown()Z",
|
||||
},
|
||||
at = @At(
|
||||
value = "FIELD",
|
||||
target = "Lde/maxhenkel/voicechat/voice/client/PTTKeyHandler;pttKeyDown:Z",
|
||||
opcode = Opcodes.GETFIELD
|
||||
)
|
||||
)
|
||||
private boolean isControllerPTTDown(boolean keyDown) {
|
||||
return keyDown || SimpleVoiceChatCompat.isPTTDown();
|
||||
}
|
||||
|
||||
@ModifyExpressionValue(
|
||||
method = {
|
||||
"isWhisperDown()Z",
|
||||
"isAnyDown()Z",
|
||||
},
|
||||
at = @At(
|
||||
value = "FIELD",
|
||||
target = "Lde/maxhenkel/voicechat/voice/client/PTTKeyHandler;whisperKeyDown:Z",
|
||||
opcode = Opcodes.GETFIELD
|
||||
)
|
||||
)
|
||||
private boolean isControllerWhisperDown(boolean keyDown) {
|
||||
return keyDown || SimpleVoiceChatCompat.isWhisperDown();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user