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

    @@ -4,49 +4,47 @@ * @private */ javascript:(function(){ - /* 1. すでにパッチが適用されている場合は二重適用を防ぐ */ - if (window._keyboardStraightPatchApplied) { - alert('パッチはすでに適用されています。'); - return; - } - - /* 2. 入力送信関数をフック(上書き)する */ + /* 1. client-network.js の本当の送信関数を上書き */ if (typeof sendInput === 'function') { - const originalSendInput = window.sendInput; - window.sendInput = function(angle) { - let fixedAngle = angle; + window.sendInput = function() { + if (!socket || socket.readyState !== WebSocket.OPEN) return; + if (!isGameReady || myId === null) return; - /* キーボードが押されているかチェック(client-game.jsのkeysオブジェクトを参照) */ + /* 基本はゲームが持っている現在の角度を使う */ + let angle = inputAngle; + + /* キーボードの入力状態をチェック */ if (typeof keys !== 'undefined') { const up = keys['ArrowUp'] || keys['KeyW']; const down = keys['ArrowDown'] || keys['KeyS']; const left = keys['ArrowLeft'] || keys['KeyA']; const right = keys['ArrowRight'] || keys['KeyD']; - /* 【ここが魔改造】 */ - /* 左右が押されておらず、縦だけが押されている時(純粋な縦移動) */ + /* 左右が押されておらず、縦移動だけのとき */ if (!left && !right) { if (up) { - /* 真上(本来は -Math.PI / 2) */ - /* サーバーが1バイト(0〜254)に変換した時に、ピッタリ「63」または「64」になって */ - /* 逆変換(復元)した時にも完全に真上を向く「魔法の角度」に固定します */ - fixedAngle = -1.5587186118408203; + /* 1バイト変換した時にピッタリ「63」(真上に一番近い整数)になる魔法の角度 */ + angle = ((63 / 254) * Math.PI * 2) - Math.PI; } else if (down) { - /* 真下(本来は Math.PI / 2) */ - /* 逆変換時にピッタリ真下を向く「魔法の角度」に固定します */ - fixedAngle = 1.5587186118408203; + /* 1バイト変換した時にピッタリ「191」(真下に一番近い整数)になる魔法の角度 */ + angle = ((191 / 254) * Math.PI * 2) - Math.PI; } } } + + /* ゲーム本来の「1バイト圧縮処理」を実行 */ + let encodedAngle = Math.round(((angle + Math.PI) / (Math.PI * 2)) * 254); - /* 補正した角度(マウス時はそのまま)で元の送信関数を呼び出す */ - originalSendInput(fixedAngle); + /* 1バイトのバイナリデータを作成して送信 */ + const buffer = new ArrayBuffer(1); + const view = new DataView(buffer); + view.setUint8(0, encodedAngle); + socket.send(buffer); }; - window._keyboardStraightPatchApplied = true; - alert('【キーボード直進化パッチ】\n縦移動時の1バイト変換誤差を先読み補正し、完全直進を可能にしました!'); + alert('【通信軸・完全直進パッチ】\n送信直前のデータを直接補正するようにしました!今度こそ一切ズレません!'); } else { - alert('エラー: sendInput 関数が見つかりませんでした。ゲーム画面で実行してください。'); + alert('エラー: sendInput関数が見つかりません。ゲーム画面で実行してください。'); } })();
  • /*
     * @title キーボード縦移動修正
     * @description キーボード縦移動時にちゃんとまっすぐになるぞ!
     * @private
     */
    javascript:(function(){
        /* 1. client-network.js の本当の送信関数を上書き */
        if (typeof sendInput === 'function') {
            
            window.sendInput = function() {
                if (!socket || socket.readyState !== WebSocket.OPEN) return;
                if (!isGameReady || myId === null) return;
    
                /* 基本はゲームが持っている現在の角度を使う */
                let angle = inputAngle; 
    
                /* キーボードの入力状態をチェック */
                if (typeof keys !== 'undefined') {
                    const up = keys['ArrowUp'] || keys['KeyW'];
                    const down = keys['ArrowDown'] || keys['KeyS'];
                    const left = keys['ArrowLeft'] || keys['KeyA'];
                    const right = keys['ArrowRight'] || keys['KeyD'];
    
                    /* 左右が押されておらず、縦移動だけのとき */
                    if (!left && !right) {
                        if (up) {
                            /* 1バイト変換した時にピッタリ「63」(真上に一番近い整数)になる魔法の角度 */
                            angle = ((63 / 254) * Math.PI * 2) - Math.PI;
                        } else if (down) {
                            /* 1バイト変換した時にピッタリ「191」(真下に一番近い整数)になる魔法の角度 */
                            angle = ((191 / 254) * Math.PI * 2) - Math.PI;
                        }
                    }
                }
    
                /* ゲーム本来の「1バイト圧縮処理」を実行 */
                let encodedAngle = Math.round(((angle + Math.PI) / (Math.PI * 2)) * 254);
                
                /* 1バイトのバイナリデータを作成して送信 */
                const buffer = new ArrayBuffer(1);
                const view = new DataView(buffer);
                view.setUint8(0, encodedAngle);
                socket.send(buffer);
            };
    
            alert('【通信軸・完全直進パッチ】\n送信直前のデータを直接補正するようにしました!今度こそ一切ズレません!');
        } else {
            alert('エラー: sendInput関数が見つかりません。ゲーム画面で実行してください。');
        }
    })();
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。