Greasy Fork

Greasy Fork is available in English.

Xbox CLoud Gaming优化整合

整合和修改现有脚本,优化项详见脚本说明。【若你有好的想法或者BUG可以进xbox云游戏QQ交流1群531602832,2群313340764反馈】

当前为 2023-05-03 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name                 Xbox CLoud Gaming优化整合
// @name:zh-CN           Xbox CLoud Gaming优化整合
// @namespace            http://tampermonkey.net/xbox/nft
// @version              2.2.3
// @author               奈非天
// @match                https://www.xbox.com/*/play*
// @run-at               document-start
// @grant                unsafeWindow
// @require              https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/3.2.1/jquery.min.js
// @original-script      http://greasyfork.icu/zh-CN/scripts/455741-xbox-cloud-gaming%E4%BC%98%E5%8C%96%E6%95%B4%E5%90%88
// @description:zh-cn    整合和修改现有脚本,优化项详见脚本说明。【若你有好的想法或者BUG可以进xbox云游戏QQ交流1群531602832,2群313340764反馈】
// @description          整合和修改现有脚本,优化项详见脚本说明。【若你有好的想法或者BUG可以进xbox云游戏QQ交流1群531602832,2群313340764反馈】
// ==/UserScript==
(function () {
    'use strict';
    // Your code here...

    //========↓↓↓↓↓是各个功能的初始设置,仅第一次运行脚本有效↓↓↓↓↓========//
    //★★ 1=开   0=关 ★★//

    //免代理直连
    let no_need_VPN_play = 1;

    let regionsList = {'韩': '168.126.63.1', '美': '4.2.2.2', '日': '210.131.113.123'}

    //欺骗IP
    let fakeIp = regionsList['美'];

    //选择语言
    let chooseLanguage = 1;
    //智能语言报错时默认使用的语言,简体zh-CN,繁体zh-TW,总开关是上一行的chooseLanguage
    let IfErrUsedefaultGameLanguage = 'zh-CN';

    //高码率,禁用后最高8M,码率720P画质
    let high_bitrate = 1;

    //使用触屏经典手柄布局(默认关闭)
    let useDefaultTouchControls = 0;

    //禁止检测网络状况
    let disableCheckNetwork = 1;

    //禁用游戏界面下拉刷新
    let no_pull_refresh = 1;

    //自动全屏
    let autoFullScreen = 0;

    //锁定云游戏服务器,注意此项并非是云游戏区域(默认关闭)
    let blockXcloudServer = 0;
    let blockXcloudServerList = ['AustraliaEast', 'AustraliaSouthEast', 'BrazilSouth', 'EastUS', 'EastUS2', 'JapanEast', 'KoreaCentral', 'NorthCentralUs', 'SouthCentralUS', 'UKSouth', 'WestEurope', 'WestUS', 'WestUS2'];
    let defaultXcloudServer = 'KoreaCentral';

    //画面设置
    let videoResize = 0;
    //左右
    let videoX = 0;
    //上下
    let videoY = 0;


    //========↑↑↑↑↑是各个功能的初始设置,仅第一次运行脚本有效↑↑↑↑↑========//

    const originFetch = fetch;
    let regionsMenuItemList = [];
    let languageMenuItemList = [];
    let default_language_list = {'智能简繁': 'Auto', '简体': 'zh-CN', '繁体': 'zh-TW'}
    let xcloud_game_language = default_language_list['简体'];//
    let useCustomfakeIp = 0;
    let customfakeIp = '';
    let BasicControlsCheck = false;

    let windowCtx = self.window;
    if (self.unsafeWindow) {
        console.log("使用unsafeWindow模式");
        windowCtx = self.unsafeWindow;
    } else {
        console.log("使用原生模式");
    }

    let naifeitian = {
        isType(obj) {
            return Object.prototype.toString.call(obj).replace(/^\[object (.+)\]$/, '$1').toLowerCase();
        },
        getValue(key) {
            try {
                return JSON.parse(localStorage.getItem(key));
            } catch (e) {
                return localStorage.getItem(key);
            }
        },

        setValue(key, value) {
            if (this.isType(value) === 'object' || this.isType(value) === 'array') {
                return localStorage.setItem(key, JSON.stringify(value));
            }
            return localStorage.setItem(key, value);
        },
        isValidIP(ip) {
            var reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/
            return reg.test(ip);
        },
        isNumber(val) {
            return !isNaN(parseFloat(val)) && isFinite(val);
        },
        killTouchMove(v){
            $(v).on('touchmove', false);
        },
        renewTouchMove(v){
            $(v).off('touchmove', false);
        }
    }

    function setMachineFullScreen() {
        try {
            let element = document.documentElement;
            if (element.requestFullscreen) {
                element.requestFullscreen();
            } else if (element.mozRequestFullScreen) {
                element.mozRequestFullScreen();
            } else if (element.msRequestFullscreen) {
                element.msRequestFullscreen();
            } else if (element.webkitRequestFullscreen) {
                element.webkitRequestFullScreen();
            }
            screen?.orientation?.lock("landscape");
        } catch (e) {
        }
    }

    function exitMachineFullscreen() {
        try {
            screen?.orientation?.unlock();
            if (document.exitFullScreen) {
                document.exitFullScreen();
            } else if (document.mozCancelFullScreen) {
                document.mozCancelFullScreen();
            } else if (document.webkitExitFullscreen) {
                document.webkitExitFullscreen();
            } else if (element.msExitFullscreen) {
                element.msExitFullscreen();
            }
        } catch (e) {
        }
    }

    blockXcloudServerList = naifeitian.getValue("blockXcloudServerListGM") == null ? blockXcloudServerList : naifeitian.getValue("blockXcloudServerListGM");
    naifeitian.setValue("blockXcloudServerListGM", blockXcloudServerList);

    no_need_VPN_play = naifeitian.getValue("no_need_VPN_playGM") == null ? no_need_VPN_play : naifeitian.getValue("no_need_VPN_playGM");
    naifeitian.setValue("no_need_VPN_playGM", no_need_VPN_play);

    chooseLanguage = naifeitian.getValue("chooseLanguageGM") == null ? chooseLanguage : naifeitian.getValue("chooseLanguageGM");
    naifeitian.setValue("chooseLanguageGM", chooseLanguage);

    IfErrUsedefaultGameLanguage = naifeitian.getValue("IfErrUsedefaultGameLanguageGM") == null ? IfErrUsedefaultGameLanguage : naifeitian.getValue("IfErrUsedefaultGameLanguageGM");
    naifeitian.setValue("IfErrUsedefaultGameLanguageGM", IfErrUsedefaultGameLanguage);

    fakeIp = naifeitian.getValue("fakeIpGM") == null ? fakeIp : naifeitian.getValue("fakeIpGM");
    naifeitian.setValue("fakeIpGM", fakeIp);

    high_bitrate = naifeitian.getValue("high_bitrateGM") == null ? high_bitrate : naifeitian.getValue("high_bitrateGM");
    naifeitian.setValue("high_bitrateGM", high_bitrate);

    useDefaultTouchControls = naifeitian.getValue("useDefaultTouchControlsGM") == null ? useDefaultTouchControls : naifeitian.getValue("useDefaultTouchControlsGM");
    naifeitian.setValue("useDefaultTouchControlsGM", useDefaultTouchControls);

    disableCheckNetwork = naifeitian.getValue("disableCheckNetworkGM") == null ? disableCheckNetwork : naifeitian.getValue("disableCheckNetworkGM");
    naifeitian.setValue("disableCheckNetworkGM", disableCheckNetwork);

    no_pull_refresh = naifeitian.getValue("no_pull_refreshGM") == null ? no_pull_refresh : naifeitian.getValue("no_pull_refreshGM");
    naifeitian.setValue("no_pull_refreshGM", no_pull_refresh);

    defaultXcloudServer = naifeitian.getValue("defaultXcloudServerGM") == null ? defaultXcloudServer : naifeitian.getValue("defaultXcloudServerGM");
    naifeitian.setValue("defaultXcloudServerGM", defaultXcloudServer);

    blockXcloudServer = naifeitian.getValue("blockXcloudServerGM") == null ? blockXcloudServer : naifeitian.getValue("blockXcloudServerGM");
    naifeitian.setValue("blockXcloudServerGM", blockXcloudServer);

    xcloud_game_language = naifeitian.getValue("xcloud_game_languageGM") == null ? xcloud_game_language : naifeitian.getValue("xcloud_game_languageGM");
    naifeitian.setValue("xcloud_game_languageGM", xcloud_game_language);

    useCustomfakeIp = naifeitian.getValue("useCustomfakeIpGM") == null ? useCustomfakeIp : naifeitian.getValue("useCustomfakeIpGM");
    naifeitian.setValue("useCustomfakeIpGM", useCustomfakeIp);

    customfakeIp = naifeitian.getValue("customfakeIpGM") == null ? customfakeIp : naifeitian.getValue("customfakeIpGM");
    naifeitian.setValue("customfakeIpGM", customfakeIp);

    autoFullScreen = naifeitian.getValue("autoFullScreenGM") == null ? autoFullScreen : naifeitian.getValue("autoFullScreenGM");
    naifeitian.setValue("autoFullScreenGM", autoFullScreen);


    videoResize = naifeitian.getValue("videoResizeGM") == null ? videoResize : naifeitian.getValue("videoResizeGM");
    naifeitian.setValue("videoResizeGM", videoResize);

    videoX = naifeitian.getValue("videoXGM") == null ? videoX : naifeitian.getValue("videoXGM");
    naifeitian.setValue("videoXGM", videoX);

    videoY = naifeitian.getValue("videoYGM") == null ? videoY : naifeitian.getValue("videoYGM");
    naifeitian.setValue("videoYGM", videoY);

    if (useDefaultTouchControls == 1) {
        windowCtx.RTCPeerConnection.prototype.originalCreateDataChannelGTC = windowCtx.RTCPeerConnection.prototype.createDataChannel;
        windowCtx.RTCPeerConnection.prototype.createDataChannel = function (...params) {
            let dc = this.originalCreateDataChannelGTC(...params);
            let paddingMsgTimeoutId = 0;
            if (dc.label == "message") {
                dc.addEventListener("message", function (de) {
                    if (typeof (de.data) == "string") {
                        // console.debug(de.data);
                        let msgdata = JSON.parse(de.data);
                        if (msgdata.target == "/streaming/touchcontrols/showlayoutv2") {
                            clearTimeout(paddingMsgTimeoutId);
                        } else if (msgdata.target == "/streaming/touchcontrols/showtitledefault") {
                            if (msgdata.pluginHookMessage !== true) {
                                clearTimeout(paddingMsgTimeoutId);
                                paddingMsgTimeoutId = setTimeout(() => {
                                    dc.dispatchEvent(new MessageEvent('message', {
                                        data: '{"content":"{\\"layoutId\\":\\"\\"}","target":"/streaming/touchcontrols/showlayoutv2","type":"Message","pluginHookMessage":true}'
                                    }));
                                }, 1000);
                            }
                        }
                    }
                });
            }
            return dc;
        }
    }


    function HookProperty(object, property, value) {
        Object.defineProperty(object, property, {
            value: value
        });
    }

    let fakeuad = {
        "brands": [
            {
                "brand": "Microsoft Edge",
                "version": "999"
            },
            {
                "brand": "Chromium",
                "version": "999"
            },
            {
                "brand": "Not=A?Brand",
                "version": "24"
            }
        ],
        "mobile": false,
        "platform": "Windows"
    };
    try {
        if (high_bitrate == 1) {
            HookProperty(windowCtx.navigator, "userAgent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/999.0.0.0 Safari/537.36 Edg/999.0.0.0");
            HookProperty(windowCtx.navigator, "appVersion", "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/999.0.0.0 Safari/537.36 Edg/999.0.0.0");
            HookProperty(windowCtx.navigator, "platform", "Win32");
            HookProperty(windowCtx.navigator, "appName", "Netscape");
            HookProperty(windowCtx.navigator, "appCodeName", "Mozilla");
            HookProperty(windowCtx.navigator, "product", "Gecko");
            HookProperty(windowCtx.navigator, "vendor", "Google Inc.");
            HookProperty(windowCtx.navigator, "vendorSub", "");
            HookProperty(windowCtx.navigator, "maxTouchPoints", 10);
            HookProperty(windowCtx.navigator, "userAgentData", fakeuad);
        }
        if (disableCheckNetwork == 1) {
            //HookProperty(windowCtx.navigator, "connection", undefined);
            Object.defineProperty(windowCtx.navigator, 'connection', {
                get: function () {
                    return {
                        onchange: null,
                        effectiveType: '4g',
                        rtt: 0,
                        downlink: 10,
                        saveData: false,
                        addEventListener: function () {
                        },
                        removeEventListener: function () {
                        },
                    }; // Official check: rtt >= 100 || downlink <= 10 || saveData || effectiveType is ["slow-2g","2g","3g"]
                }
            });
        }
        HookProperty(windowCtx.navigator, "standalone", true);

    } catch (e) {
    }

    //悬浮确认按钮
    let confirmBtn = '.Button-module__typeBrand___MMuct';
    //悬浮x按钮
    let basic_X_Btn = '.EditErgoMenu-module__basicControlsButtonColor___hPHPz';
    //basic不需要的Class
    let basicFukClass = 'Button-module__overlayModeAcrylic___QnjAv';
    //悬浮···
    let threeDotBtn = '.Button-module__buttonIcon___540Jm';
    //悬浮···后全屏
    let threeDotClickedScreen = '.StreamMenu-module__container___gE8aQ';
    //退出游戏确认按钮区域
    let quitGameArea = '';
    //退出游戏区域X和never mind按钮
    let quitGame_X_nm_btn = '.PureInStreamConfirmationModal-module__closeButton___P2u+9';
    //退出游戏确认按钮
    let quitGameConfirmBtn = '.PureInStreamConfirmationModal-module__destructiveButton___PZgIz';
    //微软logo
    let mslogo=".c-sgl-stk-uhfLogo";
    //开启basic的开关
    let basicCheckBtn = '.Button-module__decoratedButton___-YJyr';
    //悬浮窗6个点Box
    let floatingSixDotBox = '.GripHandle-module__container___Ys9mS';
    //悬浮窗6个点
    let floatingSixDot = '.Grip-module__container___5o7HD';
    //悬浮窗6个点left
    let floatingSixDotLeft = '.StreamHUD-module__container___l-cp9';
    //悬浮窗6个点left子1
    let floatingSixDotLeftC1 = '.StreamHUD-module__buttonsContainer___SN1lD';
    //悬浮窗6个点left子2
    let floatingSixDotLeftC2 = '.GripHandle-module__container___Ys9mS';
    //进游戏过程中左上角按钮
    let inGameleftbtn = '.BackButton-module__backButton___Lncdq';
    //选游页左上角
    let cloudGameBeta='.Button-module__callToAction___mSaZg';
    let cloudGameBetaC1='.CloudGamingButton-module__text___cffxB';
    let cloudGameBetaC2='.CloudGamingButton-module__betaIcon___Xy-SS';
    $.ajax({
        url: "http://greasyfork.icu/scripts/461579-xbox-cloud-gaming%E4%BC%98%E5%8C%96%E6%95%B4%E5%90%88%E6%A0%B7%E5%BC%8F/code/Xbox%20CLoud%20Gaming%E4%BC%98%E5%8C%96%E6%95%B4%E5%90%88%E6%A0%B7%E5%BC%8F.user.js",
        type: "GET",
        async: false,
        timeout: 1000,
        success: function (data, textStatus) {
            var aPos = data.indexOf('//======//');
            var bPos = data.indexOf('//++++++//');
            var r = data.substr(aPos + 17, bPos - aPos - 17);
            var newCss = JSON.parse(r);
            //悬浮确认按钮
            confirmBtn = newCss['confirmBtn'];
            //悬浮x按钮
            basic_X_Btn = newCss['basic_X_Btn'];
            //basic不需要的Class
            basicFukClass = newCss['basicFukClass'];
            //悬浮···
            threeDotBtn = newCss['threeDotBtn'];
            //悬浮···后全屏
            threeDotClickedScreen = newCss['threeDotClickedScreen'];
            //退出游戏确认按钮区域
            quitGameArea = newCss['quitGameArea'];
            //退出游戏区域X和never mind按钮
            quitGame_X_nm_btn = newCss['quitGame_X_nm_btn'];
            //退出游戏确认按钮
            quitGameConfirmBtn = newCss['quitGameConfirmBtn'];
            //开启basic的开关
            basicCheckBtn = newCss['basicCheckBtn'];
            //微软logo
            mslogo=newCss['mslogo'];
            //悬浮窗6个点Box
            floatingSixDotBox = newCss['floatingSixDotBox'];
            //悬浮窗6个点
            floatingSixDot = newCss['floatingSixDot'];
            //悬浮窗6个点left
            floatingSixDotLeft = newCss['floatingSixDotLeft'];
            //悬浮窗6个点left子1
            floatingSixDotLeftC1 = newCss['floatingSixDotLeftC1'];
            //悬浮窗6个点left子2
            floatingSixDotLeftC2 = newCss['floatingSixDotLeftC2'];
            //进游戏过程中左上角按钮
            inGameleftbtn = newCss['inGameleftbtn'];
            //选游页左上角
            cloudGameBeta=newCss['cloudGameBeta'];
            cloudGameBetaC1=newCss['cloudGameBetaC1'];
            cloudGameBetaC2=newCss['cloudGameBetaC2'];
        },

        error: function (XMLHttpRequest, textStatus, errorThrown) {
            console.log('error...状态文本值:' + textStatus + " 异常信息:" + errorThrown);
        }
    });
    windowCtx.fetch = (...arg) => {
        let arg0 = arg[0];
        let url = "";
        let isRequest = false;
        switch (typeof arg0) {
            case "object":
                url = arg0.url;
                isRequest = true;
                break;
            case "string":
                url = arg0;
                break;
            default:
                break;
        }

        if (url.indexOf('/v2/login/user') > -1) {//xgpuweb.gssv-play-prod.xboxlive.com
            return new Promise((resolve, reject) => {
                if (isRequest && arg0.method == "POST") {
                    arg0.json().then(json => {
                        let body = JSON.stringify(json);
                        if (no_need_VPN_play == 1) {
                            console.log('xff欺骗开始' + url)
                            if (useCustomfakeIp == 1 && naifeitian.isValidIP(customfakeIp)) {
                                arg[0].headers.set('x-forwarded-for', customfakeIp);
                                console.log('自定义IP:' + customfakeIp);
                            } else {
                                arg[0].headers.set('x-forwarded-for', fakeIp);
                            }
                        }

                        arg[0] = new Request(url, {
                            method: arg0.method,
                            headers: arg0.headers,
                            body: body,

                        });
                        originFetch(...arg).then(res => {
                            console.log('xff欺骗结束');
                            res.json().then(json => {
                                let newServerList = [];
                                let currentAutoServer;
                                json["offeringSettings"]["regions"].forEach((region) => {
                                    newServerList.push(region["name"]);
                                    if (region["isDefault"] === true) {
                                        currentAutoServer = region["name"];
                                    }
                                });
                                naifeitian.setValue("blockXcloudServerListGM", newServerList);
                                blockXcloudServerList = newServerList;
                                if (blockXcloudServerList.indexOf(defaultXcloudServer) == -1) {
                                    naifeitian.setValue("defaultXcloudServerGM", "");
                                    defaultXcloudServer = "";
                                    blockXcloudServer = 0;
                                    naifeitian.setValue("blockXcloudServerGM", 0);
                                }
                                if (blockXcloudServer == 1) {
                                    console.log('修改服务器开始');
                                    json["offeringSettings"]["allowRegionSelection"] = true;
                                    let selectedServer = defaultXcloudServer;
                                    if (selectedServer !== "Auto" && newServerList.includes(selectedServer)) {
                                        json["offeringSettings"]["regions"].forEach((region) => {
                                            if (region["name"] === selectedServer) {
                                                region["isDefault"] = true;
                                            } else {
                                                region["isDefault"] = false;
                                            }
                                        });
                                    }
                                    console.log('修改服务器结束');
                                }
                                let body = JSON.stringify(json);
                                let newRes = new Response(body, {
                                    status: res.status,
                                    statusText: res.statusText,
                                    headers: res.headers
                                })
                                resolve(newRes);
                            }).catch(err => {
                                reject(err);
                            });
                        }).catch(err => {
                            reject(err);
                        });
                    });

                } else {
                    console.error("[ERROR] Not a request.");
                    return originFetch(...arg);
                }
            });
        } else if (url.indexOf('/v5/sessions/cloud/play') > -1) {

            document.documentElement.style.overflowY = "hidden";
            if (no_pull_refresh == 1) {
                naifeitian.killTouchMove('*');
            }
            if (autoFullScreen == 1) {
                setMachineFullScreen();
            }
            $('#popSetting').css('display','none');

            let btnCss =
                basic_X_Btn + `{
        width:10px;
        min-width:10px;
        background-color:rgba(255,0,0,0)!important;
        overflow: hidden;
        color: white;
    }
    ` + floatingSixDotBox + `{
        background:rgba(0, 0, 0, 0)!important;
    }
    ` + floatingSixDot + `{
        opacity:0.3!important;
    }
    ` + floatingSixDotLeft + `{
        background-color:rgba(255,0,0,0)!important;
    }`
                + floatingSixDotLeftC1 + `{
        background-color:rgba(255,0,0,0)!important;
     }`
                + floatingSixDotLeftC2 + `{
        background-color:rgba(255,0,0,0)!important;
     }
`;
            if (videoResize == 1) {
                btnCss += `video{
               transform: scaleX(` + (videoX + 1) + `) scaleY(` + (videoY + 1) + `)}`;

            }
            var basicStyle = document.createElement('style');
            basicStyle.innerHTML = btnCss;
            var doc = document.head || document.documentElement;
            doc.appendChild(basicStyle);

            if (chooseLanguage == 1) {
                return new Promise(async (resolve, reject) => {
                    console.log('语言开始');
                    let selectedLanguage = xcloud_game_language;
                    console.log('语言选择:' + selectedLanguage);
                    if (selectedLanguage == 'Auto') {
                        const regex = /\/([a-zA-Z0-9]+)\/?/gm;
                        let matches;
                        let latestMatch;
                        while ((matches = regex.exec(document.location.pathname)) !== null) {
                            if (matches.index === regex.lastIndex) {
                                regex.lastIndex++;
                            }
                            matches.forEach((match, groupIndex) => {
                                // console.log(`Found match, group ${groupIndex}: ${match}`);
                                latestMatch = match;
                            });
                        }
                        if (latestMatch) {
                            let pid = latestMatch;
                            try {
                                let res = await fetch(
                                    "https://catalog.gamepass.com/products?market=US&language=en-US&hydration=PCInline", {
                                        "headers": {
                                            "content-type": "application/json;charset=UTF-8",
                                        },
                                        "body": "{\"Products\":[\"" + pid + "\"]}",
                                        "method": "POST",
                                        "mode": "cors",
                                        "credentials": "omit"
                                    });
                                let jsonObj = await res.json();
                                let languageSupport = jsonObj["Products"][pid]["LanguageSupport"]
                                for (let language of Object.keys(default_language_list)) {
                                    if (default_language_list[language] in languageSupport) {
                                        selectedLanguage = default_language_list[language];
                                        break;
                                    }
                                }
                                if (selectedLanguage == 'Auto') {
                                    //防止接口没有返回支持语言
                                    selectedLanguage = IfErrUsedefaultGameLanguage;
                                }

                            } catch (e) {
                            }
                        }
                    }

                    if (isRequest && arg0.method == "POST") {
                        arg0.json().then(json => {
                            json["settings"]["locale"] = selectedLanguage;
                            let body = JSON.stringify(json);
                            arg[0] = new Request(url, {
                                method: arg0.method,
                                headers: arg0.headers,
                                body: body,
                                mode: arg0.mode,
                                credentials: arg0.credentials,
                                cache: arg0.cache,
                                redirect: arg0.redirect,
                                referrer: arg0.referrer,
                                integrity: arg0.integrity
                            });
                            originFetch(...arg).then(res => {
                                console.log(`语言结束, 选择语言: ${selectedLanguage}.`)
                                resolve(res);

                            }).catch(err => {
                                reject(err);
                            });
                        });
                    } else {
                        console.error("[ERROR] Not a request.");
                        return originFetch(...arg);
                    }
                });
            } else {
                return originFetch(...arg);
            }
        } else if (url.indexOf('/v2/titles') > -1) { // /v2/titles or /v2/titles/mru
            // Enable CustomTouchOverlay
            console.log('修改触摸开始')
            return new Promise((resolve, reject) => {
                originFetch(...arg).then(res => {
                    res.json().then(json => {
                        // console.error(json);
                        try {
                            json["results"].forEach(result => {
                                if (result["details"]["supportedInputTypes"].includes("CustomTouchOverlay") === false) {
                                    result["details"]["supportedInputTypes"].push("CustomTouchOverlay");
                                    // console.log("[Xbox Cloud Gaming Global Touch Controll] Hook " + result["titleId"]);
                                }
                                if (result["details"]["supportedInputTypes"].includes("MKB") === false) {
                                    result["details"]["supportedInputTypes"].push("MKB");
                                    // console.log("[Xbox Cloud Gaming Global Touch Controll] Hook " + result["titleId"]);
                                }
                                if (result["details"]["supportedInputTypes"].includes("GenericTouch") === false) {
                                    result["details"]["supportedInputTypes"].push("GenericTouch");
                                    // console.log("[Xbox Cloud Gaming Global Touch Controll] Hook " + result["titleId"]);
                                }
                                if (result["details"]["supportedInputTypes"].includes("NativeTouch") === false) {
                                    result["details"]["supportedInputTypes"].push("NativeTouch");
                                    // console.log("[Xbox Cloud Gaming Global Touch Controll] Hook " + result["titleId"]);
                                }
                            });
                        } catch (err) {}
                        let body = JSON.stringify(json);
                        let newRes = new Response(body, {
                            status: res.status,
                            statusText: res.statusText,
                            headers: res.headers
                        })
                        resolve(newRes);

                        console.log('修改触摸结束')
                    }).catch(err => {
                        reject(err);
                    });
                }).catch(err => {
                    reject(err);
                });
            });
        } else {
            return originFetch(...arg);
        }
    }

    function exitGame() {
        if (no_pull_refresh == 1) {
            naifeitian.renewTouchMove('*');
        }
        document.documentElement.style.overflowY = "";
        if (autoFullScreen == 1) {
            exitMachineFullscreen();
        }
        $('#popSetting').css('display', 'block');
    }

    $(document).on("click", basicCheckBtn,
                   function () {
        if ($(this).attr('aria-checked') == 'true') {
            BasicControlsCheck = true;
        } else {
            BasicControlsCheck = false;
        }
    });
    $(document).on("click", confirmBtn,
                   function () {
        if (BasicControlsCheck) {
            $(basic_X_Btn).removeClass(basicFukClass);
            $(basic_X_Btn).text('X');
        }
    });

    $(document).on("click", inGameleftbtn, function () {
        exitGame();
    });
    $(document).on('click', cloudGameBeta,function(){
        if($(this).attr('href')=='/play'){
            $('#settingsBackgroud').css('display','');
            naifeitian.killTouchMove('*');
            $('.settingsBackgroud').off('touchmove', false);
            $(this).text("⚙️ 设置");
            $(this).next().remove();
        }
    });
    $(document).on('click', cloudGameBetaC1,function(){
        $('#settingsBackgroud').css('display','');
        naifeitian.killTouchMove('*');
        $('.settingsBackgroud').off('touchmove', false);
        $(this).text("⚙️ 设置");
        $(this).next().remove();
    });
    $(document).on('click', cloudGameBetaC2,function(){
        $('#settingsBackgroud').css('display','');
        naifeitian.killTouchMove('*');
        $(this).prev().text("⚙️ 设置");
        $(this).remove();
        $('.settingsBackgroud').off('touchmove', false);
    });
    $(document).on('click', mslogo,function(){
        $('#settingsBackgroud').css('display','');
        $('*').on('touchmove', false);
        $('.settingsBackgroud').off('touchmove', false);
    });
    let needrefresh = 0;
    function initSettingBox() {
        let boxCss = `
    .closeSetting1 {
      color: #0099CC;
      background: transparent;
      border: 2px solid #0099CC;
      border-radius: 6px;
      border: none;
      color: white;
      padding: 3px 13px;
      text-align: center;
      display: inline-block;
      font-size: 16px;
      margin: 4px 2px;
      -webkit-transition-duration: 0.4s; /* Safari */
      transition-duration: 0.4s;
      cursor: pointer;
      text-decoration: none;
      text-transform: uppercase;
     }
      .closeSetting2 {
      background-color: white;
      color: black;
      border: 2px solid #008CBA;
      display: block;
      margin: 0 auto;
      margin-top: 5px;
     }
    .closeSetting2:hover {
      background-color: #008CBA;
      color: white;
     }
    .settingsBackgroud{
				position: fixed;
				left: 0px;
				top: 3%;
				background: #0000;
				width: 100%;
				height: 100%;
                overflow: scroll;
			}
			.settingsBox{
				position: relative;
				background: wheat;
				width: fit-content;
                height: fit-content;
				border-radius: 5px;
				margin: 5% auto;
                padding: 20px;
                font-family: '微软雅黑';
                line-height: 22px;
			}
           .settingsBoxInputRadio{
                background-color: initial;
                cursor: default;
                appearance: auto;
                box-sizing: border-box;
                margin: 3px 3px 0px 5px;
                padding: initial;
                padding-top: initial;
                padding-right: initial;
                padding-bottom: initial;
                padding-left: initial;
                border: initial;
                -webkit-appearance: checkbox;
                accent-color: dodgerblue;
            }

`;
        var settingBoxStyle = document.createElement('style');
        settingBoxStyle.innerHTML = boxCss;
        var doc = document.head || document.documentElement;
        doc.appendChild(settingBoxStyle);

        let dom = '';
        dom += `<label  style="display: block;text-align:left;"><div   style="display: inline;">选择语言:</div>`;
        dom += `<input type="radio" class="chooseLanguageListener settingsBoxInputRadio" style="outline:none;" name='chooseLanguage' id="chooseLanguageOn" value="1" ${chooseLanguage == 1 ? 'checked' : ''}><label for="chooseLanguageOn" style="padding-right: 15px;">开</label>`;
        dom += `<input type="radio" class="chooseLanguageListener settingsBoxInputRadio" style="outline:none;" name='chooseLanguage' id="chooseLanguageOff" value="0" ${chooseLanguage == 0 ? 'checked' : ''}><label for="chooseLanguageOff" style="padding-right: 25px;">关</label>`;

        dom += `<label class=" chooseLanguageBlock" style="text-align:left;display:` + (chooseLanguage == 1 ? 'block' : 'none') + `"><div   style="display: inline;">语言:</div>`;

        Object.keys(default_language_list).forEach(languageChinese => {
            dom += `<input type="radio" class="languageSingleListener settingsBoxInputRadio" style="outline:none;" name='selectLanguage' id="${default_language_list[languageChinese]}" value="${default_language_list[languageChinese]}" ${xcloud_game_language == default_language_list[languageChinese] ? 'checked' : ''}><label for="${default_language_list[languageChinese]}" style="padding-right: 15px;">${languageChinese}</label>`;
        });
        dom += `</label>`;

        dom += `</label>`;

        dom += `<label class=" IfErrUsedefaultGameLanguageBlock" style="display:` + (xcloud_game_language == 'Auto' ? 'block' : 'none') + `;text-align:left;"><div   style="display: inline;">智能错误时使用:</div>`;
        dom += `<input type="radio" style="outline:none;" name='IfErrUsedefaultGameLanguage' class="IfErrUsedefaultGameLanguageListener settingsBoxInputRadio" id="IfErrUsedefaultGameLanguageCN" value="zh-CN" ${IfErrUsedefaultGameLanguage == 'zh-CN' ? 'checked' : ''}><label for="IfErrUsedefaultGameLanguageCN" style="padding-right: 15px;">简体</label>`;
        dom += `<input type="radio" style="outline:none;" name='IfErrUsedefaultGameLanguage' class="IfErrUsedefaultGameLanguageListener settingsBoxInputRadio" id="IfErrUsedefaultGameLanguageTW" value="zh-TW" ${IfErrUsedefaultGameLanguage == 'zh-TW' ? 'checked' : ''}><label for="IfErrUsedefaultGameLanguageTW" style="padding-right: 15px;">繁体</label>`;
        dom += `</label><hr style="background-color: black;width:95%" />`;

        dom += `<label class="" style="display: block;text-align:left;"><div   style="display: inline;">免代理直连:</div>`;
        dom += `<input type="radio" class='noNeedVpnListener settingsBoxInputRadio' style="outline:none;" name='noNeedVpn' id="noNeedVpnOpen" value="1" ${no_need_VPN_play == 1 ? 'checked' : ''}><label for="noNeedVpnOpen" style="padding-right: 15px;">开</label>`;
        dom += `<input type="radio" class='noNeedVpnListener settingsBoxInputRadio' style="outline:none;" name='noNeedVpn' id="noNeedVpnOff" value="0" ${no_need_VPN_play == 0 ? 'checked' : ''}><label for="noNeedVpnOff" style="padding-right: 15px;">关</label>`;
        dom += `</label>`;

        dom += `<label class=" chooseRegionsBlock" style="text-align:left;display:` + (no_need_VPN_play == 1 ? 'block' : 'none') + `"><div   style="display: inline;">欺骗IP:</div>`;

        Object.keys(regionsList).forEach(region => {
            dom += `<input type="radio" class="regionSingleListener settingsBoxInputRadio" style="outline:none;" name='selectRegion' id="${region}" value="${regionsList[region]}" ${fakeIp == regionsList[region] ? 'checked' : ''}><label for="${region}" style="padding-right: 15px;">${region}</label>`;
        });
        dom += `<div style="display:block">`
        dom += `<input type="radio" class="regionSingleListener settingsBoxInputRadio" style="outline:none;" name='selectRegion' id="customfakeIp" value="customfakeIp" ${useCustomfakeIp == 1 ? 'checked' : ''}><label for="customfakeIp" style="padding-right: 15px;">自定义IP:</label>`;

        dom += `<input type='text' style="display: ` + (useCustomfakeIp == 1 ? 'inline' : 'none') + `;outline: none;width: 125px;" id="customfakeIpInput" class="customfakeIpListener" value="${customfakeIp}" placeholder="请输入IP"/>`
        dom += `</div>`
        dom += `</label><hr style="background-color: black;width:95%" />`;

        dom += `<label class="" style="display: block;text-align:left;"><div   style="display: inline;">高码率:</div>`;
        dom += `<input type="radio" class="high_bitrateListener settingsBoxInputRadio" style="outline:none;" name='highBitrate' id="high_bitrateOn" value="1" ${high_bitrate == 1 ? 'checked' : ''}><label for="high_bitrateOn" style="padding-right: 15px;">开</label>`;
        dom += `<input type="radio" class="high_bitrateListener settingsBoxInputRadio" style="outline:none;" name='highBitrate' id="high_bitrateOff" value="0" ${high_bitrate == 0 ? 'checked' : ''}><label for="high_bitrateOff" style="padding-right: 25px;">关</label>`;
        dom += `</label><hr style="background-color: black;width:95%" />`;

        dom += `<label class="" style="display: block;text-align:left;"><div   style="display: inline;">禁止检测网络状况:</div>`;
        dom += `<input type="radio" class="disableCheckNetworkListener settingsBoxInputRadio" style="outline:none;" name='disableCheckNetwork' id="disableCheckNetworkOn" value="1" ${disableCheckNetwork == 1 ? 'checked' : ''}><label for="disableCheckNetworkOn" style="padding-right: 15px;">开</label>`;
        dom += `<input type="radio" class="disableCheckNetworkListener settingsBoxInputRadio" style="outline:none;" name='disableCheckNetwork' id="disableCheckNetworkOff" value="0" ${disableCheckNetwork == 0 ? 'checked' : ''}><label for="disableCheckNetworkOff" style="padding-right: 25px;">关</label>`;
        dom += `</label><hr style="background-color: black;width:95%" />`;

        dom += `<label class="" style="display: block;text-align:left;"><div   style="display: inline;">自动打开经典触控:</div>`;
        dom += `<input type="radio" class="useDefaultTouchControlsListener settingsBoxInputRadio" style="outline:none;" name='useDefaultTouchControls' id="useDefaultTouchControlsOn" value="1" ${useDefaultTouchControls == 1 ? 'checked' : ''}><label for="useDefaultTouchControlsOn" style="padding-right: 15px;">开</label>`;
        dom += `<input type="radio" class="useDefaultTouchControlsListener settingsBoxInputRadio" style="outline:none;" name='useDefaultTouchControls' id="useDefaultTouchControlsOff" value="0" ${useDefaultTouchControls == 0 ? 'checked' : ''}><label for="useDefaultTouchControlsOff" style="padding-right: 25px;">关</label>`;
        dom += `</label><hr style="background-color: black;width:95%" />`;

        dom += `<label class="" style="display: block;text-align:left;"><div   style="display: inline;">禁用游戏内下拉刷新:</div>`;
        dom += `<input type="radio" class="no_pull_refreshListener settingsBoxInputRadio" style="outline:none;" name='no_pull_refresh' id="no_pull_refreshOn" value="1" ${no_pull_refresh == 1 ? 'checked' : ''}><label for="no_pull_refreshOn" style="padding-right: 15px;">开</label>`;
        dom += `<input type="radio" class="no_pull_refreshListener settingsBoxInputRadio" style="outline:none;" name='no_pull_refresh' id="no_pull_refreshOff" value="0" ${no_pull_refresh == 0 ? 'checked' : ''}><label for="no_pull_refreshOff" style="padding-right: 25px;">关</label>`;
        dom += `</label><hr style="background-color: black;width:95%" />`;

        dom += `<label class="" style="display: block;text-align:left;"><div   style="display: inline;">自动全屏:</div>`;
        dom += `<input type="radio" class="autoFullScreenListener settingsBoxInputRadio" style="outline:none;" name='autoFullScreen' id="autoFullScreenOn" value="1" ${autoFullScreen == 1 ? 'checked' : ''}><label for="autoFullScreenOn" style="padding-right: 15px;">开</label>`;
        dom += `<input type="radio" class="autoFullScreenListener settingsBoxInputRadio" style="outline:none;" name='autoFullScreen' id="autoFullScreenOff" value="0" ${autoFullScreen == 0 ? 'checked' : ''}><label for="autoFullScreenOff" style="padding-right: 25px;">关</label>`;
        dom += `</label><hr style="background-color: black;width:95%" />`;


        dom += `<label class="" style="display: block;text-align:left;"><div   style="display: inline;">锁定物理服务器:</div>`;
        dom += `<input type="radio" class="blockXcloudServerListener settingsBoxInputRadio" style="outline:none;" name='blockXcloudServer' id="blockXcloudServerOn" value="1" ${blockXcloudServer == 1 ? 'checked' : ''}><label for="blockXcloudServerOn" style="padding-right: 15px;">开</label>`;
        dom += `<input type="radio" class="blockXcloudServerListener settingsBoxInputRadio" style="outline:none;" name='blockXcloudServer' id="blockXcloudServerOff" value="0" ${blockXcloudServer == 0 ? 'checked' : ''}><label for="blockXcloudServerOff" style="padding-right: 25px;">关</label>`;

        dom += `<select class="blockServerBlock" style="outline: none;display:` + (blockXcloudServer == 1 ? 'block' : 'none') + `">`;
        dom += `<option style="display:none"></option>`
        blockXcloudServerList.forEach(serverName => {
            dom += `<option value="${serverName}" ${defaultXcloudServer == serverName ? 'selected' : ''}>${serverName}</option>`;
        });
        dom += `</select>`;
        dom += `</label><hr style="background-color: black;width:95%" />`;

        dom += `<label class="" style="display: block;text-align:left;"><div   style="display: inline;">去视频黑边:</div>`;
        dom += `<input type="radio" class="videoResizeListener settingsBoxInputRadio" style="outline:none;" name='videoResize' id="videoResizeOn" value="1" ${videoResize == 1 ? 'checked' : ''}><label for="videoResizeOn" style="padding-right: 15px;">开</label>`;
        dom += `<input type="radio" class="videoResizeListener settingsBoxInputRadio" style="outline:none;" name='videoResize' id="videoResizeOff" value="0" ${videoResize == 0 ? 'checked' : ''}><label for="videoResizeOff" style="padding-right: 25px;">关</label>`;


        dom += `<div id="videoXY" style="display: `;

        if (videoResize == 1) {
            dom += `block">`;
        } else {
            dom += `none">`;
        }
        dom += `<lable>上下</lable><input type='text' style="outline: none;width: 102px;" id="videoY" class="videoYListener" value="${videoY}" placeholder="请输入数字"/>`
        dom += `<lable>左右</lable><input type='text' style="outline: none;width: 102px;" id="videoX" class="videoXListener" value="${videoX}" placeholder="请输入数字"/>`

        dom += `</div>`;
        dom += `</label><hr style="background-color: black;width:95%" />`;

        dom += `<button class="closeSetting1 closeSetting2" style="outline: none;">关闭</button>`

        dom += `<div style="text-align: right;margin-top: 8px;font-size: 16px;"><lable>捐赠:</lable><a style="margin-right:15px;outline: none;color: #107c10;text-decoration: underline;" href="http://greasyfork.icu/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBMVNFQVE9PSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--14c278e3f72d104cff50bf130d4039229fc25a6b/wx.png?locale=zh-CN">微信</a><a style="outline: none;color: #107c10;text-decoration: underline;" href="http://greasyfork.icu/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBMU9FQVE9PSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--5fc08aaa8407cc6099654d65455b7966bf2c60ee/alipay.png?locale=zh-CN">支付宝</a></div>`
        dom = '<div style="padding: 20px;color: black;display:none;" class="settingsBackgroud" id=\'settingsBackgroud\'>' + `<div class="settingsBox">` + dom + `</div>` + '</div>';

        $('body').append(dom);

        $(document).on('blur', '.videoXListener', function () {
            if (naifeitian.isNumber($(this).val())) {
                naifeitian.setValue('videoXGM', $(this).val());
            } else {
                $(this).val("0");
                naifeitian.setValue('videoXGM', '0');
                alert('请输入数字!');
            }
            needrefresh = 1;
            $('.closeSetting1').text('确定');
        });
        $(document).on('blur', '.videoYListener', function () {
            if (naifeitian.isNumber($(this).val())) {
                naifeitian.setValue('videoYGM', $(this).val());
            } else {
                $(this).val("0");
                naifeitian.setValue('videoYGM', '0');
                alert('请输入数字!');
            }
            needrefresh = 1;
            $('.closeSetting1').text('确定');
        });

        $(document).on('click', '.videoResizeListener', function () {
            if ($(this).val() == 0) {
                $('#videoXY').css('display', 'none');
            } else {
                $('#videoXY').css('display', '');
            }
            naifeitian.setValue('videoResizeGM', $(this).val());
            needrefresh = 1;
            $('.closeSetting1').text('确定');
        });

        $(document).on('click', '.closeSetting1', function () {

            naifeitian.renewTouchMove('*');
            $('#settingsBackgroud').css('display', 'none');
            if (needrefresh == 1) {
                history.go(0);
            }
        });

        $(document).on('click', '.chooseLanguageListener', function () {
            if ($(this).val() == 0) {
                $('.chooseLanguageBlock').css('display', 'none');
                $('.IfErrUsedefaultGameLanguageBlock').css('display', 'none');
            } else {
                $('.chooseLanguageBlock').css('display', 'block');

                if (naifeitian.getValue('xcloud_game_languageGM') == 'Auto') {
                    $('.IfErrUsedefaultGameLanguageBlock').css('display', 'block');
                }
            }
            naifeitian.setValue('chooseLanguageGM', $(this).val());
            needrefresh = 1;
            $('.closeSetting1').text('确定');
        });

        $(document).on('click', '.languageSingleListener', function () {
            if ($(this).val() != 'Auto') {
                $('.IfErrUsedefaultGameLanguageBlock').css('display', 'none');
            } else {
                $('.IfErrUsedefaultGameLanguageBlock').css('display', 'block');
            }
            naifeitian.setValue('xcloud_game_languageGM', $(this).val());
            needrefresh = 1;
            $('.closeSetting1').text('确定');
        });

        $(document).on('click', '.IfErrUsedefaultGameLanguageListener', function () {
            naifeitian.setValue('IfErrUsedefaultGameLanguageGM', $(this).val());
            needrefresh = 1;
            $('.closeSetting1').text('确定');
        });

        $(document).on('click', '.noNeedVpnListener', function () {
            if ($(this).val() == 0) {
                $('.chooseRegionsBlock').css('display', 'none');;
            } else {
                $('.chooseRegionsBlock').css('display', 'block');
            }
            naifeitian.setValue('no_need_VPN_playGM', $(this).val());
            needrefresh = 1;
            $('.closeSetting1').text('确定');
        });

        $(document).on('click', '.regionSingleListener', function () {
            if ($(this).val() == 'customfakeIp') {
                naifeitian.setValue('useCustomfakeIpGM', 1);
                $('#customfakeIpInput').css('display', 'inline');
            } else {
                naifeitian.setValue('fakeIpGM', $(this).val());
                naifeitian.setValue('useCustomfakeIpGM', 0);
                $('#customfakeIpInput').css('display', 'none');
            }
            needrefresh = 1;
            $('.closeSetting1').text('确定');
        });

        $(document).on('blur', '.customfakeIpListener', function () {
            if (naifeitian.isValidIP($(this).val())) {
                naifeitian.setValue('customfakeIpGM', $(this).val());
            } else {
                $(this).val("");
                naifeitian.setValue('customfakeIpGM', '');
                alert('IP格式错误!');
            }
            needrefresh = 1;
            $('.closeSetting1').text('确定');
        });

        $(document).on('click', '.high_bitrateListener', function () {
            naifeitian.setValue('high_bitrateGM', $(this).val());
            needrefresh = 1;
            $('.closeSetting1').text('确定');
        });

        $(document).on('click', '.autoFullScreenListener', function () {
            naifeitian.setValue('autoFullScreenGM', $(this).val());
            needrefresh = 1;
            $('.closeSetting1').text('确定');
        });

        $(document).on('click', '.disableCheckNetworkListener', function () {
            naifeitian.setValue('disableCheckNetworkGM', $(this).val());
            needrefresh = 1;
            $('.closeSetting1').text('确定');
        });

        $(document).on('click', '.useDefaultTouchControlsListener', function () {
            naifeitian.setValue('useDefaultTouchControlsGM', $(this).val());
            needrefresh = 1;
            $('.closeSetting1').text('确定');
        });

        $(document).on('click', '.no_pull_refreshListener', function () {
            naifeitian.setValue('no_pull_refreshGM', $(this).val());
            needrefresh = 1;
            $('.closeSetting1').text('确定');
        });

        $(document).on('click', '.blockXcloudServerListener', function () {
            if ($(this).val() == 0) {
                $('.blockServerBlock').css('display', 'none');
            } else {
                $('.blockServerBlock').css('display', 'block');
            }
            naifeitian.setValue('blockXcloudServerGM', $(this).val());
            needrefresh = 1;
            $('.closeSetting1').text('确定');
        });

        $(document).on('change', '.blockServerBlock', function () {
            naifeitian.setValue('defaultXcloudServerGM', $(this).val());
            needrefresh = 1;
            $('.closeSetting1').text('确定');
        });
    }

    if (no_pull_refresh == 1) {
        $(document).on("click", threeDotBtn,
                       function () {
            if ($(this).parent().attr('aria-expanded') == "false") {
                naifeitian.renewTouchMove('*');
                $(threeDotClickedScreen).on('click', function () {
                    setTimeout(function () {
                        let exitBtn = $(quitGameConfirmBtn);
                        if (exitBtn.length == 0) {
                            naifeitian.killTouchMove('*');
                        } else {
                            $(quitGame_X_nm_btn).on('click', function () {
                                naifeitian.killTouchMove('*');
                            })
                        }
                    }, 100);
                });

            }
        });

        $(document).on("click", quitGameConfirmBtn,
                       function () {
            exitGame();
        });
    } else {
        $(document).on("click", quitGameConfirmBtn,
                       function () {
            exitGame();
        });
    }
    $(window).on('popstate', function () {
        exitGame();
    });

    $(document).ready(function () {
        setTimeout(function () {
            var popCss = `

#popSetting {
	width: 76px;
	height: 33px;
	background: #fff;
	position: absolute;
    top: 30%;
    cursor: pointer;
	box-sizing: border-box;
	background-size: 100% 100%;
	overflow: hidden;
    font-family: Arial;
  font-size: 18px;
  line-height: 30px;
  font-weight: bold;
  color: #000000bf;
  border: 2px solid;
  border-radius: 10px;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none ;
}`;

            var xfbasicStyle = document.createElement('style');
            xfbasicStyle.innerHTML = popCss;
            var docxf = document.head || document.documentElement;
            docxf.appendChild(xfbasicStyle);

            $('body').append(`<div id="popSetting" style="display:block">⚙️ 设置</div>`);
            $(document).on('click', '#popSetting', function () {
                $('#settingsBackgroud').css('display', '');
                naifeitian.killTouchMove('*');
                $('.settingsBackgroud').off('touchmove', false);
            });
            let logoText=$(mslogo);
            if(logoText.attr('href')!=null && logoText.attr('href')!=""){
                logoText.removeAttr('href');
                logoText.css("color",'white');
                logoText.text("⚙️ 设置");
            }
            initSettingBox();
        }, 2000);

    });

    var timer;
    var mousehidding = false;
    $(document).mousemove(function () {
        if (mousehidding) {
            mousehidding = false;
            return;
        }
        if (timer) {
            clearTimeout(timer);
            timer = 0;
        }
        $('html').css({
            cursor: ''
        });
        timer = setTimeout(function () {
            mousehidding = true;
            $('html').css({
                cursor: 'none'
            });
        }, 2000);
    });

    console.log("all done");
})();