Enable gamepad navigation for the PrismaUI server browser and install MainMenu input hooks safely. Poll XInput each game-thread tick and forward button/stick changes to the browser (ForwardButtonEvent / ForwardThumbstickEvent), allocate an input-enable layer to suppress vanilla kMenu events while the browser is open, and register polling via the F4SE task interface. Replace direct vtable writes that caused a loading-screen crash with REL::Relocation::write_vfunc on the MainMenu BSInputEventUser secondary vtable and install OnButton/OnThumbstick hooks once at plugin Install(). Add MainMenu API to suppress inputEventHandling and call it when showing/hiding the browser. Also update PrismaUI browser JS to support controller focus for direct-connect, filter activation/cycling, improved controller prompts, and add CSS for focused direct-connect fields. Files touched include plugin/src/F4TMenuInput.cpp, plugin/src/F4TMainMenuInject.cpp, plugin/include headers, PrismaUI view JS/components, styles, and documentation.
63 lines
1.6 KiB
JavaScript
63 lines
1.6 KiB
JavaScript
(function () {
|
|
"use strict";
|
|
|
|
window.CO_ControllerPrompts = {
|
|
render: function (root, state) {
|
|
var el = root.querySelector(".co-prompts");
|
|
if (!el) return;
|
|
|
|
var prompts = CO_ControllerPrompts.getPrompts(state);
|
|
el.innerHTML = prompts.map(function (p) {
|
|
return (
|
|
'<div class="co-prompt">' +
|
|
'<span class="co-prompt-key">' + p.key + "</span>" +
|
|
"<span>" + p.label + "</span>" +
|
|
"</div>"
|
|
);
|
|
}).join("");
|
|
},
|
|
|
|
getPrompts: function (state) {
|
|
if (state.joinOverlay) {
|
|
if (state.joinOverlay.error) {
|
|
return [
|
|
{ key: "B", label: "Dismiss" },
|
|
{ key: "A", label: "Dismiss" }
|
|
];
|
|
}
|
|
return [];
|
|
}
|
|
|
|
if (state.activeTab === "direct-connect") {
|
|
return [
|
|
{ key: "A", label: "Connect" },
|
|
{ key: "B", label: "Back" }
|
|
];
|
|
}
|
|
|
|
if (state.focusZone === "filters") {
|
|
var isReset = state.selectedFilterIndex === CO_Filters.FILTER_ROWS.length;
|
|
return [
|
|
{ key: "A", label: isReset ? "Reset" : "Change" },
|
|
{ key: "B", label: "Back" }
|
|
];
|
|
}
|
|
|
|
if (state.focusZone === "tabs") {
|
|
return [
|
|
{ key: "LB", label: "Prev Tab" },
|
|
{ key: "RB", label: "Next Tab" },
|
|
{ key: "B", label: "Back" }
|
|
];
|
|
}
|
|
|
|
return [
|
|
{ key: "A", label: "Join" },
|
|
{ key: "X", label: "Refresh" },
|
|
{ key: "Y", label: "Favorite" },
|
|
{ key: "B", label: "Back" }
|
|
];
|
|
}
|
|
};
|
|
})();
|