Update better-xcloud.user.js

This commit is contained in:
redphx 2024-09-20 17:25:12 +07:00
parent 12ad81e9c7
commit 92e6828cb2

View File

@ -438,25 +438,25 @@ var SUPPORTED_LANGUAGES = {
"native-mkb": "Native Mouse & Keyboard", "native-mkb": "Native Mouse & Keyboard",
new: "New", new: "New",
"new-version-available": [ "new-version-available": [
(e) => `Version ${e.version} available`, e => `Version ${e.version} available`,
,
,
e => `Version ${e.version} verfügbar`,
,
e => `Versión ${e.version} disponible`,
e => `Version ${e.version} disponible`,
e => `Disponibile la versione ${e.version}`,
e => `Ver ${e.version} が利用可能です`,
e => `${e.version} 버전 사용가능`,
e => `Dostępna jest nowa wersja ${e.version}`,
e => `Versão ${e.version} disponível`,
, ,
, ,
, ,
, e => `Доступна версія ${e.version}`,
, e => `Đã có phiên bản ${e.version}`,
, e => `版本 ${e.version} 可供更新`,
, e => `已可更新為 ${e.version}`
(e) => `Ver ${e.version} が利用可能です`,
(e) => `${e.version} 버전 사용가능`,
,
,
,
,
,
,
(e) => `Đã có phiên bản ${e.version}`,
,
,
], ],
"no-consoles-found": "No consoles found", "no-consoles-found": "No consoles found",
normal: "Normal", normal: "Normal",
@ -475,49 +475,49 @@ var SUPPORTED_LANGUAGES = {
preset: "Preset", preset: "Preset",
"press-esc-to-cancel": "Press Esc to cancel", "press-esc-to-cancel": "Press Esc to cancel",
"press-key-to-toggle-mkb": [ "press-key-to-toggle-mkb": [
(e) => `Press ${e.key} to toggle this feature`, e => `Press ${e.key} to toggle this feature`,
(e) => `Premeu ${e.key} per alternar aquesta funció`, e => `Premeu ${e.key} per alternar aquesta funció`,
(e) => `Tryk på ${e.key} for at slå denne funktion til`, e => `Tryk på ${e.key} for at slå denne funktion til`,
(e) => `${e.key}: Funktion an-/ausschalten`, e => `${e.key}: Funktion an-/ausschalten`,
(e) => `Tekan ${e.key} untuk mengaktifkan fitur ini`, e => `Tekan ${e.key} untuk mengaktifkan fitur ini`,
(e) => `Pulsa ${e.key} para alternar esta función`, e => `Pulsa ${e.key} para alternar esta función`,
(e) => `Appuyez sur ${e.key} pour activer cette fonctionnalité`, e => `Appuyez sur ${e.key} pour activer cette fonctionnalité`,
(e) => `Premi ${e.key} per attivare questa funzionalità`, e => `Premi ${e.key} per attivare questa funzionalità`,
(e) => `${e.key} でこの機能を切替`, e => `${e.key} でこの機能を切替`,
(e) => `${e.key} 키를 눌러 이 기능을 켜고 끄세요`, e => `${e.key} 키를 눌러 이 기능을 켜고 끄세요`,
(e) => `Naciśnij ${e.key} aby przełączyć tę funkcję`, e => `Naciśnij ${e.key} aby przełączyć tę funkcję`,
(e) => `Pressione ${e.key} para alternar este recurso`, e => `Pressione ${e.key} para alternar este recurso`,
(e) => `Нажмите ${e.key} для переключения этой функции`, e => `Нажмите ${e.key} для переключения этой функции`,
(e) => `กด ${e.key} เพื่อสลับคุณสมบัตินี้`, e => `กด ${e.key} เพื่อสลับคุณสมบัตินี้`,
(e) => `Etkinleştirmek için ${e.key} tuşuna basın`, e => `Etkinleştirmek için ${e.key} tuşuna basın`,
(e) => `Натисніть ${e.key} щоб перемкнути цю функцію`, e => `Натисніть ${e.key} щоб перемкнути цю функцію`,
(e) => `Nhấn ${e.key} để bật/tắt tính năng này`, e => `Nhấn ${e.key} để bật/tắt tính năng này`,
(e) => `按下 ${e.key} 来切换此功能`, e => `按下 ${e.key} 来切换此功能`,
(e) => `按下 ${e.key} 來啟用此功能` e => `按下 ${e.key} 來啟用此功能`
], ],
"press-to-bind": "Press a key or do a mouse click to bind...", "press-to-bind": "Press a key or do a mouse click to bind...",
"prompt-preset-name": "Preset's name:", "prompt-preset-name": "Preset's name:",
recommended: "Recommended", recommended: "Recommended",
"recommended-settings-for-device": [ "recommended-settings-for-device": [
(e) => `Recommended settings for ${e.device}`, e => `Recommended settings for ${e.device}`,
(e) => `Configuració recomanada per a ${e.device}`, e => `Configuració recomanada per a ${e.device}`,
, ,
(e) => `Empfohlene Einstellungen für ${e.device}`, e => `Empfohlene Einstellungen für ${e.device}`,
, ,
(e) => `Ajustes recomendados para ${e.device}`, e => `Ajustes recomendados para ${e.device}`,
(e) => `Paramètres recommandés pour ${e.device}`, e => `Paramètres recommandés pour ${e.device}`,
(e) => `Configurazioni consigliate per ${e.device}`, e => `Configurazioni consigliate per ${e.device}`,
(e) => `${e.device} の推奨設定`, e => `${e.device} の推奨設定`,
(e) => `다음 기기에서 권장되는 설정: ${e.device}`, e => `다음 기기에서 권장되는 설정: ${e.device}`,
(e) => `Zalecane ustawienia dla ${e.device}`, e => `Zalecane ustawienia dla ${e.device}`,
e => `Configurações recomendadas para ${e.device}`,
e => `Рекомендуемые настройки для ${e.device}`,
, ,
(e) => `Рекомендуемые настройки для ${e.device}`, e => `${e.device} için önerilen ayarlar`,
, e => `Рекомендовані налаштування для ${e.device}`,
(e) => `${e.device} için önerilen ayarlar`, e => `Cấu hình được đề xuất cho ${e.device}`,
(e) => `Рекомендовані налаштування для ${e.device}`, e => `${e.device} 的推荐设置`,
(e) => `Cấu hình được đề xuất cho ${e.device}`, e => `${e.device} 推薦的設定`
(e) => `${e.device} 的推荐设置`,
(e) => `${e.device} 推薦的設定`
], ],
"reduce-animations": "Reduce UI animations", "reduce-animations": "Reduce UI animations",
region: "Region", region: "Region",
@ -600,25 +600,25 @@ var SUPPORTED_LANGUAGES = {
"top-right": "Top-right", "top-right": "Top-right",
"touch-control-layout": "Touch control layout", "touch-control-layout": "Touch control layout",
"touch-control-layout-by": [ "touch-control-layout-by": [
(e) => `Touch control layout by ${e.name}`, e => `Touch control layout by ${e.name}`,
(e) => `Format del control tàctil per ${e.name}`, e => `Format del control tàctil per ${e.name}`,
(e) => `Touch-kontrol layout af ${e.name}`, e => `Touch-kontrol layout af ${e.name}`,
(e) => `Touch-Steuerungslayout von ${e.name}`, e => `Touch-Steuerungslayout von ${e.name}`,
(e) => `Tata letak Sentuhan layar oleh ${e.name}`, e => `Tata letak Sentuhan layar oleh ${e.name}`,
(e) => `Disposición del control táctil por ${e.nombre}`, e => `Disposición del control táctil por ${e.nombre}`,
(e) => `Disposition du contrôleur tactile par ${e.name}`, e => `Disposition du contrôleur tactile par ${e.name}`,
(e) => `Configurazione dei comandi su schermo creata da ${e.name}`, e => `Configurazione dei comandi su schermo creata da ${e.name}`,
(e) => `タッチ操作レイアウト作成者: ${e.name}`, e => `タッチ操作レイアウト作成者: ${e.name}`,
(e) => `${e.name} 제작, 터치 컨트롤 레이아웃`, e => `${e.name} 제작, 터치 컨트롤 레이아웃`,
(e) => `Układ sterowania dotykowego stworzony przez ${e.name}`, e => `Układ sterowania dotykowego stworzony przez ${e.name}`,
(e) => `Disposição de controle por toque feito por ${e.name}`, e => `Disposição de controle por toque feito por ${e.name}`,
(e) => `Сенсорная раскладка по ${e.name}`, e => `Сенсорная раскладка по ${e.name}`,
(e) => `รูปแบบการควบคุมแบบสัมผัสโดย ${e.name}`, e => `รูปแบบการควบคุมแบบสัมผัสโดย ${e.name}`,
(e) => `${e.name} kişisinin dokunmatik kontrolcü tuş şeması`, e => `${e.name} kişisinin dokunmatik kontrolcü tuş şeması`,
(e) => `Розташування сенсорного керування від ${e.name}`, e => `Розташування сенсорного керування від ${e.name}`,
(e) => `Bố cục điều khiển cảm ứng tạo bởi ${e.name}`, e => `Bố cục điều khiển cảm ứng tạo bởi ${e.name}`,
(e) => `${e.name} 提供的虚拟按键样式`, e => `${e.name} 提供的虚拟按键样式`,
(e) => `觸控遊玩佈局由 ${e.name} 提供` e => `觸控遊玩佈局由 ${e.name} 提供`
], ],
"touch-controller": "Touch controller", "touch-controller": "Touch controller",
"transparent-background": "Transparent background", "transparent-background": "Transparent background",
@ -3448,13 +3448,13 @@ class TouchController {
const layout = layoutData.layouts[layoutId] || layoutData.layouts[layoutData.default_layout]; const layout = layoutData.layouts[layoutId] || layoutData.layouts[layoutData.default_layout];
if (!layout) if (!layout)
return; return;
let msg, html11 = !1; let msg, html = !1;
if (layout.author) { if (layout.author) {
const author = `<b>${escapeHtml(layout.author)}</b>`; const author = `<b>${escapeHtml(layout.author)}</b>`;
msg = t("touch-control-layout-by", { name: author }), html11 = !0; msg = t("touch-control-layout-by", { name: author }), html = !0;
} else } else
msg = t("touch-control-layout"); msg = t("touch-control-layout");
layoutChanged && Toast.show(msg, layout.name, { html: html11 }), window.setTimeout(() => { layoutChanged && Toast.show(msg, layout.name, { html }), window.setTimeout(() => {
window.BX_EXPOSED.shouldShowSensorControls = JSON.stringify(layout).includes("gyroscope"), window.BX_EXPOSED.touchLayoutManager.changeLayoutForScope({ window.BX_EXPOSED.shouldShowSensorControls = JSON.stringify(layout).includes("gyroscope"), window.BX_EXPOSED.touchLayoutManager.changeLayoutForScope({
type: "showLayout", type: "showLayout",
scope: xboxTitleId, scope: xboxTitleId,
@ -3767,20 +3767,23 @@ class PatcherUtils {
} }
var ENDING_CHUNKS_PATCH_NAME = "loadingEndingChunks", LOG_TAG3 = "Patcher", PATCHES = { var ENDING_CHUNKS_PATCH_NAME = "loadingEndingChunks", LOG_TAG3 = "Patcher", PATCHES = {
disableAiTrack(str) { disableAiTrack(str) {
const index = str.indexOf(".track=function("); let text = ".track=function(";
const index = str.indexOf(text);
if (index < 0) if (index < 0)
return !1; return !1;
if (PatcherUtils.indexOf(str, '"AppInsightsCore', index, 200) < 0) if (PatcherUtils.indexOf(str, '"AppInsightsCore', index, 200) < 0)
return !1; return !1;
return PatcherUtils.replaceWith(str, index, ".track=function(", ".track=function(e){},!!function("); return PatcherUtils.replaceWith(str, index, text, ".track=function(e){},!!function(");
}, },
disableTelemetry(str) { disableTelemetry(str) {
if (!str.includes(".disableTelemetry=function(){return!1}")) let text = ".disableTelemetry=function(){return!1}";
if (!str.includes(text))
return !1; return !1;
return str.replace(".disableTelemetry=function(){return!1}", ".disableTelemetry=function(){return!0}"); return str.replace(text, ".disableTelemetry=function(){return!0}");
}, },
disableTelemetryProvider(str) { disableTelemetryProvider(str) {
if (!str.includes("this.enableLightweightTelemetry=!")) let text = "this.enableLightweightTelemetry=!";
if (!str.includes(text))
return !1; return !1;
const newCode = [ const newCode = [
"this.trackEvent", "this.trackEvent",
@ -3792,19 +3795,21 @@ var ENDING_CHUNKS_PATCH_NAME = "loadingEndingChunks", LOG_TAG3 = "Patcher", PATC
"this.onTrackEvent", "this.onTrackEvent",
"()=>{}" "()=>{}"
].join("="); ].join("=");
return str.replace("this.enableLightweightTelemetry=!", newCode + ";this.enableLightweightTelemetry=!"); return str.replace(text, newCode + ";" + text);
}, },
disableIndexDbLogging(str) { disableIndexDbLogging(str) {
if (!str.includes(",this.logsDb=new")) let text = ",this.logsDb=new";
if (!str.includes(text))
return !1; return !1;
let newCode = ",this.log=()=>{}"; let newCode = ",this.log=()=>{}";
return str.replace(",this.logsDb=new", newCode + ",this.logsDb=new"); return str.replace(text, newCode + text);
}, },
websiteLayout(str) { websiteLayout(str) {
if (!str.includes('?"tv":"default"')) let text = '?"tv":"default"';
if (!str.includes(text))
return !1; return !1;
const layout = getPref("ui_layout") === "tv" ? "tv" : "default"; const layout = getPref("ui_layout") === "tv" ? "tv" : "default";
return str.replace('?"tv":"default"', `?"${layout}":"${layout}"`); return str.replace(text, `?"${layout}":"${layout}"`);
}, },
remotePlayDirectConnectUrl(str) { remotePlayDirectConnectUrl(str) {
const index = str.indexOf("/direct-connect"); const index = str.indexOf("/direct-connect");
@ -3813,29 +3818,36 @@ var ENDING_CHUNKS_PATCH_NAME = "loadingEndingChunks", LOG_TAG3 = "Patcher", PATC
return str.replace(str.substring(index - 9, index + 15), "https://www.xbox.com/play"); return str.replace(str.substring(index - 9, index + 15), "https://www.xbox.com/play");
}, },
remotePlayKeepAlive(str) { remotePlayKeepAlive(str) {
if (!str.includes("onServerDisconnectMessage(e){")) let text = "onServerDisconnectMessage(e){";
if (!str.includes(text))
return !1; return !1;
return str = str.replace("onServerDisconnectMessage(e){", "onServerDisconnectMessage(e){" + remote_play_keep_alive_default), str; return str = str.replace(text, text + remote_play_keep_alive_default), str;
}, },
remotePlayConnectMode(str) { remotePlayConnectMode(str) {
if (!str.includes('connectMode:"cloud-connect",')) let text = 'connectMode:"cloud-connect",';
if (!str.includes(text))
return !1; return !1;
return str.replace('connectMode:"cloud-connect",', remote_play_enable_default); return str.replace(text, remote_play_enable_default);
}, },
remotePlayDisableAchievementToast(str) { remotePlayDisableAchievementToast(str) {
if (!str.includes(".AchievementUnlock:{")) let text = ".AchievementUnlock:{";
if (!str.includes(text))
return !1; return !1;
const newCode = ` const newCode = "if (!!window.BX_REMOTE_PLAY_CONFIG) return;";
if (!!window.BX_REMOTE_PLAY_CONFIG) { return str.replace(text, text + newCode);
return; },
} remotePlayRecentlyUsedTitleIds(str) {
`; let text = "(e.data.recentlyUsedTitleIds)){";
return str.replace(".AchievementUnlock:{", ".AchievementUnlock:{" + newCode); if (!str.includes(text))
return !1;
const newCode = "if (window.BX_REMOTE_PLAY_CONFIG) return;";
return str.replace(text, text + newCode);
}, },
blockWebRtcStatsCollector(str) { blockWebRtcStatsCollector(str) {
if (!str.includes("this.shouldCollectStats=!0")) let text = "this.shouldCollectStats=!0";
if (!str.includes(text))
return !1; return !1;
return str.replace("this.shouldCollectStats=!0", "this.shouldCollectStats=!1"); return str.replace(text, "this.shouldCollectStats=!1");
}, },
patchPollGamepads(str) { patchPollGamepads(str) {
const index = str.indexOf("},this.pollGamepads=()=>{"); const index = str.indexOf("},this.pollGamepads=()=>{");
@ -3857,24 +3869,27 @@ if (!!window.BX_REMOTE_PLAY_CONFIG) {
return str.substring(0, index) + codeBlock + str.substring(nextIndex); return str.substring(0, index) + codeBlock + str.substring(nextIndex);
}, },
enableXcloudLogger(str) { enableXcloudLogger(str) {
if (!str.includes("this.telemetryProvider=e}log(e,t,r){")) let text = "this.telemetryProvider=e}log(e,t,r){";
if (!str.includes(text))
return !1; return !1;
const newCode = ` const newCode = `
const [logTag, logLevel, logMessage] = Array.from(arguments); const [logTag, logLevel, logMessage] = Array.from(arguments);
const logFunc = [console.debug, console.log, console.warn, console.error][logLevel]; const logFunc = [console.debug, console.log, console.warn, console.error][logLevel];
logFunc(logTag, '//', logMessage); logFunc(logTag, '//', logMessage);
`; `;
return str = str.replaceAll("this.telemetryProvider=e}log(e,t,r){", "this.telemetryProvider=e}log(e,t,r){" + newCode), str; return str = str.replaceAll(text, text + newCode), str;
}, },
enableConsoleLogging(str) { enableConsoleLogging(str) {
if (!str.includes("static isConsoleLoggingAllowed(){")) let text = "static isConsoleLoggingAllowed(){";
if (!str.includes(text))
return !1; return !1;
return str = str.replaceAll("static isConsoleLoggingAllowed(){", "static isConsoleLoggingAllowed(){return true;"), str; return str = str.replaceAll(text, text + "return true;"), str;
}, },
playVibration(str) { playVibration(str) {
if (!str.includes("}playVibration(e){")) let text = "}playVibration(e){";
if (!str.includes(text))
return !1; return !1;
return VibrationManager.updateGlobalVars(), str = str.replaceAll("}playVibration(e){", "}playVibration(e){" + vibration_adjust_default), str; return VibrationManager.updateGlobalVars(), str = str.replaceAll(text, text + vibration_adjust_default), str;
}, },
overrideSettings(str) { overrideSettings(str) {
const index = str.indexOf(",EnableStreamGate:"); const index = str.indexOf(",EnableStreamGate:");
@ -3894,13 +3909,15 @@ logFunc(logTag, '//', logMessage);
return str = str.substring(0, constIndex) + "e.onClose();return null;" + str.substring(constIndex), str; return str = str.substring(0, constIndex) + "e.onClose();return null;" + str.substring(constIndex), str;
}, },
patchUpdateInputConfigurationAsync(str) { patchUpdateInputConfigurationAsync(str) {
if (!str.includes("async updateInputConfigurationAsync(e){")) let text = "async updateInputConfigurationAsync(e){";
if (!str.includes(text))
return !1; return !1;
const newCode = "e.enableTouchInput = true;"; const newCode = "e.enableTouchInput = true;";
return str = str.replace("async updateInputConfigurationAsync(e){", "async updateInputConfigurationAsync(e){" + newCode), str; return str = str.replace(text, text + newCode), str;
}, },
loadingEndingChunks(str) { loadingEndingChunks(str) {
if (!str.includes('"FamilySagaManager"')) let text = '"FamilySagaManager"';
if (!str.includes(text))
return !1; return !1;
return BxLogger.info(LOG_TAG3, "Remaining patches:", PATCH_ORDERS), PATCH_ORDERS = PATCH_ORDERS.concat(PLAYING_PATCH_ORDERS), str; return BxLogger.info(LOG_TAG3, "Remaining patches:", PATCH_ORDERS), PATCH_ORDERS = PATCH_ORDERS.concat(PLAYING_PATCH_ORDERS), str;
}, },
@ -3912,14 +3929,15 @@ logFunc(logTag, '//', logMessage);
return str = str.substring(0, bracketIndex) + "return 0;" + str.substring(bracketIndex), str; return str = str.substring(0, bracketIndex) + "return 0;" + str.substring(bracketIndex), str;
}, },
exposeTouchLayoutManager(str) { exposeTouchLayoutManager(str) {
if (!str.includes("this._perScopeLayoutsStream=new")) let text = "this._perScopeLayoutsStream=new";
if (!str.includes(text))
return !1; return !1;
const newCode = ` const newCode = `
true; true;
window.BX_EXPOSED["touchLayoutManager"] = this; window.BX_EXPOSED["touchLayoutManager"] = this;
window.dispatchEvent(new Event("${BxEvent.TOUCH_LAYOUT_MANAGER_READY}")); window.dispatchEvent(new Event("${BxEvent.TOUCH_LAYOUT_MANAGER_READY}"));
`; `;
return str = str.replace("this._perScopeLayoutsStream=new", newCode + "this._perScopeLayoutsStream=new"), str; return str = str.replace(text, newCode + text), str;
}, },
patchBabylonRendererClass(str) { patchBabylonRendererClass(str) {
let index = str.indexOf(".current.render(),"); let index = str.indexOf(".current.render(),");
@ -3941,19 +3959,22 @@ if (window.BX_EXPOSED.stopTakRendering) {
return str = str.substring(0, index) + newCode + str.substring(index), str; return str = str.substring(0, index) + newCode + str.substring(index), str;
}, },
supportLocalCoOp(str) { supportLocalCoOp(str) {
if (!str.includes("this.gamepadMappingsToSend=[],")) let text = "this.gamepadMappingsToSend=[],";
if (!str.includes(text))
return !1; return !1;
const newCode = `true; ${local_co_op_enable_default}; true,`; const newCode = `true; ${local_co_op_enable_default}; true,`;
return str = str.replace("this.gamepadMappingsToSend=[],", "this.gamepadMappingsToSend=[]," + newCode), str; return str = str.replace(text, text + newCode), str;
}, },
forceFortniteConsole(str) { forceFortniteConsole(str) {
if (!str.includes("sendTouchInputEnabledMessage(e){")) let text = "sendTouchInputEnabledMessage(e){";
if (!str.includes(text))
return !1; return !1;
const newCode = "window.location.pathname.includes('/launch/fortnite/') && (e = false);"; const newCode = "window.location.pathname.includes('/launch/fortnite/') && (e = false);";
return str = str.replace("sendTouchInputEnabledMessage(e){", "sendTouchInputEnabledMessage(e){" + newCode), str; return str = str.replace(text, text + newCode), str;
}, },
disableTakRenderer(str) { disableTakRenderer(str) {
if (!str.includes("const{TakRenderer:")) let text = "const{TakRenderer:";
if (!str.includes(text))
return !1; return !1;
let autoOffCode = ""; let autoOffCode = "";
if (getPref("stream_touch_controller") === "off") if (getPref("stream_touch_controller") === "off")
@ -3982,15 +4003,17 @@ if (titleInfo && !titleInfo.details.hasTouchSupport && !titleInfo.details.hasFak
return; return;
} }
`; `;
return str = str.replace("const{TakRenderer:", newCode + "const{TakRenderer:"), str; return str = str.replace(text, newCode + text), str;
}, },
streamCombineSources(str) { streamCombineSources(str) {
if (!str.includes("this.useCombinedAudioVideoStream=!!this.deviceInformation.isTizen")) let text = "this.useCombinedAudioVideoStream=!!this.deviceInformation.isTizen";
if (!str.includes(text))
return !1; return !1;
return str = str.replace("this.useCombinedAudioVideoStream=!!this.deviceInformation.isTizen", "this.useCombinedAudioVideoStream=true"), str; return str = str.replace(text, "this.useCombinedAudioVideoStream=true"), str;
}, },
patchStreamHud(str) { patchStreamHud(str) {
if (!str.includes("let{onCollapse")) let text = "let{onCollapse";
if (!str.includes(text))
return !1; return !1;
let newCode = ` let newCode = `
// Expose onShowStreamMenu // Expose onShowStreamMenu
@ -4000,15 +4023,16 @@ e.guideUI = null;
`; `;
if (getPref("stream_touch_controller") === "off") if (getPref("stream_touch_controller") === "off")
newCode += "e.canShowTakHUD = false;"; newCode += "e.canShowTakHUD = false;";
return str = str.replace("let{onCollapse", newCode + "let{onCollapse"), str; return str = str.replace(text, newCode + text), str;
}, },
broadcastPollingMode(str) { broadcastPollingMode(str) {
if (!str.includes(".setPollingMode=e=>{")) let text = ".setPollingMode=e=>{";
if (!str.includes(text))
return !1; return !1;
const newCode = ` const newCode = `
BxEvent.dispatch(window, BxEvent.XCLOUD_POLLING_MODE_CHANGED, {mode: e.toLowerCase()}); BxEvent.dispatch(window, BxEvent.XCLOUD_POLLING_MODE_CHANGED, {mode: e.toLowerCase()});
`; `;
return str = str.replace(".setPollingMode=e=>{", ".setPollingMode=e=>{" + newCode), str; return str = str.replace(text, text + newCode), str;
}, },
patchGamepadPolling(str) { patchGamepadPolling(str) {
let index = str.indexOf(".shouldHandleGamepadInput)())return void"); let index = str.indexOf(".shouldHandleGamepadInput)())return void");
@ -4017,7 +4041,7 @@ BxEvent.dispatch(window, BxEvent.XCLOUD_POLLING_MODE_CHANGED, {mode: e.toLowerCa
return index = str.indexOf("{", index - 20) + 1, str = str.substring(0, index) + "if (window.BX_EXPOSED.disableGamepadPolling) return;" + str.substring(index), str; return index = str.indexOf("{", index - 20) + 1, str = str.substring(0, index) + "if (window.BX_EXPOSED.disableGamepadPolling) return;" + str.substring(index), str;
}, },
patchXcloudTitleInfo(str) { patchXcloudTitleInfo(str) {
let index = str.indexOf("async cloudConnect"); let text = "async cloudConnect", index = str.indexOf(text);
if (index < 0) if (index < 0)
return !1; return !1;
let backetIndex = str.indexOf("{", index); let backetIndex = str.indexOf("{", index);
@ -4028,7 +4052,7 @@ BxLogger.info('patchXcloudTitleInfo', ${titleInfoVar});
return str = str.substring(0, backetIndex + 1) + newCode + str.substring(backetIndex + 1), str; return str = str.substring(0, backetIndex + 1) + newCode + str.substring(backetIndex + 1), str;
}, },
patchRemotePlayMkb(str) { patchRemotePlayMkb(str) {
let index = str.indexOf("async homeConsoleConnect"); let text = "async homeConsoleConnect", index = str.indexOf(text);
if (index < 0) if (index < 0)
return !1; return !1;
let backetIndex = str.indexOf("{", index); let backetIndex = str.indexOf("{", index);
@ -4043,72 +4067,84 @@ BxLogger.info('patchRemotePlayMkb', ${configsVar});
return str = str.substring(0, backetIndex + 1) + newCode + str.substring(backetIndex + 1), str; return str = str.substring(0, backetIndex + 1) + newCode + str.substring(backetIndex + 1), str;
}, },
patchAudioMediaStream(str) { patchAudioMediaStream(str) {
if (!str.includes(".srcObject=this.audioMediaStream,")) let text = ".srcObject=this.audioMediaStream,";
if (!str.includes(text))
return !1; return !1;
const newCode = "window.BX_EXPOSED.setupGainNode(arguments[1], this.audioMediaStream),"; const newCode = "window.BX_EXPOSED.setupGainNode(arguments[1], this.audioMediaStream),";
return str = str.replace(".srcObject=this.audioMediaStream,", ".srcObject=this.audioMediaStream," + newCode), str; return str = str.replace(text, text + newCode), str;
}, },
patchCombinedAudioVideoMediaStream(str) { patchCombinedAudioVideoMediaStream(str) {
if (!str.includes(".srcObject=this.combinedAudioVideoStream")) let text = ".srcObject=this.combinedAudioVideoStream";
if (!str.includes(text))
return !1; return !1;
const newCode = ",window.BX_EXPOSED.setupGainNode(arguments[0], this.combinedAudioVideoStream)"; const newCode = ",window.BX_EXPOSED.setupGainNode(arguments[0], this.combinedAudioVideoStream)";
return str = str.replace(".srcObject=this.combinedAudioVideoStream", ".srcObject=this.combinedAudioVideoStream" + newCode), str; return str = str.replace(text, text + newCode), str;
}, },
patchTouchControlDefaultOpacity(str) { patchTouchControlDefaultOpacity(str) {
if (!str.includes("opacityMultiplier:1")) let text = "opacityMultiplier:1";
if (!str.includes(text))
return !1; return !1;
const newCode = `opacityMultiplier: ${(getPref("stream_touch_controller_default_opacity") / 100).toFixed(1)}`; const newCode = `opacityMultiplier: ${(getPref("stream_touch_controller_default_opacity") / 100).toFixed(1)}`;
return str = str.replace("opacityMultiplier:1", newCode), str; return str = str.replace(text, newCode), str;
}, },
patchShowSensorControls(str) { patchShowSensorControls(str) {
if (!str.includes("{shouldShowSensorControls:")) let text = "{shouldShowSensorControls:";
if (!str.includes(text))
return !1; return !1;
const newCode = "{shouldShowSensorControls: (window.BX_EXPOSED && window.BX_EXPOSED.shouldShowSensorControls) ||"; const newCode = "{shouldShowSensorControls: (window.BX_EXPOSED && window.BX_EXPOSED.shouldShowSensorControls) ||";
return str = str.replace("{shouldShowSensorControls:", newCode), str; return str = str.replace(text, newCode), str;
}, },
exposeStreamSession(str) { exposeStreamSession(str) {
if (!str.includes(",this._connectionType=")) let text = ",this._connectionType=";
if (!str.includes(text))
return !1; return !1;
const newCode = `; const newCode = `;
${expose_stream_session_default} ${expose_stream_session_default}
true,this._connectionType=`; true` + text;
return str = str.replace(",this._connectionType=", newCode), str; return str = str.replace(text, newCode), str;
}, },
skipFeedbackDialog(str) { skipFeedbackDialog(str) {
if (!str.includes("&&this.shouldTransitionToFeedback(")) let text = "&&this.shouldTransitionToFeedback(";
if (!str.includes(text))
return !1; return !1;
return str = str.replace("&&this.shouldTransitionToFeedback(", "&& false &&this.shouldTransitionToFeedback("), str; return str = str.replace(text, "&& false " + text), str;
}, },
enableNativeMkb(str) { enableNativeMkb(str) {
if (!str.includes("e.mouseSupported&&e.keyboardSupported&&e.fullscreenSupported;")) let text = "e.mouseSupported&&e.keyboardSupported&&e.fullscreenSupported;";
if (!str.includes(text))
return !1; return !1;
return str = str.replace("e.mouseSupported&&e.keyboardSupported&&e.fullscreenSupported;", "e.mouseSupported&&e.keyboardSupported&&e.fullscreenSupported;return true;"), str; return str = str.replace(text, text + "return true;"), str;
}, },
patchMouseAndKeyboardEnabled(str) { patchMouseAndKeyboardEnabled(str) {
if (!str.includes("get mouseAndKeyboardEnabled(){")) let text = "get mouseAndKeyboardEnabled(){";
if (!str.includes(text))
return !1; return !1;
return str = str.replace("get mouseAndKeyboardEnabled(){", "get mouseAndKeyboardEnabled(){return true;"), str; return str = str.replace(text, text + "return true;"), str;
}, },
exposeInputSink(str) { exposeInputSink(str) {
if (!str.includes("this.controlChannel=null,this.inputChannel=null")) let text = "this.controlChannel=null,this.inputChannel=null";
if (!str.includes(text))
return !1; return !1;
const newCode = "window.BX_EXPOSED.inputSink = this;"; const newCode = "window.BX_EXPOSED.inputSink = this;";
return str = str.replace("this.controlChannel=null,this.inputChannel=null", newCode + "this.controlChannel=null,this.inputChannel=null"), str; return str = str.replace(text, newCode + text), str;
}, },
disableNativeRequestPointerLock(str) { disableNativeRequestPointerLock(str) {
if (!str.includes("async requestPointerLock(){")) let text = "async requestPointerLock(){";
if (!str.includes(text))
return !1; return !1;
return str = str.replace("async requestPointerLock(){", "async requestPointerLock(){return;"), str; return str = str.replace(text, text + "return;"), str;
}, },
patchRequestInfoCrash(str) { patchRequestInfoCrash(str) {
if (!str.includes('if(!e)throw new Error("RequestInfo.origin is falsy");')) let text = 'if(!e)throw new Error("RequestInfo.origin is falsy");';
if (!str.includes(text))
return !1; return !1;
return str = str.replace('if(!e)throw new Error("RequestInfo.origin is falsy");', 'if (!e) e = "https://www.xbox.com";'), str; return str = str.replace(text, 'if (!e) e = "https://www.xbox.com";'), str;
}, },
exposeDialogRoutes(str) { exposeDialogRoutes(str) {
if (!str.includes("return{goBack:function(){")) let text = "return{goBack:function(){";
if (!str.includes(text))
return !1; return !1;
return str = str.replace("return{goBack:function(){", "return window.BX_EXPOSED.dialogRoutes = {goBack:function(){"), str; return str = str.replace(text, "return window.BX_EXPOSED.dialogRoutes = {goBack:function(){"), str;
}, },
enableTvRoutes(str) { enableTvRoutes(str) {
let index = str.indexOf(".LoginDeviceCode.path,"); let index = str.indexOf(".LoginDeviceCode.path,");
@ -4173,7 +4209,8 @@ if (e && e.id) {
return str = PatcherUtils.insertAt(str, index, newCode), str; return str = PatcherUtils.insertAt(str, index, newCode), str;
}, },
overrideStorageGetSettings(str) { overrideStorageGetSettings(str) {
if (!str.includes("}getSetting(e){")) let text = "}getSetting(e){";
if (!str.includes(text))
return !1; return !1;
const newCode = ` const newCode = `
// console.log('setting', this.baseStorageKey, e); // console.log('setting', this.baseStorageKey, e);
@ -4184,7 +4221,7 @@ if (this.baseStorageKey in window.BX_EXPOSED.overrideSettings) {
} }
} }
`; `;
return str = str.replace("}getSetting(e){", "}getSetting(e){" + newCode), str; return str = str.replace(text, text + newCode), str;
}, },
alwaysShowStreamHud(str) { alwaysShowStreamHud(str) {
let index = str.indexOf(",{onShowStreamMenu:"); let index = str.indexOf(",{onShowStreamMenu:");
@ -4210,7 +4247,8 @@ if (this.baseStorageKey in window.BX_EXPOSED.overrideSettings) {
return str = str.substring(0, index) + 'BxEvent.dispatch(window, BxEvent.XCLOUD_RENDERING_COMPONENT, {component: "product-details"});' + str.substring(index), str; return str = str.substring(0, index) + 'BxEvent.dispatch(window, BxEvent.XCLOUD_RENDERING_COMPONENT, {component: "product-details"});' + str.substring(index), str;
}, },
detectBrowserRouterReady(str) { detectBrowserRouterReady(str) {
if (!str.includes("BrowserRouter:()=>")) let text = "BrowserRouter:()=>";
if (!str.includes(text))
return !1; return !1;
let index = str.indexOf("{history:this.history,"); let index = str.indexOf("{history:this.history,");
if (index < 0) if (index < 0)
@ -4265,6 +4303,7 @@ if (this.baseStorageKey in window.BX_EXPOSED.overrideSettings) {
"remotePlayKeepAlive", "remotePlayKeepAlive",
"remotePlayDirectConnectUrl", "remotePlayDirectConnectUrl",
"remotePlayDisableAchievementToast", "remotePlayDisableAchievementToast",
"remotePlayRecentlyUsedTitleIds",
STATES.userAgent.capabilities.touch && "patchUpdateInputConfigurationAsync" STATES.userAgent.capabilities.touch && "patchUpdateInputConfigurationAsync"
] : [], ] : [],
...BX_FLAGS.EnableXcloudLogging ? [ ...BX_FLAGS.EnableXcloudLogging ? [
@ -5710,8 +5749,8 @@ class EmulatedMkbHandler extends MkbHandler {
label: t("edit"), label: t("edit"),
onClick: (e) => { onClick: (e) => {
e.preventDefault(), e.stopPropagation(); e.preventDefault(), e.stopPropagation();
const dialog2 = SettingsNavigationDialog.getInstance(); const dialog = SettingsNavigationDialog.getInstance();
dialog2.focusTab("mkb"), NavigationDialogManager.getInstance().show(dialog2); dialog.focusTab("mkb"), NavigationDialogManager.getInstance().show(dialog);
} }
})))); }))));
if (!this.#$message.isConnected) if (!this.#$message.isConnected)
@ -6334,12 +6373,12 @@ class RemotePlayManager {
Authorization: `Bearer ${this.XHOME_TOKEN}` Authorization: `Bearer ${this.XHOME_TOKEN}`
} }
}; };
for (let region2 of this.regions) for (let region of this.regions)
try { try {
const request = new Request(`${region2.baseUri}/v6/servers/home?mr=50`, options), json = await (await fetch(request)).json(); const request = new Request(`${region.baseUri}/v6/servers/home?mr=50`, options), json = await (await fetch(request)).json();
if (json.results.length === 0) if (json.results.length === 0)
continue; continue;
this.consoles = json.results, STATES.remotePlay.server = region2.baseUri; this.consoles = json.results, STATES.remotePlay.server = region.baseUri;
break; break;
} catch (e) { } catch (e) {
} }
@ -6625,8 +6664,8 @@ class StreamBadges {
#cachedDoms = {}; #cachedDoms = {};
#interval; #interval;
#REFRESH_INTERVAL = 3000; #REFRESH_INTERVAL = 3000;
setRegion(region3) { setRegion(region) {
this.#region = region3; this.#region = region;
} }
#renderBadge(name, value, color) { #renderBadge(name, value, color) {
let $badge; let $badge;
@ -6830,17 +6869,17 @@ class XcloudInterceptor {
WestUS: "🇺🇸", WestUS: "🇺🇸",
WestUS2: "🇺🇸" WestUS2: "🇺🇸"
}, serverRegex = /\/\/(\w+)\./; }, serverRegex = /\/\/(\w+)\./;
for (let region4 of obj.offeringSettings.regions) { for (let region of obj.offeringSettings.regions) {
const regionName = region4.name; const regionName = region.name;
let shortName = region4.name; let shortName = region.name;
if (region4.isDefault) if (region.isDefault)
STATES.selectedRegion = Object.assign({}, region4); STATES.selectedRegion = Object.assign({}, region);
let match = serverRegex.exec(region4.baseUri); let match = serverRegex.exec(region.baseUri);
if (match) { if (match) {
if (shortName = match[1], serverEmojis[regionName]) if (shortName = match[1], serverEmojis[regionName])
shortName = serverEmojis[regionName] + " " + shortName; shortName = serverEmojis[regionName] + " " + shortName;
} }
region4.shortName = shortName.toUpperCase(), STATES.serverRegions[region4.name] = Object.assign({}, region4); region.shortName = shortName.toUpperCase(), STATES.serverRegions[region.name] = Object.assign({}, region);
} }
BxEvent.dispatch(window, BxEvent.XCLOUD_SERVERS_READY); BxEvent.dispatch(window, BxEvent.XCLOUD_SERVERS_READY);
const preferredRegion = getPreferredServerRegion(); const preferredRegion = getPreferredServerRegion();
@ -6854,8 +6893,8 @@ class XcloudInterceptor {
const PREF_STREAM_TARGET_RESOLUTION = getPref("stream_target_resolution"), PREF_STREAM_PREFERRED_LOCALE = getPref("stream_preferred_locale"), url = typeof request === "string" ? request : request.url, parsedUrl = new URL(url); const PREF_STREAM_TARGET_RESOLUTION = getPref("stream_target_resolution"), PREF_STREAM_PREFERRED_LOCALE = getPref("stream_preferred_locale"), url = typeof request === "string" ? request : request.url, parsedUrl = new URL(url);
let badgeRegion = parsedUrl.host.split(".", 1)[0]; let badgeRegion = parsedUrl.host.split(".", 1)[0];
for (let regionName in STATES.serverRegions) { for (let regionName in STATES.serverRegions) {
const region4 = STATES.serverRegions[regionName]; const region = STATES.serverRegions[regionName];
if (parsedUrl.origin == region4.baseUri) { if (parsedUrl.origin == region.baseUri) {
badgeRegion = regionName; badgeRegion = regionName;
break; break;
} }
@ -8495,7 +8534,7 @@ if (window.location.pathname.includes("/auth/msa")) {
BxLogger.info("readyState", document.readyState); BxLogger.info("readyState", document.readyState);
if (BX_FLAGS.SafariWorkaround && document.readyState !== "loading") { if (BX_FLAGS.SafariWorkaround && document.readyState !== "loading") {
window.stop(); window.stop();
const css2 = '.bx-reload-overlay{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;align-items:center;background:rgba(0,0,0,0.8);z-index:9999;color:#fff;text-align:center;font-weight:400;font-family:"Segoe UI",Arial,Helvetica,sans-serif;font-size:1.3rem}.bx-reload-overlay *:focus{outline:none !important}.bx-reload-overlay > div{margin:0 auto}.bx-reload-overlay a{text-decoration:none;display:inline-block;background:#107c10;color:#fff;border-radius:4px;padding:6px}', isSafari = UserAgent.isSafari(); const css = '.bx-reload-overlay{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;align-items:center;background:rgba(0,0,0,0.8);z-index:9999;color:#fff;text-align:center;font-weight:400;font-family:"Segoe UI",Arial,Helvetica,sans-serif;font-size:1.3rem}.bx-reload-overlay *:focus{outline:none !important}.bx-reload-overlay > div{margin:0 auto}.bx-reload-overlay a{text-decoration:none;display:inline-block;background:#107c10;color:#fff;border-radius:4px;padding:6px}', isSafari = UserAgent.isSafari();
let $secondaryAction; let $secondaryAction;
if (isSafari) if (isSafari)
$secondaryAction = CE("p", {}, t("settings-reloading")); $secondaryAction = CE("p", {}, t("settings-reloading"));