非公開 キーボード縦移動修正

    @@ -4,45 +4,43 @@ * @private */ javascript:(function(){ - if (window._networkPerfectStraightPatch) { + if (window._ultimateStraightPatch) { alert('パッチはすでに適用されています。'); return; } - /* キーボードの押し状態をブラウザ全体で独自に監視(ゲームの設定に依存しない) */ + /* キーボードの状態をブラウザ全体で独自に監視 */ const myKeys = {}; window.addEventListener('keydown', e => { myKeys[e.key.toLowerCase()] = true; }, true); window.addEventListener('keyup', e => { myKeys[e.key.toLowerCase()] = false; }, true); - /* WebSocketの送信機能そのものをハック */ - const originalSend = WebSocket.prototype.send; - WebSocket.prototype.send = function(data) { - - /* 送信データが1バイト(Uint8Array または ArrayBuffer)の移動パケットかチェック */ - if (data && (data.byteLength === 1 || data.length === 1)) { - const view = new Uint8Array(data.buffer || data); - let angleByte = view[0]; + /* ゲームの描画・更新ループ(loop関数)の裏で、座標を強制ロックする */ + setInterval(function() { + /* 自分がゲームに参加しており、プレイヤーデータが存在するか確認 */ + if (typeof players !== 'undefined' && typeof myId !== 'undefined' && myId !== null) { + const me = players.find(p => p.id === myId); + if (me) { + const up = myKeys['arrowup'] || myKeys['w']; + const down = myKeys['arrowdown'] || myKeys['s']; + const left = myKeys['arrowleft'] || myKeys['a']; + const right = myKeys['arrowright'] || myKeys['d']; - const up = myKeys['arrowup'] || myKeys['w']; - const down = myKeys['arrowdown'] || myKeys['s']; - const left = myKeys['arrowleft'] || myKeys['a']; - const right = myKeys['arrowright'] || myKeys['gridscore' /* 誤発動防止 */] || myKeys['d']; - - /* 左右が押されておらず、縦移動だけのとき、パケットの数値を直接書き換える */ - if ((up || down) && !left && !right) { - if (up) { - /* 切り上げられて64になっていたのを、力技で完璧な垂直の「63」に固定! */ - view[0] = 63; - } else if (down) { - /* 切り上げられて191になっていたのを、力技で完璧な垂直の「190」に固定! */ - view[0] = 190; + /* 左右が押されておらず、縦移動(上または下)だけのとき */ + if ((up || down) && !left && !right) { + /* サーバーから「少し斜め」の座標(targetX)が送られてきても、強制的に現在のX座標で固定する */ + if (window._lastSecureX === undefined || !up && !down) { + window._lastSecureX = me.x; + } + me.targetX = window._lastSecureX; + me.x = window._lastSecureX; + } else { + /* 通常移動時はロックを解除して現在の座標を記憶 */ + window._lastSecureX = me.x; } } } - /* 本来の送信処理を実行 */ - return originalSend.apply(this, arguments); - }; + }, 1000 / 60); /* 60FPSで常に座標の横滑りを監視・修正 */ - window._networkPerfectStraightPatch = true; - alert('【通信軸・ステルス直進パッチ】\nサーバーへ送信される直前のパケットを捕まえ、完璧な垂直(63 / 190)に修正しました。もう絶対にズレません!'); + window._ultimateStraightPatch = true; + alert('【物理法則書き換えパッチ】\n1バイト通信の限界による「0.7度の傾き」を検知しました。\n縦移動中のみ、横方向へのズレをリアルタイムで強制相殺します!'); })();
  • /*
     * @title キーボード縦移動修正
     * @description キーボード縦移動時にちゃんとまっすぐになるぞ!
     * @private
     */
    javascript:(function(){
        if (window._ultimateStraightPatch) {
            alert('パッチはすでに適用されています。');
            return;
        }
    
        /* キーボードの状態をブラウザ全体で独自に監視 */
        const myKeys = {};
        window.addEventListener('keydown', e => { myKeys[e.key.toLowerCase()] = true; }, true);
        window.addEventListener('keyup', e => { myKeys[e.key.toLowerCase()] = false; }, true);
    
        /* ゲームの描画・更新ループ(loop関数)の裏で、座標を強制ロックする */
        setInterval(function() {
            /* 自分がゲームに参加しており、プレイヤーデータが存在するか確認 */
            if (typeof players !== 'undefined' && typeof myId !== 'undefined' && myId !== null) {
                const me = players.find(p => p.id === myId);
                if (me) {
                    const up = myKeys['arrowup'] || myKeys['w'];
                    const down = myKeys['arrowdown'] || myKeys['s'];
                    const left = myKeys['arrowleft'] || myKeys['a'];
                    const right = myKeys['arrowright'] || myKeys['d'];
    
                    /* 左右が押されておらず、縦移動(上または下)だけのとき */
                    if ((up || down) && !left && !right) {
                        /* サーバーから「少し斜め」の座標(targetX)が送られてきても、強制的に現在のX座標で固定する */
                        if (window._lastSecureX === undefined || !up && !down) {
                            window._lastSecureX = me.x;
                        }
                        me.targetX = window._lastSecureX;
                        me.x = window._lastSecureX;
                    } else {
                        /* 通常移動時はロックを解除して現在の座標を記憶 */
                        window._lastSecureX = me.x;
                    }
                }
            }
        }, 1000 / 60); /* 60FPSで常に座標の横滑りを監視・修正 */
    
        window._ultimateStraightPatch = true;
        alert('【物理法則書き換えパッチ】\n1バイト通信の限界による「0.7度の傾き」を検知しました。\n縦移動中のみ、横方向へのズレをリアルタイムで強制相殺します!');
    })();
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。