mirror of
https://github.com/redphx/better-xcloud.git
synced 2025-06-07 08:07:18 +02:00
Add back the ability to use native MKB feature on unofficial titles
This commit is contained in:
parent
850afb4ca7
commit
2e0a59cbe1
39
scripts/custom-flags.user.js
Normal file
39
scripts/custom-flags.user.js
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
// ==UserScript==
|
||||||
|
// @name Better xCloud - Custom flags
|
||||||
|
// @namespace https://github.com/redphx
|
||||||
|
// @version 1.0.0
|
||||||
|
// @description Customize Better xCloud script
|
||||||
|
// @author redphx
|
||||||
|
// @license MIT
|
||||||
|
// @match https://www.xbox.com/*/play*
|
||||||
|
// @run-at document-start
|
||||||
|
// @grant none
|
||||||
|
// ==/UserScript==
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/*
|
||||||
|
Make sure this script is being loaded before the Better xCloud script.
|
||||||
|
|
||||||
|
How to:
|
||||||
|
1. Uninstall Better xCloud script.
|
||||||
|
2. Install this script.
|
||||||
|
3. Reinstall Better xCloud script. All your settings are still there.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Change this to `false` if you want to temporary disable the script
|
||||||
|
const enabled = true;
|
||||||
|
|
||||||
|
enabled && (window.BX_FLAGS = {
|
||||||
|
/*
|
||||||
|
Add titleId of the game(s) you want to add here
|
||||||
|
For example:
|
||||||
|
- Flight Simulator has this link: /play/games/microsoft-flight-simulator-standard-40th-anniversa/9PMQDM08SNK9
|
||||||
|
- That means its titleId is "9PMQDM08SNK9"
|
||||||
|
- So it becomes:
|
||||||
|
ForceNativeMkbTitles: [
|
||||||
|
"9PMQDM08SNK9",
|
||||||
|
],
|
||||||
|
*/
|
||||||
|
ForceNativeMkbTitles: [
|
||||||
|
],
|
||||||
|
});
|
@ -4,6 +4,7 @@ import { STATES } from "@utils/global";
|
|||||||
import { getPref, PrefKey } from "@utils/preferences";
|
import { getPref, PrefKey } from "@utils/preferences";
|
||||||
import { UserAgent } from "@utils/user-agent";
|
import { UserAgent } from "@utils/user-agent";
|
||||||
import { BxLogger } from "./bx-logger";
|
import { BxLogger } from "./bx-logger";
|
||||||
|
import { BX_FLAGS } from "./bx-flags";
|
||||||
|
|
||||||
export enum InputType {
|
export enum InputType {
|
||||||
CONTROLLER = 'Controller',
|
CONTROLLER = 'Controller',
|
||||||
@ -26,6 +27,8 @@ export const BxExposed = {
|
|||||||
// Remove native MKB support on mobile browsers or by user's choice
|
// Remove native MKB support on mobile browsers or by user's choice
|
||||||
if (getPref(PrefKey.NATIVE_MKB_DISABLED) || UserAgent.isMobile()) {
|
if (getPref(PrefKey.NATIVE_MKB_DISABLED) || UserAgent.isMobile()) {
|
||||||
supportedInputTypes = supportedInputTypes.filter(i => i !== InputType.MKB);
|
supportedInputTypes = supportedInputTypes.filter(i => i !== InputType.MKB);
|
||||||
|
} else if (BX_FLAGS.ForceNativeMkbTitles.includes(titleInfo.details.productId)) {
|
||||||
|
supportedInputTypes.push(InputType.MKB);
|
||||||
}
|
}
|
||||||
|
|
||||||
titleInfo.details.hasMkbSupport = supportedInputTypes.includes(InputType.MKB);
|
titleInfo.details.hasMkbSupport = supportedInputTypes.includes(InputType.MKB);
|
||||||
|
@ -1,12 +1,14 @@
|
|||||||
type BxFlags = {
|
type BxFlags = Partial<{
|
||||||
CheckForUpdate?: boolean;
|
CheckForUpdate: boolean;
|
||||||
PreloadRemotePlay?: boolean;
|
PreloadRemotePlay: boolean;
|
||||||
PreloadUi?: boolean;
|
PreloadUi: boolean;
|
||||||
EnableXcloudLogging?: boolean;
|
EnableXcloudLogging: boolean;
|
||||||
SafariWorkaround?: boolean;
|
SafariWorkaround: boolean;
|
||||||
|
|
||||||
UseDevTouchLayout?: boolean;
|
UseDevTouchLayout: boolean;
|
||||||
}
|
|
||||||
|
ForceNativeMkbTitles: string[];
|
||||||
|
}>
|
||||||
|
|
||||||
// Setup flags
|
// Setup flags
|
||||||
const DEFAULT_FLAGS: BxFlags = {
|
const DEFAULT_FLAGS: BxFlags = {
|
||||||
@ -17,6 +19,8 @@ const DEFAULT_FLAGS: BxFlags = {
|
|||||||
SafariWorkaround: true,
|
SafariWorkaround: true,
|
||||||
|
|
||||||
UseDevTouchLayout: false,
|
UseDevTouchLayout: false,
|
||||||
|
|
||||||
|
ForceNativeMkbTitles: [],
|
||||||
}
|
}
|
||||||
|
|
||||||
export const BX_FLAGS = Object.assign(DEFAULT_FLAGS, window.BX_FLAGS || {});
|
export const BX_FLAGS = Object.assign(DEFAULT_FLAGS, window.BX_FLAGS || {});
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
export enum GamePassCloudGallery {
|
export enum GamePassCloudGallery {
|
||||||
TOUCH = '9c86f07a-f3e8-45ad-82a0-a1f759597059',
|
|
||||||
ALL = '29a81209-df6f-41fd-a528-2ae6b91f719c',
|
ALL = '29a81209-df6f-41fd-a528-2ae6b91f719c',
|
||||||
|
NATIVE_MKB = '8fa264dd-124f-4af3-97e8-596fcdf4b486',
|
||||||
|
TOUCH = '9c86f07a-f3e8-45ad-82a0-a1f759597059',
|
||||||
}
|
}
|
||||||
|
@ -439,11 +439,19 @@ class XcloudInterceptor {
|
|||||||
overrides.inputConfiguration = overrides.inputConfiguration || {};
|
overrides.inputConfiguration = overrides.inputConfiguration || {};
|
||||||
overrides.inputConfiguration.enableVibration = true;
|
overrides.inputConfiguration.enableVibration = true;
|
||||||
|
|
||||||
|
let overrideMkb: boolean | null = null;
|
||||||
|
|
||||||
if (getPref(PrefKey.NATIVE_MKB_DISABLED) || UserAgent.isMobile()) {
|
if (getPref(PrefKey.NATIVE_MKB_DISABLED) || UserAgent.isMobile()) {
|
||||||
|
overrideMkb = false;
|
||||||
|
} else if (BX_FLAGS.ForceNativeMkbTitles.includes(STATES.currentStream.titleInfo!.details.productId)) {
|
||||||
|
overrideMkb = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (overrideMkb !== null) {
|
||||||
overrides.inputConfiguration = Object.assign(overrides.inputConfiguration, {
|
overrides.inputConfiguration = Object.assign(overrides.inputConfiguration, {
|
||||||
enableMouseInput: false,
|
enableMouseInput: overrideMkb,
|
||||||
enableAbsoluteMouse: false,
|
enableAbsoluteMouse: overrideMkb,
|
||||||
enableKeyboardInput: false,
|
enableKeyboardInput: overrideMkb,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -614,6 +622,21 @@ export function interceptHttpRequests() {
|
|||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (BX_FLAGS.ForceNativeMkbTitles && url.includes('catalog.gamepass.com/sigls/') && url.includes(GamePassCloudGallery.NATIVE_MKB)) {
|
||||||
|
const response = await NATIVE_FETCH(request, init);
|
||||||
|
const obj = await response.clone().json();
|
||||||
|
|
||||||
|
try {
|
||||||
|
const newCustomList = BX_FLAGS.ForceNativeMkbTitles.map((item: string) => ({ id: item }));
|
||||||
|
obj.push(...newCustomList);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
response.json = () => Promise.resolve(obj);
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
let requestType: RequestType;
|
let requestType: RequestType;
|
||||||
if (url.includes('/sessions/home') || url.includes('xhome.') || (STATES.remotePlay.isPlaying && url.endsWith('/inputconfigs'))) {
|
if (url.includes('/sessions/home') || url.includes('xhome.') || (STATES.remotePlay.isPlaying && url.endsWith('/inputconfigs'))) {
|
||||||
requestType = RequestType.XHOME;
|
requestType = RequestType.XHOME;
|
||||||
|
@ -3,6 +3,7 @@ import { BxLogger } from "./bx-logger";
|
|||||||
import { TouchController } from "@modules/touch-controller";
|
import { TouchController } from "@modules/touch-controller";
|
||||||
import { GamePassCloudGallery } from "./gamepass-gallery";
|
import { GamePassCloudGallery } from "./gamepass-gallery";
|
||||||
import { getPref, PrefKey } from "./preferences";
|
import { getPref, PrefKey } from "./preferences";
|
||||||
|
import { BX_FLAGS } from "./bx-flags";
|
||||||
|
|
||||||
const LOG_TAG = 'PreloadState';
|
const LOG_TAG = 'PreloadState';
|
||||||
|
|
||||||
@ -37,6 +38,12 @@ export function overridePreloadState() {
|
|||||||
// Add to the official list
|
// Add to the official list
|
||||||
sigls[GamePassCloudGallery.TOUCH]?.data.products.push(...customList);
|
sigls[GamePassCloudGallery.TOUCH]?.data.products.push(...customList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (BX_FLAGS.ForceNativeMkbTitles && GamePassCloudGallery.NATIVE_MKB in sigls) {
|
||||||
|
// Add to the official list
|
||||||
|
sigls[GamePassCloudGallery.NATIVE_MKB]?.data.products.push(...BX_FLAGS.ForceNativeMkbTitles);
|
||||||
|
}
|
||||||
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
BxLogger.error(LOG_TAG, e);
|
BxLogger.error(LOG_TAG, e);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user