TuxunNoCar

Redacts the car from tuxun, the Chinese geoguessr. Shift-K to toggle compass. Transplanted from GeoNoCar by 2020, drparse. Referenced kakageo's Tuxun Replayer plugin.

// ==UserScript==
// @name     TuxunNoCar
// @name:zh-CN   图寻-隐藏街景车和指南针
// @description  Redacts the car from tuxun, the Chinese geoguessr. Shift-K to toggle compass. Transplanted from GeoNoCar by 2020, drparse. Referenced kakageo's Tuxun Replayer plugin.
// @description:zh-CN 去除图寻街景车。使用Shift+K切换指南针。移植自GeoNoCar by 2020, drparse。参考了Tuxun Replayer, kakageo。
// @namespace    https://tuxun.fun/
// @version      0.1.8
// @author       strombooli
// @match        https://tuxun.fun/*
// @match        https://tuxun.fun/world-match
// @match        https://tuxun.fun/china-match
// @match        https://tuxun.fun/solo/*
// @match        https://tuxun.fun/map/*
// @match        https://tuxun.fun/party
// @match        https://tuxun.fun/party/*
// @exclude      https://tuxun.fun/challenge/*
// @exclude      https://tuxun.fun/replay-pano?*
// @exclude      https://tuxun.fun/wonders
// @exclude      https://tuxun.fun/random
// @grant    unsafeWindow
// @run-at       document-start
// @license      GPL-3.0-or-later; http://www.gnu.org/licenses/gpl-3.0.txt
// @noframes
// ==/UserScript==

(function() {
    'use strict';

    function injected() {
    const OPTIONS = {
        colorR: 0.5,
        colorG: 0.5,
        colorB: 0.5,
        colorRS: 0,
        colorGS: 0,
        colorBS: 0,
    };

    // If the script breaks, search devtools for "BINTULU" and replace these lines with the new one
    const vertexOld = "const float f=3.1415926;varying vec3 a;uniform vec4 b;attribute vec3 c;attribute vec2 d;uniform mat4 e;void main(){vec4 g=vec4(c,1);gl_Position=e*g;a=vec3(d.xy*b.xy+b.zw,1);a*=length(c);}";
    const fragOld = "precision highp float;const float h=3.1415926;varying vec3 a;uniform vec4 b;uniform float f;uniform sampler2D g;void main(){vec4 i=vec4(texture2DProj(g,a).rgb,f);gl_FragColor=i;}";

    const vertexNew = `
const float f=3.1415926;
varying vec3 a;
varying vec3 potato;
uniform vec4 b;
attribute vec3 c;
attribute vec2 d;
uniform mat4 e;
void main(){
    vec4 g=vec4(c,1);
    gl_Position=e*g;
    a = vec3(d.xy * b.xy + b.zw,1);
    a *= length(c);

    potato = vec3(d.xy, 1.0) * length(c);
}`;
    const fragNewBaidu = `precision highp float;
const float h=3.1415926;
varying vec3 a;
varying vec3 potato;
uniform vec4 b;
uniform float f;
uniform sampler2D g;
void main(){

vec2 aD = potato.xy / a.z;
float thetaD = aD.y;

float thresholdD1 = 0.61;
float thresholdD2 = 0.61;

float x = aD.x;
float y = abs(4.0*x - 2.0);
float phiD = smoothstep(0.0, 1.0, y > 1.0 ? 2.0 - y : y);

vec4 i = vec4(
  thetaD > mix(thresholdD1, thresholdD2, phiD)
  ? vec3(float(${OPTIONS.colorR}), float(${OPTIONS.colorG}), float(${OPTIONS.colorB})) // texture2DProj(g,a).rgb * 0.25
  : texture2DProj(g,a).rgb
,f);
gl_FragColor=i;
}`;

    const fragNew = `precision highp float;
const float h=3.1415926;
varying vec3 a;
varying vec3 potato;
uniform vec4 b;
uniform float f;
uniform sampler2D g;
void main(){

vec2 aD = potato.xy / a.z;
float thetaD = aD.y;

float thresholdD1 = 0.6;
float thresholdD2 = 0.7;

float x = aD.x;
float y = abs(4.0*x - 2.0);
float phiD = smoothstep(0.0, 1.0, y > 1.0 ? 2.0 - y : y);

vec4 i = vec4(
  thetaD > mix(thresholdD1, thresholdD2, phiD)
  ? vec3(float(${OPTIONS.colorR}), float(${OPTIONS.colorG}), float(${OPTIONS.colorB})) // texture2DProj(g,a).rgb * 0.25
  : texture2DProj(g,a).rgb
,f);
gl_FragColor=i;
}`;

            const fragNewBaiduNew = `precision highp float;
const float h=3.1415926;
varying vec3 a;
varying vec3 potato;
uniform vec4 b;
uniform float f;
uniform sampler2D g;
void main(){

vec2 aD = potato.xy / a.z;
float thetaD = aD.y;

float thresholdD1 = 0.6;
float thresholdD2 = 0.7;

float thresholdD1S = 0.8;
float thresholdD2S = 0.9;

float x = aD.x;
float y = abs(4.0*x - 2.0);
float phiD = smoothstep(1.0, 0.0, y > 1.0 ? 2.0 - y : y);

vec4 i = vec4(
  thetaD > mix(thresholdD1, thresholdD2, phiD)
  ? (thetaD > mix(thresholdD1S, thresholdD2S, phiD) ? vec3(float(${OPTIONS.colorRS}), float(${OPTIONS.colorGS}), float(${OPTIONS.colorBS})) : vec3(float(${OPTIONS.colorR}), float(${OPTIONS.colorG}), float(${OPTIONS.colorB})))
  : texture2DProj(g,a).rgb
,f);
gl_FragColor=i;
}`;
    let streetViewPanorama, isBaiduP = false;
    //let tryInit = setInterval(function(){
    //    const streetViewContainer = document.getElementById('viewer');
    //    if (streetViewContainer){
    //        const keys = Object.keys(streetViewContainer);
    //        const key = keys.find(key => key.startsWith("__reactFiber"));
    //        const props = streetViewContainer[key];
    //        streetViewPanorama = props.return.child.memoizedProps.children[1].props.googleMapInstance;
    //        if (streetViewPanorama) {
    //            streetViewPanorama.addListener('position_changed', () => {
    //                // console.log(streetViewPanorama.getPano());
    //                // console.log(/^[A-Z0-9]{27}$/.test(streetViewPanorama.getPano()));
    //                if (/^[A-Z0-9]{27}$/.test(streetViewPanorama.getPano())) {
    //                    isBaiduP = true;
    //                }
    //            });
    //            clearInterval(tryInit);
    //        }
    //    }
    //}, 100);

    var _send = XMLHttpRequest.prototype.send;
    XMLHttpRequest.prototype.send = function(value) {
        this.addEventListener('load', function() {
            if (this.responseURL && this.responseURL.includes('https://tuxun.fun/api/v0/tuxun/mapProxy/getPanoInfo?pano=') && this.responseURL.length == 84) {
                isBaiduP = true;
            }
        }, false);
        _send.call(this, value);
    };


    function installShaderSource(ctx) {
        const g = ctx.shaderSource;
        function shaderSource() {
            if (typeof arguments[1] === 'string') {
                let glsl = arguments[1];
                //console.log('BINTULU shader', glsl);

                if (glsl === vertexOld) glsl = vertexNew;
                else if (glsl === fragOld){
                    if (isBaiduP) glsl = fragNewBaiduNew;
                    else glsl = fragNew;
                }
                return g.call(this, arguments[0], glsl);
            }
            return g.apply(this, arguments);
        }
        shaderSource.bestcity = 'bintulu';
        ctx.shaderSource = shaderSource;
    }
    function installGetContext(el) {
        const g = el.getContext;
        el.getContext = function() {
        if (arguments[0] === 'webgl' || arguments[0] === 'webgl2') {
            const ctx = g.apply(this, arguments);
            if (ctx && ctx.shaderSource && ctx.shaderSource.bestcity !== 'bintulu') {
                installShaderSource(ctx);
            }
            return ctx;
        }
        return g.apply(this, arguments);
        };
    }
    const f = document.createElement;
    document.createElement = function() {
        if (arguments[0] === 'canvas' || arguments[0] === 'CANVAS') {
            const el = f.apply(this, arguments);
            installGetContext(el);
            return el;
        }
        return f.apply(this, arguments);
    };
    function addCompassStyle() {
        let style = document.createElement('style');
        style.id = 'bintulu_nocompass';
        style.innerHTML = '.gmnoprint.gm-bundled-control.gm-bundled-control-on-bottom { display: none }';
        document.head.appendChild(style);
    }
    addCompassStyle();
    document.addEventListener('keydown', (evt) => {
        if (!evt.repeat && evt.code === 'KeyK' && evt.shiftKey && !evt.altKey && !evt.ctrlKey && !evt.metaKey) {
        let style = document.getElementById('bintulu_nocompass');
        if (!style) {
            addCompassStyle();
        } else {
            style.remove();
        }
        }
    });
    }

    unsafeWindow.eval(`(${injected.toString()})()`);

})();