Nekoking Client! 1.1

Enhanced customization for Poxel.io with RAVE, CHAOS, crosshair, color mod, ad remover, and more. (No Resolution Scale)

// ==UserScript==
// @name         Nekoking Client! 1.1
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  Enhanced customization for Poxel.io with RAVE, CHAOS, crosshair, color mod, ad remover, and more. (No Resolution Scale)
// @author       Nekoking!
// @match        *://poxel.io/*
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    // ---------- スタイル追加 ----------
    const style = document.createElement('style');
    style.textContent = `
        #gear-button {
            position: fixed;
            top: 50%;
            left: 0;
            transform: translateY(-50%);
            background-color: #222;
            padding: 10px;
            border-radius: 0 10px 10px 0;
            color: white;
            cursor: pointer;
            z-index: 9999;
            font-size: 20px;
        }
        #settings-panel {
            position: fixed;
            top: 50%;
            left: 50px;
            transform: translateY(-50%);
            background: rgba(0, 0, 0, 0.9);
            padding: 15px;
            color: white;
            border-radius: 10px;
            z-index: 9999;
            display: none;
            min-width: 250px;
        }
        .section {
            margin-bottom: 10px;
            border-bottom: 1px solid #555;
            padding-bottom: 10px;
        }
        .section:last-child {
            border-bottom: none;
        }
        label {
            display: block;
            margin: 4px 0;
        }
        .subpanel {
            margin-top: 8px;
            padding-left: 10px;
        }
        .slider {
            width: 100%;
        }
        #crosshair {
            position: fixed;
            z-index: 9998;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            pointer-events: none;
        }
        #rave-overlay, #color-overlay, #chaos-overlay {
            position: fixed;
            top: 0; left: 0;
            width: 100vw;
            height: 100vh;
            z-index: 9990;
            pointer-events: none;
        }
        #rave-overlay {
            background: linear-gradient(45deg, red, orange, yellow, green, blue, indigo, violet);
            mix-blend-mode: screen;
            opacity: 0.8;
            animation: rave 1s linear infinite;
            display: none;
        }
        #chaos-overlay {
            background: black;
            mix-blend-mode: difference;
            animation: chaos 0.3s infinite;
            display: none;
        }
        #color-overlay {
            background-color: rgba(255,0,0,0.2);
            mix-blend-mode: multiply;
            display: none;
        }
        @keyframes rave {
            0% { filter: hue-rotate(0deg); }
            100% { filter: hue-rotate(360deg); }
        }
        @keyframes chaos {
            0% { background: red; }
            25% { background: yellow; }
            50% { background: lime; }
            75% { background: cyan; }
            100% { background: violet; }
        }
    `;
    document.head.appendChild(style);

    // ---------- オーバーレイ ----------
    const overlayRave = document.createElement('div');
    overlayRave.id = 'rave-overlay';
    document.body.appendChild(overlayRave);

    const overlayColor = document.createElement('div');
    overlayColor.id = 'color-overlay';
    document.body.appendChild(overlayColor);

    const overlayChaos = document.createElement('div');
    overlayChaos.id = 'chaos-overlay';
    document.body.appendChild(overlayChaos);

    // ---------- 歯車ボタン ----------
    const gear = document.createElement('div');
    gear.id = 'gear-button';
    gear.textContent = '⚙️';
    document.body.appendChild(gear);

    const panel = document.createElement('div');
    panel.id = 'settings-panel';
    document.body.appendChild(panel);

    gear.addEventListener('click', () => {
        panel.style.display = panel.style.display === 'none' ? 'block' : 'none';
    });

    // ---------- UI ----------
    panel.innerHTML = `
        <div class="section">
            <label><input type="checkbox" id="enable-crosshair"> Enable Crosshair</label>
            <div id="crosshair-settings" class="subpanel" style="display:none;">
                <label>Type: <select id="crosshair-type"><option>Dot</option><option>Cross</option></select></label>
                <label>Size: <input type="range" id="crosshair-size" min="4" max="40" value="10" class="slider"></label>
                <label>Color: <input type="color" id="crosshair-color" value="#ffffff"></label>
            </div>
        </div>
        <div class="section">
            <label><input type="checkbox" id="enable-color"> Enable Color Mod</label>
            <div id="color-settings" class="subpanel" style="display:none;">
                <label>Color: <input type="color" id="color-mod-color" value="#ff0000"></label>
                <label>Opacity: <input type="range" id="color-mod-opacity" min="0" max="1" step="0.01" value="0.2" class="slider"></label>
            </div>
        </div>
        <div class="section">
            <label><input type="checkbox" id="enable-rave"> RAVE Mode</label>
        </div>
        <div class="section">
            <label><input type="checkbox" id="enable-chaos"> Chaos Mode</label>
        </div>
        <div class="section">
            <label><input type="checkbox" id="enable-performance"> Performance Mode</label>
        </div>
        <div class="section">
            <label><input type="checkbox" id="enable-removefx"> Remove Effects</label>
        </div>
        <div class="section">
            <label><input type="checkbox" id="enable-adblock"> Remove ADS</label>
        </div>
    `;

    // ---------- クロスヘア描画 ----------
    const crosshairCanvas = document.createElement('canvas');
    crosshairCanvas.id = 'crosshair';
    document.body.appendChild(crosshairCanvas);
    const ctx = crosshairCanvas.getContext('2d');

    function drawCrosshair() {
        const enabled = document.getElementById('enable-crosshair').checked;
        crosshairCanvas.style.display = enabled ? 'block' : 'none';
        if (!enabled) return;

        const type = document.getElementById('crosshair-type').value;
        const size = parseInt(document.getElementById('crosshair-size').value);
        const color = document.getElementById('crosshair-color').value;

        crosshairCanvas.width = size * 2;
        crosshairCanvas.height = size * 2;
        ctx.clearRect(0, 0, crosshairCanvas.width, crosshairCanvas.height);
        ctx.strokeStyle = color;
        ctx.fillStyle = color;
        ctx.lineWidth = 2;

        if (type === 'Dot') {
            ctx.beginPath();
            ctx.arc(size, size, size / 4, 0, Math.PI * 2);
            ctx.fill();
        } else {
            ctx.beginPath();
            ctx.moveTo(size, 0);
            ctx.lineTo(size, size * 2);
            ctx.moveTo(0, size);
            ctx.lineTo(size * 2, size);
            ctx.stroke();
        }
    }

    // ---------- イベント処理 ----------
    document.getElementById('enable-crosshair').addEventListener('change', e => {
        document.getElementById('crosshair-settings').style.display = e.target.checked ? 'block' : 'none';
        drawCrosshair();
    });
    ['crosshair-type', 'crosshair-size', 'crosshair-color'].forEach(id => {
        document.getElementById(id).addEventListener('input', drawCrosshair);
    });

    document.getElementById('enable-color').addEventListener('change', e => {
        document.getElementById('color-settings').style.display = e.target.checked ? 'block' : 'none';
        overlayColor.style.display = e.target.checked ? 'block' : 'none';
    });
    document.getElementById('color-mod-color').addEventListener('input', e => {
        overlayColor.style.backgroundColor = e.target.value;
    });
    document.getElementById('color-mod-opacity').addEventListener('input', e => {
        overlayColor.style.opacity = e.target.value;
    });

    document.getElementById('enable-rave').addEventListener('change', e => {
        overlayRave.style.display = e.target.checked ? 'block' : 'none';
    });

    document.getElementById('enable-chaos').addEventListener('change', e => {
        overlayChaos.style.display = e.target.checked ? 'block' : 'none';
    });

    document.getElementById('enable-performance').addEventListener('change', e => {
        document.body.style.imageRendering = e.target.checked ? 'pixelated' : '';
    });

    document.getElementById('enable-removefx').addEventListener('change', e => {
        const particleContainers = document.querySelectorAll('[class*=particle], [class*=fx]');
        particleContainers.forEach(el => el.style.display = e.target.checked ? 'none' : '');
    });

    document.getElementById('enable-adblock').addEventListener('change', e => {
        const ads = document.querySelectorAll('iframe, .ad, [id*=ads], [class*=ads], .adsbygoogle');
        ads.forEach(ad => ad.remove());
    });

    // 初期描画
    drawCrosshair();
})();